Hier mal das 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
Version 2.0 vom 26.12.2022
*/
//##############################################################
#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; // Messabstand 1 Sekunde
const unsigned long pausezeit2 = 60000;
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, 0); // Zeile 1
lcd.print (F("Pa="));
lcd.setCursor (8, 0); // Zeile 1
lcd.print (F("/"));
lcd.setCursor (0, 1);
lcd.print (F("Licht="));
lcd.setCursor (10, 1);
lcd.print (F("/SePr=0"));
lcd.setCursor (0, 2);
lcd.print (F("--------------------"));
lcd.setCursor (0, 3);
lcd.print (F("1="));
lcd.setCursor (11, 3);
lcd.print (F("2="));
//----------------------------------------------------
sekundenablauf1 = millis();
sekundenablauf2 = 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 * 35.1 / 1024.0;
lcd.setCursor (3, 0);
lcd.print (F(" "));
lcd.setCursor(3, 0);
lcd.print(panelspannung);
ampereSensor = analogRead(ampereMeter);
lcd.setCursor (9, 0);
lcd.print (F(" "));
lcd.setCursor(9, 0);
panelStrom = (ampereSensor - 510) * 0.047;
lcd.print(panelStrom);
analogWrite (pwmPort, 255);
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 (6, 1);
lcd.print (F(" "));
lcd.setCursor (6, 1);
lcd.print (Messung1);
lcd.setCursor (2, 3);
lcd.print (F(" "));
lcd.setCursor (2, 3);
lcd.print (ads_mv0);
lcd.setCursor (13, 3);
lcd.print (F(" "));
lcd.setCursor (13, 3);
lcd.print (ads_mv1);
sekundenablauf1 = millis();
}
//-------Serial-Datenausgabe-------------------------
if (SerielleAusgabe == HIGH)
{
if (aktuellzeit - sekundenablauf2 >= pausezeit2) // Eine Minute abgelaufen?
{
if (printzaehler < 9999)
{
printzaehler++;
}
lcd.setCursor (16, 1);
lcd.print (F(" "));
lcd.setCursor (16, 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.println(panelStrom);
sekundenablauf2 = millis();
}
}
//---------------Schalter abfragen-------------------
//Schalter bestimmt ob Daten serial ausgegeben werden
schalterstatus = digitalRead(schalter);
if (schalterstatus == LOW)
{
SerielleAusgabe = HIGH;
}
else
{
SerielleAusgabe = LOW;
printzaehler = 0;
}
//---------------------------LOOP Ende---------------
}
.