PS1 PCB Review Fix
Ini
[env:esp32dev] platform = espressif32 board = esp32dev framework = arduino monitor_speed = 115200 lib_deps = knolleary/PubSubClient emelianov/modbus-esp8266 bblanchon/ArduinoJson
Cpp
#define PIN_RS485_RX 16 #define PIN_RS485_TX 17 #define PIN_RS485_DE_RE 4 #define PIN_HALL_RPM 27 #define PIN_BOOT 0 #define MODBUS_BAUD 9600 #define MQTT_PORT 8883
Cpp
#include <Arduino.h> #include <WiFi.h> #include <WiFiClientSecure.h> #include <PubSubClient.h> #include <ArduinoJson.h> #define PIN_RS485_RX 16 #define PIN_RS485_TX 17 #define PIN_RS485_DE_RE 4 #define PIN_HALL_RPM 27 #define MODBUS_BAUD 9600 const char* WIFI_SSID = "YOUR_WIFI"; const char* WIFI_PASS = "YOUR_PASSWORD"; const char* AWS_ENDPOINT = "your-endpoint-ats.iot.us-east-1.amazonaws.com"; const char* MQTT_TOPIC = "turbine/telemetry"; WiFiClientSecure net; PubSubClient mqtt(net); HardwareSerial RS485(2); volatile uint32_t hallPulses = 0; uint32_t lastSampleMs = 0; float rotorRpm = 0; void IRAM_ATTR onHallPulse() { hallPulses++; } void rs485TransmitMode(bool enable) { digitalWrite(PIN_RS485_DE_RE, enable ? HIGH : LOW); delayMicroseconds(20); } void connectWiFi() { WiFi.mode(WIFI_STA); WiFi.begin(WIFI_SSID, WIFI_PASS); while (WiFi.status() != WL_CONNECTED) delay(500); } void connectMQTT() { net.setInsecure(); // Replace with AWS root CA + device certificate for production. mqtt.setServer(AWS_ENDPOINT, 8883); while (!mqtt.connected()) { mqtt.connect("esp32-wind-turbine-monitor"); delay(500); } } float readModbusPlaceholder(uint8_t slaveId, uint16_t reg) { // TODO: replace with real Modbus RTU request/CRC/register parsing for each sensor. (void)slaveId; (void)reg; return 0.0f; } void publishTelemetry() { StaticJsonDocument<384> doc; doc["wind_speed"] = readModbusPlaceholder(1, 0x0000); doc["wind_direction"] = readModbusPlaceholder(2, 0x0000); doc["dc_voltage"] = readModbusPlaceholder(3, 0x0000); doc["dc_current"] = readModbusPlaceholder(3, 0x0001); doc["dc_power"] = readModbusPlaceholder(3, 0x0002); doc["energy_kwh"] = readModbusPlaceholder(3, 0x0003); doc["rotor_rpm"] = rotorRpm; char payload[384]; serializeJson(doc, payload); mqtt.publish(MQTT_TOPIC, payload); } void setup() { pinMode(PIN_RS485_DE_RE, OUTPUT); rs485TransmitMode(false); pinMode(PIN_HALL_RPM, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(PIN_HALL_RPM), onHallPulse, FALLING); Serial.begin(115200); RS485.begin(MODBUS_BAUD, SERIAL_8N1, PIN_RS485_RX, PIN_RS485_TX); connectWiFi(); connectMQTT(); } void loop() { if (!mqtt.connected()) connectMQTT(); mqtt.loop(); uint32_t now = millis(); if (now - lastSampleMs >= 1000) { noInterrupts(); uint32_t pulses = hallPulses; hallPulses = 0; interrupts(); // Assumes 1 pulse/revolution; change if the rotor magnet count differs. rotorRpm = pulses * 60.0f; publishTelemetry(); lastSampleMs = now; } }
net.setInsecure() with AWS IoT root CA, device certificate, and private key before deployment.PlatformIO Project
Pin Definitions
Starter Code
Bring-Up Notes