Victron MPPT Regler mit VEdirect

Kurzer Hinweis:

Muss _veMsg. Undsoweiter heißen.

Vom Handy ist das Forum eine Qual... Rest schau ich nochmal, wenn ich verstanden habe, von was Du da sprichst.

Sorry, von was sprichst du jetzt gerade?

in #100 hab ich mich in der Variablen geirrt.
Ich habs hier berichtigt - in der nächsten Version stimmt es.

Dein Sketch ist [...]
Ich will den aber nicht hier drin besprechen - das macht den Victron Thread kaputt.
Mein Versuch das aufzuteilen ist gestern gescheitert - die Moderatoren haben sich nicht in der Lage gesehen das abzutrennen.
Empfehlung: Mach einen neuen Thread auf, um den Sketch zu optimieren.

Also, ich habe jetzt mal an meiner Anlage getestet und die Werte und die Funktion, die ich nutze schauen sehr gut aus.
Ein Problem gibt es. Der CE Wert(verbrauchte AH) kann so nicht stimmen. Wie du siehst, steigt der Wert auch an, was nicht sein darf, da die Panele gerade am Laden sind und dann muß der Wert eigentlich rückläufig sein. Die PID glaub ich stimmt beim Shunt auch nicht. Müsste was mit Axxxx rauskommen.

SHUNT
ProduktID: C038
Firmware: 0418
Spannung: 13.58V
Verbrauch CE: 4294950670AH

MPPT
ProduktID: A060
Firmware: 164
Seriennummer: HQ2423Q2KQP
Spannung: 13.58V
Strom: 0.73A
PanelSpannung: 43.26V

SHUNT
ProduktID: C038
Firmware: 0418
Spannung: 13.58V
Verbrauch CE: 4294950672AH

Das sind übrigens meine Werte. Auch sehr gut.

Der Sketch verwendet 43658 Bytes (17%) des Programmspeicherplatzes. Das Maximum sind 253952 Bytes.
Globale Variablen verwenden 2616 Bytes (31%) des dynamischen Speichers, 5576 Bytes für lokale Variablen verbleiben. Das Maximum sind 8192 Bytes.

1 Like

Doch!

Im Reiter vedirect.h findest Du das struct VE_BMV71
Dort die Variable: uint32_t CE;
mach daraus ein int32_t

Und jetzt weißt Du, wie wichtig der Hexdump ist! :winking_face_with_tongue:

Wenn mich nicht alles täuscht, hast Du noch ein drittes Gerät, was da ran muss...
Ich geh mal davon aus, dass, wenn der Code noch optimiert ist, da nicht mehr als 35% Variablenspeicher stehen.
Ich bin sehr zufrieden mit mir :grin:

Ok. ich teste dann mal wieder.
Laut Victron Doku sollen die Shunt aber auch so aussehen:

SmartShunt 500A/50mV     0xA389
SmartShunt 1000A/50mV   0xA38A
SmartShunt 2000A/50mV   0xA38B

Den 300A haben die allerdings eher selten aufgelistet.

Das lügt nicht.

Ok. Ich glaube dir ja. :slight_smile:
Das ändern in int hat nichts gebracht.

SHUNT
ProduktID: C038
Firmware: 0418
Spannung: 13.30V
Verbrauch CE: 4294951307AH

laut App müsse ein Wert von 16 gerade rauskommen. Bei CE

Der getter muss natürlich auc geändert werden.
Selber Reiter, gleich ganz oben uint32_t getBmvCe()

und schon paßt der Wert.

Also ich für meinen Teil bin zufrieden mit dem Ergebnis. Läuft nach ersten Test sehr gut.

Und wieder etwas zu früh gefreut. Beim testen ging es. Dann habe ich 3h später noch einmal geprüft und da hat er mir beim Shunt keine Werte mehr angezeigt. Arduino aus und wieder an. Half auch nicht. Laptop dran und Serial geöffnet und schon hat er wieder die Werte auch auf dem TFT angezeigt. Irgend eine Idee?
Was mir noch am Code aufgefallen ist. Gehört der mit Absicht verschieden?

void serialEvent1() {
  constexpr byte veNum {0};
  while (Serial1.available()) {
    char inchar = Serial1.read();
    veReadIn(inchar, vemsg[veNum]);
    if (vemsg[veNum].state == VE_STATE::CHECK) {
      vemsg[veNum].isEnd ?
      *temp2mppt(t_MPPT, ve_mppt) :*
*      set_tempMPPT(vemsg[veNum], ve_mppt);*
      
      initRead(vemsg[veNum]); 
      vemsg[veNum].crc = (vemsg[veNum].crc + inchar) & 0xFF;
      vemsg[veNum].idx = 0;
    }
  }
}

void serialEvent2() {
  constexpr byte veNum {1};
  while (Serial2.available()) {
    char inchar = Serial2.read();
    veReadIn(inchar, vemsg[veNum]);
    if (vemsg[veNum].state == VE_STATE::CHECK) {
      if (vemsg[veNum].isEnd)
      *{ temp2shunt(t_BMV71, ve_bmv71); }*
*      else*
*      { set_tempSHUNT(vemsg[veNum], ve_bmv71); }*
      //
      initRead(vemsg[veNum]);
      vemsg[veNum].crc = (vemsg[veNum].crc + inchar) & 0xFF;
      vemsg[veNum].idx = 0;
    }
  }
}

beim MPPT fehlt else

Nein.

Das ist das else :slight_smile:
Oder anders: Wo siehst Du ein if?

Nein.

 if (vemsg[veNum].state == VE_STATE::CHECK) {
      vemsg[veNum].isEnd ?
      *temp2mppt(t_MPPT, ve_mppt) :*
*      set_tempMPPT(vemsg[veNum], ve_mppt);*

Nochmal:

Wo siehst Du das if, für was Du ein else erwartest?

moment. Mein Fehler

 if (vemsg[veNum].state == VE_STATE::CHECK) {
      vemsg[veNum].isEnd ?
      temp2mppt(t_MPPT, ve_mppt) :
      set_tempMPPT(vemsg[veNum], ve_mppt);
if (vemsg[veNum].state == VE_STATE::CHECK) {
      if (vemsg[veNum].isEnd)
      { temp2shunt(t_BMV71, ve_bmv71); }
      else
      { set_tempSHUNT(vemsg[veNum], ve_bmv71); }```

Den Unterschied bei Serial1 und Serial2 meine ich.