ShineLAN-X: USB-CDC Modbus vorbereitet, Modbus vorläufig deaktiviert
- Wechselrichter-Kommunikation läuft über USB-CDC (PA11=D-, PA12=D+, PA8=Pullup) - Modbus-Platzhalter bis USB-Port wieder eingelötet und getestet - USB-CDC build flags entfernt (blockieren ohne Host), werden separat aktiviert - Ethernet + MQTT läuft stabil (DHCP, HA Discovery) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -50,16 +50,13 @@
|
|||||||
#define MQTT_CLIENT "growatt-shinelan"
|
#define MQTT_CLIENT "growatt-shinelan"
|
||||||
|
|
||||||
// ============================================================
|
// ============================================================
|
||||||
// MODBUS / WECHSELRICHTER-UART
|
// MODBUS / WECHSELRICHTER-KOMMUNIKATION
|
||||||
// Growatt kommuniziert über USB-CDC (virtueller COM-Port) bei 115200 Baud —
|
// Growatt kommuniziert über USB-CDC (virtueller COM-Port) bei 115200 Baud.
|
||||||
// kein klassisches RS485, kein DE/RE-Pin nötig.
|
// STM32 agiert als USB-Device (CDC), Wechselrichter ist USB-Host.
|
||||||
// Bestätigt durch ESPHome-Configs (tx=1, rx=3, baud=115200, kein flow_control_pin).
|
// Physikalisch: PA11=D-, PA12=D+, PA8=USB-Pullup-Steuerpin
|
||||||
// Kandidat für STM32: USART3 (PB10=TX, PB11=RX) — auf Platine nachmessen!
|
// Kein RS485, kein DE/RE-Pin nötig.
|
||||||
// PA3 = Taster → USART2 (PA2/PA3) scheidet aus.
|
|
||||||
// ============================================================
|
// ============================================================
|
||||||
#define MODBUS_TX_PIN PB10 // USART3 TX — TODO: auf Platine bestätigen
|
#define MODBUS_BAUD 115200 // Growatt USB-CDC Baudrate
|
||||||
#define MODBUS_RX_PIN PB11 // USART3 RX — TODO: auf Platine bestätigen
|
|
||||||
#define MODBUS_BAUD 115200 // Growatt USB-CDC Baudrate (nicht 9600 RS485!)
|
|
||||||
#define MODBUS_ADDR 1 // Modbus Slave-Adresse des Wechselrichters
|
#define MODBUS_ADDR 1 // Modbus Slave-Adresse des Wechselrichters
|
||||||
|
|
||||||
// ============================================================
|
// ============================================================
|
||||||
|
|||||||
@@ -8,8 +8,7 @@
|
|||||||
// Debug-UART: USART1 TX=PA9, RX=PA10
|
// Debug-UART: USART1 TX=PA9, RX=PA10
|
||||||
HardwareSerial DebugSerial(PA10, PA9);
|
HardwareSerial DebugSerial(PA10, PA9);
|
||||||
|
|
||||||
// Modbus-UART: USART3 TX=PB10, RX=PB11 (Growatt USB-CDC bei 115200 Baud)
|
// Modbus über USB-CDC (SerialUSB = PA11/PA12, Wechselrichter ist USB-Host)
|
||||||
HardwareSerial ModbusSerial(MODBUS_RX_PIN, MODBUS_TX_PIN);
|
|
||||||
|
|
||||||
// ============================================================
|
// ============================================================
|
||||||
// Sensor-Definition
|
// Sensor-Definition
|
||||||
@@ -187,9 +186,9 @@ void setup() {
|
|||||||
mqtt.setServer(MQTT_BROKER, MQTT_PORT);
|
mqtt.setServer(MQTT_BROKER, MQTT_PORT);
|
||||||
mqtt.setBufferSize(768);
|
mqtt.setBufferSize(768);
|
||||||
|
|
||||||
// Modbus UART
|
// Modbus: USB-CDC (PA11/PA12) — wird aktiviert sobald Wechselrichter angeschlossen
|
||||||
ModbusSerial.begin(MODBUS_BAUD);
|
// SerialUSB.begin(MODBUS_BAUD);
|
||||||
modbus.begin(MODBUS_ADDR, ModbusSerial);
|
// modbus.begin(MODBUS_ADDR, SerialUSB);
|
||||||
|
|
||||||
DebugSerial.println("Setup done.");
|
DebugSerial.println("Setup done.");
|
||||||
}
|
}
|
||||||
@@ -222,24 +221,10 @@ void loop() {
|
|||||||
uint8_t result;
|
uint8_t result;
|
||||||
uint32_t raw = 0;
|
uint32_t raw = 0;
|
||||||
|
|
||||||
if (s.isDword) {
|
// TODO: Modbus aktivieren sobald USB-CDC (Wechselrichter) angeschlossen
|
||||||
result = modbus.readInputRegisters(s.address - 1, 2);
|
result = ModbusMaster::ku8MBSuccess; // Platzhalter
|
||||||
if (result == ModbusMaster::ku8MBSuccess)
|
raw = 0;
|
||||||
raw = ((uint32_t)modbus.getResponseBuffer(0) << 16)
|
(void)result;
|
||||||
| modbus.getResponseBuffer(1);
|
|
||||||
} else {
|
|
||||||
result = modbus.readInputRegisters(s.address - 1, 1);
|
|
||||||
if (result == ModbusMaster::ku8MBSuccess)
|
|
||||||
raw = modbus.getResponseBuffer(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result != ModbusMaster::ku8MBSuccess) {
|
|
||||||
DebugSerial.print("Modbus ERR ");
|
|
||||||
DebugSerial.print(s.id);
|
|
||||||
DebugSerial.print(" rc=");
|
|
||||||
DebugSerial.println(result, HEX);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
float value = raw * s.scale;
|
float value = raw * s.scale;
|
||||||
dtostrf(value, 1, (s.scale < 0.1f) ? 2 : 1, valueStr);
|
dtostrf(value, 1, (s.scale < 0.1f) ? 2 : 1, valueStr);
|
||||||
|
|||||||
Reference in New Issue
Block a user