Seite 2 von 9

Re: MPPT Solarlader

Verfasst: Mo 26. Jun 2023, 10:06
von Admin
Hier habe ich mal einen Monitor-Ausschnitt gemacht.
.
Speicherplatz Uno Solarheizung.jpg
Speicherplatz Uno Solarheizung.jpg (272.01 KiB) 1521 mal betrachtet

Re: MPPT Solarlader

Verfasst: Mo 26. Jun 2023, 16:31
von Bernhard - Fony
Hallo,
ich mache folgendes, da ohne zu testen ob das was ich schreiben ist ja nicht optimal, nehme ich mein Krempel in Garten damit bin sicher das es funktioniert.
Mache einfachen Sketch nur zum auslesen der Daten ohne Datalog usw. gleichzeitig teste ich ob die höhere Version der Modbus Lib funktioniert mit Software Serial. Wen es funktionieren wurde brauch man dann drei freie Pins (RX, TX und DE, RE (beide auf einem Pin).
Mal schauen was rauskommt, testen werde ich das mit Nano ist ja der Gleiche MCU.
Kommst Du zu recht Menü bauen auf deinem LCD?

Bin neugierig ob wir kommen unter 70% Speicherauslastung ;) 26% ist ja schon belegt.

Grüß Bernhard
Modbus_ RJ45.png
Modbus_ RJ45.png (26.44 KiB) 1517 mal betrachtet

Re: MPPT Solarlader

Verfasst: Mo 26. Jun 2023, 17:22
von Admin
Danke dir.
Das schaut sehr gut nachvollziehbar aus. Ich werde mir zum Testen einen extra Uno mit Display nehmen, andem ich noch richtig arbeiten kann. Der von der Poolheizung ist ja total eingebaut. Da baue ich das erst ein, wenn es im Testaufbau funktioniert.

Ich sitzen mit meinem Zeug auch schon im Garten, mit nem Laptop.

Re: MPPT Solarlader

Verfasst: Mo 26. Jun 2023, 17:57
von Bernhard - Fony
Ich sitzen mit meinem Zeug auch schon im Garten, mit nem Laptop.
Schön mein Garten ist 3 Km weit :lol:
Habe einen so genannten Schrebergarten.
Ok dann mach ich das für 2004 LCD, wahrscheinlich mit einem Taster zum umschalten vom Menü, alles passt nicht drauf, oder willst nur
PV Volt, PV Amper, PV Wat
Akku Volt, Akku Ladestrom, Akku zustand in %
Zur Zeit Verbrauch in Amper und Wat
Der Tracer speichert, kann anzeigen in KWh verbrauchte
Momentan, Tages, Monat, Jahr Leistung, genau müsste schauen in Protokoll ob der speichert gesamte Leistung für längere zeit als Jahr.

Mir ist nicht gelungen genaue Uhrzeit mit Datum eistellen deshalb habe mir gekauft USB zu RS495 Kabel für denen, womit ich kann die Uhrzeit korrigieren.
Die Original Tracer Software ist ziemlich arm zeigt nicht alles was er kann, dafür wollen die ein zusatz Display verkaufen.



Gruß Bernhard

Re: MPPT Solarlader

Verfasst: Mo 26. Jun 2023, 18:33
von Admin
Bernhard - Fony hat geschrieben: Mo 26. Jun 2023, 17:57 ..... oder willst nur PV Volt, PV Amper, PV Wat, Akku Volt, Akku Ladestrom, Akku zustand in %
Zur Zeit Verbrauch in Amper und Wat
Der Tracer speichert, kann anzeigen in KWh verbrauchte Momentan.
Danke dir.
Ich brauch eigentlich nur Daten, von denen ich ableiten kann, dass ich die Batterie nicht zu sehr strapazieren sollte, weil sonst nix mehr geht. Also was bringen die Panels aktuell, wie ist der Ladezustand der Batterie. Das ist eigentlich schon alles. Dass ich mit dem Verbrauch langsam machen kann, bevor nichts mehr geht. An tagen wo keine Sonne ist, werde ich eh keine Chance haben, weil ja dann die Solar-Wassertaschen am Dach auch nicht wärmer werden als der Pool. Dann bleibt die Pumpe eh aus. Also ich werde die Batterie nur in kurzen Sonnenunterbrechungen durch kleinere Wolken benötigen. An bewölkten Tage habe ich eh keine Strom Anforderungen.

Die 2 x RS-485 (MAX485) TTL Schnittstellen Adapter habe ich vorher gerade bestellt, werden also in ein paar Tage da sein.

Franz

Re: MPPT Solarlader

Verfasst: Mo 26. Jun 2023, 19:38
von Bernhard - Fony
Ich versuche das so machen das Du nimmst was willst, im Grunde genommen ist das nicht so schwer
es läuft nach dem Prinzip

Code: Alles auswählen

 result = node.readInputRegisters(0x3100, 16);
    if (result == node.ku8MBSuccess) { //PV Daten
      float pvv = node.getResponseBuffer(0x00) / 100.0f; //Tracer PV Volt
      
wenn man in das Protokoll schaut der Register 3100 hat 16 Parameter, die werden erstmal im Buffer festgehalten, und man Pickt sie aus, hier der wert vom 0x00.
das komische dabei ist es werden mehre If gebraucht für jeden Register Satz einen . Habe versucht alles auf einen rutsch ---> geht nicht
den um zB. Batterie bearbeiten sitzen die Parameter im anderem Register

Code: Alles auswählen

"Battery voltage 331A Battery voltage V 100"
damit ist es 794 Byte weiter
also ist kleine vierstufige if Orgie, na ja was soll's ;) Hauptsache tut es
Der Speicher am Uno ist zu klein um alles auf ein mall auslesen, ich musste die Rosinen schön einzeln Picken :lol:

Bernhard

Re: MPPT Solarlader

Verfasst: Mo 26. Jun 2023, 20:00
von Admin
OK, ich kapiere gerade noch gar nichts.

Da muss es doch irgendwo Unterlagen dazu gegen. Oder Testprogramme. Ich bin im Moment noch an der Optimierung meines Programmes für die Pool-Solarheizung.
Die Kommunikation mit dem MPPT Regler ist dann der nächste Teil. :)

Ich bin gespannt wie diese Abfragen laufen.

Servus
Franz

Re: MPPT Solarlader

Verfasst: Mo 26. Jun 2023, 20:19
von Bernhard - Fony
Da muss es doch irgendwo Unterlagen dazu gegen. Oder Testprogramme.
Ja, aber nicht für Arduino, mir hat es beigebracht Werner @noiasca aus Arduino Forum.
Unterlage habe ich.
Leider kann ich kein PDF anhängen.
Habe Dir das per PM in anderem Forum gesendet.

Gruß Bernhard

Re: MPPT Solarlader

Verfasst: Di 27. Jun 2023, 10:04
von Bernhard - Fony
Hallo,
gute Nachricht ;) Die neue Modbuss Lib funktioniert mit Software Serial

Code: Alles auswählen

Panel 23.36V  2.21A  51W
Akku 13.74V 3.76A 97%
Panel 23.37V  2.22A  51W
Akku 13.74V 3.78A 97%
Den Sketsch gebe ich später, muss noch Ordnung machen den getestet und geschrieben für ein 1602 Display, im Garten.
So jetzt zurück nach Hause ;)


Test_garten.png
Test_garten.png (749.36 KiB) 1496 mal betrachtet

Re: MPPT Solarlader

Verfasst: Di 27. Jun 2023, 14:22
von Bernhard - Fony
Den Sketch habe angepasst an 2004 LCD, wirst wahrscheinlich machen nach deinem Empfinden
Diese Lib wurde benutzt
https://github.com/4-20ma/ModbusMaster

Code: Alles auswählen

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C LCD(0x27, 20, 4);
 
/*************************************
   Für Uno wird SoftwareSerial benutzt
**************************************/
#include <SoftwareSerial.h>
SoftwareSerial tracerSerial(4, 5); // RO, DI  Pins drehen wenn nicht funktioniert

/**********************************************
    Ich verwende  einen MAX485-kompatiblen RS485-Transceiver.
  Rx/Tx ist mit der seriellen Schnittstelle der Hardware an "Serial" verbunden.
  Die Pins "Data Enable" und "Rec3eiver Enable" sind wie folgt beschaltet:
 ********************************************************/
#include <ModbusMaster.h>

#define MAX485_DE      3 // DE und RE dürfen am einen Pin hängen 
#define MAX485_RE_NEG  3

// instantiate ModbusMaster object
ModbusMaster node;

void preTransmission()
{
  digitalWrite(MAX485_RE_NEG, 1);
  digitalWrite(MAX485_DE, 1);
}

void postTransmission()
{
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);
}
unsigned long previousMillis = 0;
const long intervall = 2000;// Daten werden alle 2Sek ausgelesen

void setup() {
  Serial.begin(115200); 
  tracerSerial.begin(115200); // Modbus Kommunikation mit 115200 Baud
  
 

  pinMode(MAX485_RE_NEG, OUTPUT);
  pinMode(MAX485_DE, OUTPUT);
  digitalWrite(MAX485_RE_NEG, 0);// Init in receive mode
  digitalWrite(MAX485_DE, 0);


  // Tracer xxxxAN Modbus slave ID 1
  node.begin(1, tracerSerial);  // Begin der Verbindung mit Tracer
  // Callbacks allow us to configure the RS485 transceiver correctly
  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);
  
   LCD.init();// Je nach benutzter Lib
  //LCD.begin();
   LCD.backlight();

}

void loop()
{
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= intervall)
  {
    previousMillis = currentMillis; // Zeitpunkt der letzten Schaltung wird festgehalten
    LCD.setCursor(0, 0);
    LCD.print(F("PV= "));
    // Read 16 registers beginn mit Adresse  0x3100)
    uint8_t result;
    result = node.readInputRegisters(0x3100, 16);
    if (result == node.ku8MBSuccess)
    { //PV Daten
      float pvv = node.getResponseBuffer(0x00) / 100.0f; //Tracer PV Volt
      if (pvv <= 10) {
        LCD.print(F(" "));
        LCD.print(pvv, 1);
      }
      if (pvv < 10)LCD.print(" ");
      LCD.print(pvv, 1);
      LCD.print(F("V "));
      Serial.print("Panel ");

      Serial.print(pvv);
      Serial.print("V  ");
      float pva = node.getResponseBuffer(0x01) / 100.0f;//PV Ampere
      LCD.print(F(" "));
      LCD.print(pva, 1);
      LCD.print(F("A  "));

      Serial.print(pva);
      Serial.print ("A  ");
      //PV Leistung
      float pvwat = ((node.getResponseBuffer(0x06) +  node.getResponseBuffer(0x07) ) / 100.0f); //PV Watt
      if (pvwat < 100) LCD.print(" ");//1x Space
      if (pvwat < 10) LCD.print("  ");//2x Space
      LCD.print(F(" "));
      LCD.print(pvwat);
      Serial.print(pvwat);
      Serial.println("W");
      LCD.print(F("  "));
      LCD.print(pvwat);
      LCD.println(F("W"));

      /*****  Akkustand Anzeigen  *****/
      LCD.setCursor(0, 1);//Akkustand Anzeigen
      LCD.print(F("Ak= "));
      float akkuVolt = node.getResponseBuffer(0x04) / 100.0f; //Tracer Akku Volt
      if (akkuVolt <= 10) LCD.print(F(" "));
      LCD.print(akkuVolt, 1);
      LCD.print(F("V "));
      Serial.print("Akku ");
      Serial.print(akkuVolt);
      Serial.print ("V ");

      float akkuAmpere = node.getResponseBuffer(0x05) / 100.0f;//Akku Ladedaten in Ampere
      if (akkuAmpere <= 10) LCD.print(F(" "));
      LCD.print(akkuAmpere, 1);
      LCD.setCursor(14, 1);
      LCD.print(F("A"));
      Serial.print(akkuAmpere);
      Serial.print("A ");
    }
    result = node.readInputRegisters(0x311A , 1);//Akkukapazität in Prozent
    if (result == node.ku8MBSuccess) {
      LCD.setCursor (16, 1);
      int prozent = node.getResponseBuffer(0x00);
      if (prozent < 100)
      {
        LCD.print(F("  "));
        LCD.print(prozent);
        Serial.print(prozent);
        Serial.println ("%");
      }
      else
      {
        LCD.setCursor (16, 1);
        LCD.print(prozent);
      }
      LCD.setCursor (19, 3);
      LCD.println(F("%"));
    }
  }
}


Gruß Bernhard