

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);
}
//-----------------------------------------------------
}