Heute möchte ich Euch mein Projekt vorstellen.
Die Aufgabe:
Ich betreibe einen Deye mit Akku, und der hat die schlechte Angewohnheit sich,
wenn kein PV und Akku leer, nicht abzuschalten.
Er verbraucht dabei ständig 110 Watt. Wenn ich ihn vom Netz trenne,
entlädt er gnadenlos den Akku bis auf Null,
was er laut den internen Einstellungen gar nicht dürfte
.
Also muß ein externer Schalter her.
Der Wechselrichter:
Der Wechselrichter ist ein Deye SUN-10K-SG04LP3-EU (Firmware 1128).
Einstellungen im Menü "Advanced Funktion / Seite3:
Der Anschluß Modebus an der Netzwerkbuchse "Modebus Port" erfolgt
mit einem normalen Netzwerkkabel(Patchkabel).
Es wird nur Pin 1 (485_B // weiß/orange) und Pin 2 (485_A // orange) benötigt
(siehe Handbuch ).
Modebus RTU Test:
Zum Testen, ob der Zugriff auf den Wechselrichter funktioniert,
habe ich mein altes Laptop(Win7) über einen USB zu RS485 Stick verbunden.
Das Auslesen der Register hat schon mal gut geklappt (Funktionscode 3),
das Schreiben ging nur mit der Software "Modebuspoll" (Funktionscode 10).
Hier eine Warnung: Beim Schreiben in die Register müßt ihr umsichtig vorgehen,
das Gerät kann bei falschen Einstellungen Schaden nehmen, also erst mal
an einem unwichtigen Register probieren.
In Register 60 habe ich dann die Abschaltfunktion gefunden (Fernsperre),
Wert 0 - Gerät Ein // Wert 2 - Gerät gesperrt
Wenn der Deye gesperrt ist, läuft die interne Stromversorgung weiter, es stehen
noch alle internen Meßwerte zu Verfügung und das Display geht auch noch.
Leistungsaufnahme dann 28 Watt.
Stromversorgung:
Auf dem Deye habe ich einen temperaturgesteuerten Lüfter,
der notwendig war, weil der interne Lüfter des Deye lauter als mein Staubsauger ist
.
Aus dessen Netzteil (12 Volt) versorge ich den Arduino.
Bauteile:
- Arduino Nano V.3
- Spannungswandler 12 Volt - 5 Volt
- TTL zu RS485 Adapter ( Anschlüsse A,B Modebus)
( RX habe ich beim Arduino am PIN 5, TX am PIN 6 angeschlossen) - Relaisbaustein (schaltet den Lüfter aus, Anschluß Arduino PIN 3)
Funktion:
Der Arduino ließt den SOC des Akkus und die Spannung des Photovoltaikstrings aus.
Sind beide niedrig, schaltet der Arduino ab. Steigt die Spannung am String wieder an, schaltet er wieder ein.
#include <ModbusMaster.h>
#include <SoftwareSerial.h>
uint16_t Fernabschaltung = 0; // Variablen
uint16_t Batterieniedrig = 0;
uint16_t SOC = 0;
uint16_t PV = 0;
ModbusMaster node;
SoftwareSerial RS485Serial(5, 6); // RX, TX
void preTransmission()
{
digitalWrite(A2, 1);
}
void postTransmission()
{
digitalWrite(A2, 0);
}
void setup() {
pinMode(A2, OUTPUT);
digitalWrite(A2, 0);
pinMode(3, OUTPUT);
digitalWrite(3, HIGH);
Serial.begin(9600);
RS485Serial.begin(9600);
node.begin(1, RS485Serial);
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
}
void loop()
{
uint8_t j, result;
uint16_t data[10];
result = node.readHoldingRegisters(60, 1); //Register auslesen und in Variable übertragen
if (result == node.ku8MBSuccess)
{
Fernabschaltung = (node.getResponseBuffer(0));
}
result = node.readHoldingRegisters(117, 1);
if (result == node.ku8MBSuccess)
{
Batterieniedrig = (node.getResponseBuffer(0));
}
result = node.readHoldingRegisters(588, 1);
if (result == node.ku8MBSuccess)
{
SOC = (node.getResponseBuffer(0));
}
result = node.readHoldingRegisters(676, 1);
if (result == node.ku8MBSuccess)
{
PV = (node.getResponseBuffer(0));
}
if (SOC <= Batterieniedrig && PV <= 1000 && Fernabschaltung == 0)
{
node.setTransmitBuffer(0, lowWord(2)); //Auswertelogik und Schreiben
result = node.writeMultipleRegisters(60, 1); // 0=Ein / 2= Aus
digitalWrite(3, LOW);
}
if (PV >= 4500 && Fernabschaltung == 2)
{
node.setTransmitBuffer(0, lowWord(0)); // Wert in Puffer schreiben
result = node.writeMultipleRegisters(60, 1); // Puffer senden
digitalWrite(3, HIGH);
}
Serial.println("Fernzugriff:"); //Kontrolle
Serial.println(Fernabschaltung);
Serial.println("Batterieniedrig:");
Serial.println(Batterieniedrig);
Serial.println("SOC:");
Serial.println(SOC);
Serial.println("Solar:");
Serial.println(PV);
delay(60000);
}

