Re: MPPT Solarlader
Verfasst: Mo 26. Jun 2023, 10:06
Hier habe ich mal einen Monitor-Ausschnitt gemacht.
.
.
Forum zur gegenseitigen Hilfe für Hobby´s, Spass und Technik, im Raum Penzberg, Garmisch, Bad Tölz, Seeshaupt
https://www.franzls-technik-forum.de/
Schön mein Garten ist 3 Km weitIch sitzen mit meinem Zeug auch schon im Garten, mit nem Laptop.
Danke dir.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.
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
Code: Alles auswählen
"Battery voltage 331A Battery voltage V 100"
Ja, aber nicht für Arduino, mir hat es beigebracht Werner @noiasca aus Arduino Forum.Da muss es doch irgendwo Unterlagen dazu gegen. Oder Testprogramme.
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%
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("%"));
}
}
}