Re: Tageslicht Messgerät
Verfasst: Di 27. Dez 2022, 08:08
Ich habe jetzt mal das Gerät um diese in der Schaltung aufgeführten Teile erweitert, und das Programm auch darauf erweitert. Ich habe noch nicht die richtigen Lastwiderstände und auch noch kein Panel. Das Panel muss in 1-2 Tagen kommen, die Widerstände dauern noch 14 Tage. Dann ist das Gerät nach meiner Vorstellung OK. Und ich kann die Last noch nicht regeln. Ich weiß noch nicht, ob ich die über ein Poti regle, oder über die Seriale Schnittstelle vom PC eingeben. Ich denke ich mache es Serial. Da ich ja eh mit dem PC dran hänge wenn ich die Daten jede Minute auf den PC rüber schiebe.
Hier mal das Programm:
Und das Bild von der aktuellen Serial Print Ausgabe:
.
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---------------
}
.