
Oder ich kann auch jederzeit anstelle der Lastwiderstände einen Solar-Laderegler mit einer Batterie, oder nur eine Batterie, als Last anstecken. Dann habe ich Echtbedinungen fürs Solarpanel und kann Strom, Spannung, Leistung vom Panel kontrollieren.
Im Bild sieht man das Gerät, auf dessen Display in der ersten Zeile die aktuellen Werte für Spannung, Strom, Leistung angezeigt werden. In der zweiten Zeile sieht man wieviele Datensätze bereits Serial übertragen wurde (jede Minute ein Datensatz), und die ermittelte Lichtstärke. In der unteren Zeile sieht man die Messwerte der beiden Lichtsensoren, aus denen ein gemeinsammer Wert entsteht, der ja in der Zeile 2 gezeigt wird.
. Hier habe ich noch das aktuelle Programm:
Code: Alles auswählen
//##############################################################
/*
Messteiler für Panelspannung erhöht, dass bis 35 Volt OK ist
Strommessung und Lastwiderstand eingebaut
PWM Spannungsregler zur Lastreglung eingebaut
Last wird immer nur kurz für Protokoll Übertragung zugeschalten
Version 2.0 vom 04.01.2023
*/
//##############################################################
#include <LiquidCrystal_I2C.h>
// Display Adresse 0x3F 0der 0x27
LiquidCrystal_I2C lcd(0x27, 20, 4);
#include <Adafruit_ADS1X15.h> // bindet Wire.h für I2C mit ein
Adafruit_ADS1115 ads;
#define ADS_I2C_ADDR 0x48
//------------------------------------------------------
const float multiplier = 0.125F; // ADS1115-Multiplikator bei einf. Verstärkung
float ads_mv0 = 0; // Sensor rechts
float ads_mv1 = 0; // Sensor links
int adc0 = 0;
int adc1 = 0;
int Messung1 = 0;
int Messung2 = 0;
byte Status = 0;
unsigned long sekundenablauf1 = 0; // Messabstand 1 Sekunde
const unsigned long pausezeit1 = 1000;
unsigned long sekundenablauf2 = 0; // 60Sek. für Serial.print
const unsigned long pausezeit2 = 60000;
unsigned long sekundenablauf3 = 0; // 55Sek. für Lastzuschaltung
const unsigned long pausezeit3 = 55000;
unsigned long aktuellzeit = 0;
const byte pwmPort = 6;
const byte ampereMeter = A1;
int ampereSensor = 0;
float panelStrom = 0;
float lastwatt = 0;
const byte schalter = 9;
byte schalterstatus = 0;
byte SerielleAusgabe = 0;
int printzaehler = 0;
//-----------------------Panel-Messung-----------------
const byte panel = A0;
int panelwert = 0;
float panelspannung = 0;
//==============================================================
//=========================SETUP================================
//==============================================================
void setup() {
//----------------------------------------------------
lcd.begin();
lcd.backlight();
lcd.clear();
//----------------------------------------------------
Serial.begin(9600);
//-------------------Schalter / Taster----------------
pinMode(schalter, INPUT_PULLUP);
pinMode(panel, INPUT); // Spannung vom Panel
pinMode(pwmPort, OUTPUT); // Stromregler
pinMode(ampereMeter, INPUT); // Strommesser
//----------------------------------------------------
ads.begin(ADS_I2C_ADDR, &Wire);
// Werte 1-fach verstärken (ESP32 liefert max. 3,3V)
ads.setGain(GAIN_ONE);
//----------------------------------------------------
lcd.setCursor (0, 1);
lcd.print (F("Ser="));
lcd.setCursor (0, 2);
lcd.print (F("--------------------"));
//----------------------------------------------------
sekundenablauf1 = millis();
sekundenablauf2 = millis();
sekundenablauf3 = millis();
//----------------------------------------------------
}
//==============================================================
//=========================LOOP=================================
//==============================================================
void loop() {
aktuellzeit = millis();
//Jede Sekunde Spannung am Panel messen
if (aktuellzeit - sekundenablauf1 >= pausezeit1) // Eine Sekunde abgelaufen?
{
//----------------Panel_Messung----------------------
panelwert = analogRead(panel);
panelspannung = panelwert * 34.1 / 1024.0;
lcd.setCursor (0, 0);
lcd.print (F("V "));
lcd.setCursor(1, 0);
lcd.print(panelspannung);
ampereSensor = analogRead(ampereMeter);
lcd.setCursor (7, 0);
lcd.print (F("A "));
lcd.setCursor(8, 0);
panelStrom = (ampereSensor - 510) * 0.047;
lcd.print(panelStrom);
lcd.setCursor (14, 0);
lcd.print (F("W "));
lcd.setCursor(15, 0);
lastwatt = panelspannung * panelStrom;
lcd.print(lastwatt);
// -----Kanal 0 Messung------------------------------
adc0 = ads.readADC_SingleEnded(0);
ads_mv0 = ads.computeVolts(adc0) * 1000;
// -----Kanal 1 Messung------------------------------
adc1 = ads.readADC_SingleEnded(1);
ads_mv1 = ads.computeVolts(adc1) * 1000;
Messung1 = ads_mv0 + ads_mv1; //
//---------------Display alle Anzeigen---------------
lcd.setCursor (9, 1);
lcd.print (F("Licht= "));
lcd.setCursor (15, 1);
lcd.print (Messung1);
lcd.setCursor (0, 3);
lcd.print (F("L1= "));
lcd.setCursor (3, 3);
lcd.print (ads_mv0);
lcd.setCursor (11, 3);
lcd.print (F("2= "));
lcd.setCursor (13, 3);
lcd.print (ads_mv1);
sekundenablauf1 = millis();
}
//----------Last Zuschaltung-------------------------
if (aktuellzeit - sekundenablauf3 >= pausezeit3) // 55 Sekunden abgelaufen?
{
digitalWrite (pwmPort, HIGH);
}
//-------Serial-Datenausgabe-------------------------
if (SerielleAusgabe == HIGH)
{
if (aktuellzeit - sekundenablauf2 >= pausezeit2) // Eine Minute abgelaufen?
{
if (printzaehler < 9999)
{
printzaehler++;
}
lcd.setCursor (4, 1);
lcd.print (F(" "));
lcd.setCursor (4, 1);
lcd.print (printzaehler);
Serial.print(F("SonnenSensor="));
Serial.print(ads_mv1);
Serial.print(F(" DunkelSensor="));
Serial.print(ads_mv0);
Serial.print(F(" Summe-Licht="));
Serial.print(Messung1);
Serial.print(F(" Zaehler="));
Serial.print(printzaehler);
Serial.print(" / ");
Serial.print(F(" PanelSpannung="));
Serial.print(panelspannung);
Serial.print(F(" PanelStrom="));
Serial.print(panelStrom);
Serial.print(F(" Leistung="));
Serial.println(lastwatt);
digitalWrite (pwmPort, LOW);
sekundenablauf2 = millis();
sekundenablauf3 = millis();
}
}
//---------------Schalter abfragen-------------------
//Schalter bestimmt ob Daten serial ausgegeben werden
schalterstatus = digitalRead(schalter);
if (schalterstatus == LOW)
{
SerielleAusgabe = HIGH;
}
else
{
SerielleAusgabe = LOW;
printzaehler = 0;
digitalWrite (pwmPort, HIGH);
}
//---------------------------LOOP Ende---------------
}
.