Re: Die Position der Sonne mit Sensoren bestimmen
Verfasst: So 13. Nov 2022, 10:35
Ich mache mir demnächst mal ein kleines Messgerät, mit dem ich die Lichtstärke indentisch zu meinem "Sonnen-Verfolger" messen kann. Also auch mit den beiden Sensoren, einer hell, einer Abgedunkelt mit drei Lagen 100gr. Papier. Da möchte ich dann aber zweierlei Messergebnisse benutzen. Meinen Messwert hier für das SonnenVerfolger-Gerät, und den echten LumenWert, den die Lichtmessgeräte ausgeben. Bei dem Gerät, das ich mal hatte, musste man an einem Sensor drei "Fenster" davor schieben. Reines Glas, Milchglas, und wohl besonders Licht-Undurchlässiges Milchglas. Ersatzweise dafür benutze ich ja die drei Lagen Papier.
Und ein brauchbares Solarpanel möchte ich mir auch mal besorgen, um damit testen zu können. Das sollte man dann auch an dem Testgerät anschießen können, um erzielte Spannungs- und Stromwerte am Messgerät darstellen zu können. Ich hätte ja nichts dagegen, auch mal ein paar Euro mit meiner Technik verdienen zu können, dann muss ich aber auch wissen, was ich tue. Da ist Halbwissen nicht soooo gefragt.
Franz
PS: Ich habe noch ein paar Änderungen am Programm gemacht. Wegen der ewigen Zappelei im Display. Kommastellen weg und Anzeige nur ändern wenn sich der Wert +/- 2 ändert. Weil das Schreiben am Display ja auch die meiste Programmzeit verbraucht. Jetzt ist es recht ruhig am Display. Und ich habe werend der Einstellfahrt auch die Änderungen der Panal - Spannungsanzeige im Display verhindert. Also die Änderungen im Display sind Zeitlich ein Nebengeräusch in Programm. Hier das aktuelle Programm:


Franz
PS: Ich habe noch ein paar Änderungen am Programm gemacht. Wegen der ewigen Zappelei im Display. Kommastellen weg und Anzeige nur ändern wenn sich der Wert +/- 2 ändert. Weil das Schreiben am Display ja auch die meiste Programmzeit verbraucht. Jetzt ist es recht ruhig am Display. Und ich habe werend der Einstellfahrt auch die Änderungen der Panal - Spannungsanzeige im Display verhindert. Also die Änderungen im Display sind Zeitlich ein Nebengeräusch in Programm. Hier das aktuelle Programm:
Code: Alles auswählen
#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;
Adafruit_ADS1115 ads2;
#define ADS_I2C_ADDR 0x48
#define ADS_I2C_ADDR2 0x49
//------------------------------------------------------
#include <MobaTools.h>
int Rampe = 0;
const int STEPS_REVOLUTION = 6400; //Schritte pro Umdrehung Treibereinstellung
//Stepper einrichten ( 6400 Schritte / Umdrehung - 1/4 Microstep )
MoToStepper myStepper1( STEPS_REVOLUTION, STEPDIR ); // 6400 Steps/ Umdrehung
MoToStepper myStepper2( STEPS_REVOLUTION, STEPDIR ); // 6400 Steps/ Umdrehung
// Die Enable Pin´s werden nicht benutzt, dass die Motoren auch in Ruhe gebremst werden
const byte dirPin1 = 6;
const byte stepPin1 = 7;
const byte enaPin1 = 5; // Wird hier nicht benutzt
const byte dirPin2 = 9;
const byte stepPin2 = 10;
const byte enaPin2 = 8; // Wird hier nicht benutzt
int vspeed = 0; //Steppergeschwindigkeit in U/min*10
//-----------------------------------------------------
byte ablauf = 3; //3 = Tagbetrieb /4 = Nachtbetrieb
const float multiplier = 0.125F; // ADS1115-Multiplikator bei einf. Verstärkung
const byte panel = A0;
int panelwert = 0;
float panelspannung = 0;
float ads_mv0 = 0; // Sensor rechts
float ads_mv1 = 0; // Sensor links
float ads_mv2 = 0; // Sensor hinten
float ads_mv3 = 0; // Sensor vorne
int adc0 = 0;
int adc1 = 0;
int adc2 = 0;
int adc3 = 0;
float ads_mv4 = 0; // Sensor rechts
float ads_mv5 = 0; // Sensor links
float ads_mv6 = 0; // Sensor hinten
float ads_mv7 = 0; // Sensor vorne
int adc4 = 0;
int adc5 = 0;
int adc6 = 0;
int adc7 = 0;
int Messung1 = 0;
int Messung2 = 0;
int Messung3 = 0;
int Messung4 = 0;
int MessAlt1 = 0;
int MessAlt2 = 0;
int MessAlt3 = 0;
int MessAlt4 = 0;
const int startposvertikal = 25;
const int startposhorizontal = 60;
byte kontrolle1 = 0;
byte kontrolle2 = 0;
byte kontrolle3 = 0;
byte kontrolle4 = 0;
int posvertikal = startposvertikal;
int poshorizontal = startposhorizontal;
const byte Servo1 = 5;
const byte Servo2 = 6;
unsigned long sekundenablauf1 = 0; // Messabstand 1 Sekunde
const unsigned long pausezeit1 = 1000;
unsigned long aktuellzeit = 0;
void setup() {
//----------------------------------------------------
lcd.begin();
lcd.backlight();
lcd.clear();
//----------------------------------------------------
Serial.begin(9600);
//----------------------------------------------------
ads.begin(ADS_I2C_ADDR, &Wire);
ads2.begin(ADS_I2C_ADDR2, &Wire);
// Werte 1-fach verstärken (ESP32 liefert max. 3,3V)
ads.setGain(GAIN_ONE);
ads2.setGain(GAIN_ONE);
//----------------------------------------------------
lcd.setCursor (0, 0); // Zeile 1
//----------------------------------------------------
pinMode(panel, INPUT); // Spannung vom Panel
//----------------------------------------------------
sekundenablauf1 = millis();
//-----Stepper---------------------------------------
myStepper1.attach( stepPin1, dirPin1 );
myStepper1.attachEnable( enaPin1, 10, HIGH ); // Enable Pin deaktivieren ( LOW=aktiv )
myStepper1.setSpeed( 10 );
myStepper1.setRampLen( Rampe ); // Rampenlänge 100 Steps bei 20U/min
myStepper2.attach( stepPin2, dirPin2 );
myStepper2.attachEnable( enaPin2, 10, HIGH ); // Enable Pin deaktivieren ( LOW=aktiv )
myStepper2.setSpeed( 10 );
myStepper2.setRampLen( Rampe ); // Rampenlänge 100 Steps bei 20U/min
//---------------------------------------------------
}
void loop() {
aktuellzeit = millis();
//Jede Sekunde Spannung am Panel messen
if (aktuellzeit - sekundenablauf1 >= pausezeit1) // Eine Sekunde abgelaufen?
{
if ((kontrolle1 == 1) && (kontrolle2 == 1) && (kontrolle3 == 1) && (kontrolle4 == 1))
{
panelwert = analogRead(panel);
panelspannung = panelwert * 20.3 / 1024.0;
lcd.setCursor (14, 0); // Zeile 1
lcd.print (panelspannung);
if (ablauf == 3)
{
lcd.setCursor (0, 0); // Zeile 1
lcd.print (F("Panelspannung "));
}
if (ablauf == 4)
{
lcd.setCursor (0, 0); // Zeile 1
lcd.print (F("Nachtbetrieb "));
}
sekundenablauf1 = millis();
}
}
// -----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;
if (((Messung1 + 2) < MessAlt1) || ((Messung1 - 2) > MessAlt1))
{
lcd.setCursor (8, 3); // Zeile 4
lcd.print (" ");
lcd.setCursor (8, 3); // Zeile 4
lcd.print (Messung1);
MessAlt1 = Messung1;
}
// -----Kanal 2 Messung------------------------------
adc2 = ads.readADC_SingleEnded(2);
ads_mv2 = ads.computeVolts(adc2) * 1000;
// -----Kanal 3 Messung------------------------------
adc3 = ads.readADC_SingleEnded(3);
ads_mv3 = ads.computeVolts(adc3) * 1000;
Messung2 = ads_mv2 + ads_mv3;
if (((Messung2 + 2) < MessAlt2) || ((Messung2 - 2) > MessAlt2))
{
lcd.setCursor (8, 1); // Zeile 2
lcd.print (" ");
lcd.setCursor (8, 1); // Zeile 2
lcd.print (Messung2);
MessAlt2 = Messung2;
}
// -----Kanal 4 Messung------------------------------
adc4 = ads2.readADC_SingleEnded(0);
ads_mv4 = ads.computeVolts(adc4) * 1000;
// -----Kanal 5 Messung------------------------------
adc5 = ads2.readADC_SingleEnded(1);
ads_mv5 = ads.computeVolts(adc5) * 1000;
Messung3 = ads_mv4 + ads_mv5;
if (((Messung3 + 2) < MessAlt3) || ((Messung3 - 2) > MessAlt3))
{
lcd.setCursor (0, 2); // Zeile 3
lcd.print (Messung3);
MessAlt3 = Messung3;
}
// -----Kanal 6 Messung------------------------------
adc6 = ads2.readADC_SingleEnded(2);
ads_mv6 = ads.computeVolts(adc6) * 1000;
// -----Kanal 7 Messung------------------------------
adc7 = ads2.readADC_SingleEnded(3);
ads_mv7 = ads.computeVolts(adc7) * 1000;
Messung4 = ads_mv6 + ads_mv7;
if (((Messung4 + 2) < MessAlt4) || ((Messung4 - 2) > MessAlt4))
{
lcd.setCursor (15, 2); // Zeile 3
lcd.print (Messung4);
MessAlt4 = Messung4;
}
//------------Lichtquelle suchen---------------------
if (ablauf == 3)
{
//--------Horizontal Kontrolle plus--------------
if (kontrolle1 == 0)
{
if ((Messung2) < Messung1) // Links dunkler als rechts
{
if (poshorizontal > 0)
{
if (myStepper1.moving() == 0)
{
poshorizontal = poshorizontal - 1; // Fahre nach rechts
myStepper1.doSteps( -50 ); // Stepper dreht rückwärts
lcd.setCursor (0, 3);
lcd.print (" ");
lcd.setCursor (0, 3);
lcd.print ("H-");
lcd.print (poshorizontal);
}
}
}
else
{
kontrolle1 = 1;
/*
Serial.println(F("Messung2 < Messung1"));
Serial.print(Messung2);
Serial.print(" - ");
Serial.println(Messung1);
*/
}
}
//--------Horizontal Kontrolle minus-------------
if (kontrolle2 == 0)
{
if ((Messung2) > Messung1) // Links heller als rechts
{
if (poshorizontal < 110)
{
if (myStepper1.moving() == 0)
{
poshorizontal = poshorizontal + 1; // Fahre nacht Links
myStepper1.doSteps( 50 ); // Stepper dreht Vorwärts
lcd.setCursor (0, 3);
lcd.print (" ");
lcd.setCursor (0, 3);
lcd.print ("H-");
lcd.print (poshorizontal);
}
}
}
else
{
kontrolle2 = 1;
/*
Serial.println(F("Messung2 > Messung1"));
Serial.print(Messung2);
Serial.print(" - ");
Serial.println(Messung1);
*/
}
}
//-------Vertikale Kontrolle plus----------------
if (kontrolle3 == 0)
{
if ((Messung4) < Messung3) // Hinten dunkler als vorne
{
if (posvertikal > 0)
{
if (myStepper2.moving() == 0)
{
posvertikal = posvertikal - 1; // Fahre runter
myStepper2.doSteps( 50 ); // Stepper dreht rückwärts
lcd.setCursor (15, 3);
lcd.print (" ");
lcd.setCursor (15, 3);
lcd.print ("V-");
lcd.print (posvertikal);
}
}
}
else
{
kontrolle3 = 1;
/*
Serial.println(F("Messung4 < Messung3"));
Serial.print(Messung4);
Serial.print(" - ");
Serial.println(Messung3);
*/
}
}
//--------Vertikal Kontrolle minus---------------
if (kontrolle4 == 0)
{
if ((Messung4) > Messung3) // Hinten heller als vorne
{
if (posvertikal < 50)
{
if (myStepper2.moving() == 0)
{
posvertikal = posvertikal + 1; // Fahre hoch
myStepper2.doSteps( -50 ); // Stepper dreht Vorwärts
lcd.setCursor (15, 3);
lcd.print (" ");
lcd.setCursor (15, 3);
lcd.print ("V-");
lcd.print (posvertikal);
}
}
}
else
{
kontrolle4 = 1;
/*
Serial.println(F("Messung4 > Messung3"));
Serial.print(Messung4);
Serial.print(" - ");
Serial.println(Messung3);
*/
}
}
//-------Vertikale Kontrolle Ende-----------------
//------------Lichtquelle suchen Ende-------------
}
//------------Kontrolle wieder aktivieren-------------
//--------------------auf / ab------------------------
if (ablauf == 3)
{
if (kontrolle1 == 1)
{
if ((Messung2 + 100) <= Messung1) // Links dunkler als rechts
{
kontrolle1 = 0;
}
}
if (kontrolle2 == 1)
{
if ((Messung2) >= (Messung1 + 100)) // Links heller als rechts
{
kontrolle2 = 0;
}
}
//-----------------rechts / links-------------------
if (kontrolle3 == 1)
{
if ((Messung4 + 100) <= Messung3) // Hinten dunkler als vorne
{
kontrolle3 = 0;
}
}
if (kontrolle4 == 1)
{
if ((Messung4) >= (Messung3 + 100)) // Hinten heller als vorne
{
kontrolle4 = 0;
}
}
}
//-----------------------------------------------------
//--------------Kontrolle ob schon zu Dunkel-----------
if ((Messung1 < 1000) || (Messung2 < 1000) || (Messung3 < 1000) || (Messung4 < 1000))
{
ablauf = 4;
}
else
{
if ((Messung1 > 1400) && (Messung2 > 1400) && (Messung3 > 1400) && (Messung4 > 1400))
{
ablauf = 3;
}
}
//-----------------------------------------------------
//---------In die Nachtposition fahren-----------------
if (ablauf == 4)
{
kontrolle1 = 1;
kontrolle2 = 1;
kontrolle3 = 1;
kontrolle4 = 1;
//ServoVertikal.write(startposvertikal);
//ServoHorizontal.write(startposhorizontal);
}
//-----------------------------------------------------
}