Aus "purer Not" heraus
habe ich dieses Projektchen gestartet:
VE.Direct Aggregator
Firmware für Arduino Mega 2560, o.ä.
Der VE.Direct Aggregator ist eine Firmware für den Arduino Mega 2560, die mehrere Victron MPPT-Solarladeregler über ihre serielle VE.Direct-Schnittstelle einliest und die Datenströme zu einem einzigen seriellen Ausgang zusammenführt. Statt mehrerer separater serieller Verbindungen zum Auswertesystem genügt eine einzige.
Funktionen
Mehrkanal-Eingang
Drei Hardware-UARTs des Mega (Serial1, Serial2, Serial3) werden gleichzeitig abgefragt. Jeder Kanal puffert seinen Datenstrom unabhängig — ein langsamer oder zeitweise fehlender Regler blockiert die anderen nicht.
Automatische Port-Typerkennung
Beim Start liest die Firmware die ersten eintreffenden Zeichen auf jedem Port und entscheidet einmalig, ob ein direkter MPPT-Regler oder ein vorgelagerter Aggregator angeschlossen ist. Eine manuelle Konfiguration ist nicht erforderlich.
Port empfängt "---\t..." → UPSTREAM (vorgelagerter Aggregator)
Port empfängt "PID\t..." → DIRECT (direkter MPPT-Regler)
Nach der Erkennung bleibt der Typ für die gesamte Laufzeit fest. Topologieänderungen erfordern einen Neustart.
Serieller Ausgang
Alle gepufferten Blöcke werden sequenziell über Serial0 TX (Pin 1) ausgegeben. Da immer nur ein Block auf einmal gesendet wird, gibt es keine Kollisionen.
Kaskadierfähigkeit
Durch die automatische Typerkennung können mehrere Aggregatoren in Stern- oder Kaskadenform verbunden werden, ohne dass der Code angepasst werden muss.
Unterstützte Topologien
Direkt — bis zu 3 Regler an 1 Mega
MPPT 1 ─TX──► [Mega] RX1
MPPT 2 ─TX──► [Mega] RX2 ──► TX0 ──► Ausgang
MPPT 3 ─TX──► [Mega] RX3
Stern — bis zu 9 Regler, 3 Megas an 1 zentralen Mega
MPPT 1─3 ──► [Mega 1] ──TTL──┐
MPPT 4─6 ──► [Mega 2] ──TTL──┼──► [Mega 4] ──► Ausgang
MPPT 7─9 ──► [Mega 3] ──TTL──┘
Mega 1–3 sitzen nah bei ihren Reglern. Mega 4 führt die drei kurzen TTL-Verbindungen zu einem einzigen seriellen Ausgang zusammen.
Kaskade — bis zu 9 Regler, 3 Stufen hintereinander
MPPT 1─3 ──► [Mega 1] ──► [Mega 2] ──► [Mega 3] ──► Ausgang
3 Blöcke 6 Blöcke 9 Blöcke
Ausgangsformat
Vor jedem Paket wird ein Marker gesendet, der die Anzahl der enthaltenen VE.Direct-Blöcke angibt:
---\tN\r\n ← Marker: N Blöcke folgen
PID\t0xA053\r\n ┐
VPV\t18240\r\n │ Block 1 (Regler 1)
PPV\t120\r\n │
...\r\n │
Checksum\tX\r\n │
\r\n ┘
PID\t0xA060\r\n ┐
... │ Block 2 (Regler 2)
\r\n ┘
Jeder VE.Direct-Block endet mit \r\n\r\n — zwei aufeinanderfolgende \n signalisieren das Blockende.
Der Marker ---\tN ist kein VE.Direct-Feld. Standard-VE.Direct-Parser ignorieren ihn im else: pass-Zweig ohne Fehler.
Timing-Budget bei 19200 Baud
VE.Direct sendet einmal pro Sekunde. Ein typischer Block (~200 Bytes) belegt ~83 ms Übertragungszeit.
| Regler | Übertragungszeit | Auslastung | Puffer |
|---|---|---|---|
| 1 | ~83 ms | 8 % | 917 ms |
| 3 | ~249 ms | 25 % | 751 ms |
| 6 | ~498 ms | 50 % | 502 ms |
| 9 | ~747 ms | 75 % | 253 ms |
| 12 | ~996 ms | ~100 % |
— |
Bei 12 Reglern und 19200 Baud wird das 1-Sekunden-Fenster vollständig ausgeschöpft. Die praktische Grenze liegt bei 9 Reglern, was einem komfortablen Puffer von 25 % entspricht.
Pinbelegung Arduino Mega 2560
| Pin | Signal | Beschreibung |
|---|---|---|
| RX1 (19) | Regler / Upstream 1 TX | Serial1 — Hardware UART |
| RX2 (17) | Regler / Upstream 2 TX | Serial2 — Hardware UART |
| RX3 (15) | Regler / Upstream 3 TX | Serial3 — Hardware UART |
| TX0 (1) | Ausgang | Serial0 — aggregierter Stream |
| GND | Masse alle Eingänge | gemeinsame Masse |
| 5V | Versorgung | von VE.Direct Pin 4 |
VE.Direct verwendet 5V TTL — direkt kompatibel mit dem Arduino Mega. Kein Pegelwandler erforderlich. Die 5V-Versorgung (max. 100 mA) von einem der Regler reicht für den Mega.
VE.Direct Steckerbelegung (JST-PH 2 mm, 4-polig)
| Pin | Signal | Verwendung |
|---|---|---|
| 1 | GND | an Mega GND |
| 2 | TX (Ausgang) | an Mega RX1/2/3 |
| 3 | RX (Eingang) | nicht belegt |
| 4 | +5V | Versorgung Mega |
Puffergröße
| Eingangstyp | Puffergröße | Kapazität |
|---|---|---|
| DIRECT | 512 Bytes | 1 VE.Direct-Block |
| UPSTREAM | 2048 Bytes | bis ~9 Blöcke (Kaskade) |
Technische Daten
| Parameter | Wert |
|---|---|
| Zielplattform | Arduino Mega 2560 (ATmega2560, 16 MHz) |
| Baudrate Eingänge | 19200 Baud, 8N1 |
| Baudrate Ausgang | 19200 Baud, 8N1 |
| Max. Eingänge | 3 × Hardware-UART |
| Max. Regler (Direkt) | 3 |
| Max. Regler (Stern) | 9 |
| Max. Regler (Kaskade) | 9 |
| Typerkennung | automatisch, einmalig beim Start |
| Stromversorgung | 5V von VE.Direct Pin 4 |
| CPU-Auslastung | < 1 % bei 3 Reglern |
| Latenz | < 1 Block-Periode (~83 ms) |
Benötigte Hardware
| Bauteil | Hinweis |
|---|---|
| Arduino Mega 2560 Clone | z.B. Elegoo, ~10–20 € |
| JST-PH 2 mm Kabel | 4-polig, für VE.Direct-Anschlüsse |
Einschränkungen
- Topologieänderungen erfordern Neustart aller betroffenen Megas
- Bei Kaskade muss der letzte Mega Serial0 ausschließlich als Ausgang nutzen — kein Debug über USB während des Betriebs
- Baudrate auf allen Stufen identisch (19200 Baud)
- VE.Direct-Protokoll Text-Modus only — HEX-Modus wird nicht unterstützt
und womit auslesen?
Soweit also die Theorie, wenn ichs getestet haben, lasse ichs euch wissen.
Die Integration in GitHub - E-t0m/zeroinput: Set power input to zero with gti inverter and charge controller. · GitHub ist obligatorisch. ![]()