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