solartracker

Hallo Leute,

ich bin gerade dabei, einen Solartracker auf Arduinobasis zu bauen. Mit dem angefügten Code funktioniert das schon mal ganz gut.
Das Problem dabei ist allerdings, wenn sich der Solartracker über die Waagrechte kippt, die Drehrichtung ändert und sich der Tracker somit in die falsche Richtung bewegt.

Mit "Ausrichtung bei Nacht" möchte ich einfach erreichen, dass sich der Tracker bei Nacht mittels des eingebauten Schalters in die Waagerr
Ich benutze für mein Projekt zwei DC echte begiebt.

Habt ihr Ideen wie ich das zum Laufen bekomme?

Grüße,
Matthias

//Solartracker



// LDR pin connections

const int ldrlt = A5; //LDR oben inks
const int ldrrt = A4; //LDR oben rechts
const int ldrld = A3; //LDR unten links
const int ldrrd = A6; //LDR unten rechts

//digital pins

const int NS1 = 5; // NS1 = North-South + relay number + pin
const int NS2 = 6; // NS2 = North-South + relay number + pin
const int EW3 = 9; // EO3 = East-West + relay number + pin
const int EW4 = 10; // NS4 = East-West + relay number + pin
const int Arduino2 = 4; //Arduino umschalten


//Schalter
int Taster = 12; 


void setup() {
  Serial.begin(9600);

  pinMode(NS1, OUTPUT); //N-S   Actuator RETRACTS piston
  pinMode(NS2, OUTPUT); //N-S   Actuator EXPANDS piston
  pinMode(EW3, OUTPUT); //E-W   Actuator RETRACTS piston
  pinMode(EW4, OUTPUT); //E-W   Actuator EXPANDS piston
  pinMode(Taster, INPUT);
  pinMode(Arduino2,OUTPUT);
}

void loop() {
  int lt = analogRead(ldrlt); // oben inks
  int rt = analogRead(ldrrt); // oben rechts
  int ld = analogRead(ldrld); // unten links
  int rd = analogRead(ldrrd); // unten rechts
 
  const int tol = 5
  ; //tolerance between LDR readings

  int avt = (lt + rt) / 2; // average value top oben
  int avd = (ld + rd) / 2; // average value down unten
  int avl = (lt + ld) / 2; // average value left links
  int avr = (rt + rd) / 2; // average value right rechts

  int dvert = avt - avd; // check the diffirence of up and down
  int dhoriz = avl - avr;// check the diffirence og left and rigt
  //endschalter


  //ACHTUNG int TEST
int summe = (lt + rt + ld + rd) / 4;
  //

  if (-tol > dvert || dvert > tol) { // check if the diffirence is in the tolerance else change vertical angle
    // difference in vertical is great enough to act on
    if ((avt > avd)) {
      // avg resistance on top is greater than on bottom
      digitalWrite(NS1, LOW);
      digitalWrite(NS2, HIGH);
    }
    else {
      // avg resistance on bottom is greater than on top
      digitalWrite(NS2, LOW);
      digitalWrite(NS1, HIGH);
    }
  }
  else {
    //difference in vertical is below tolerance
    digitalWrite(NS1, LOW);
    digitalWrite(NS2, LOW);
  }

  if (-tol > dhoriz || dhoriz > tol) {
    // difference in horizontal is great enough to act on
    if (avl > avr) {
      // avg resistance on left is greater than on right
      digitalWrite(EW3, LOW);
      digitalWrite(EW4, HIGH);
    }
    else {
      // avg resistance on right is greater than on left
      digitalWrite(EW4, LOW);
      digitalWrite(EW3, HIGH);
    }
  }
  else {
  
    //difference in horizontal is below tolerance
    digitalWrite(EW3, LOW);
    digitalWrite(EW4, LOW);
  }

  
  //Ausrichtung bei Dunkelheit horizontal
  if (summe<10 ) {   //Wenn der Helligkeitswert 10 unterschreitet,...
    digitalWrite (NS1, HIGH);
  }
     if ((digitalRead(Taster)==HIGH )and (summe<10)){
    digitalWrite (NS1,LOW);
      
      
    delay(10000);
    digitalWrite(NS1,LOW);
    
   
   }  
   if ((digitalRead(Taster)==LOW )and (summe<10)){
    digitalWrite(NS2,HIGH);
   }
   if ((digitalRead(Taster)==HIGH )and (summe<10)){
    digitalWrite(NS2,LOW);
   
   }
       


  // Wait a second before checking again
  delay(1000);

  }

8788781d993fdb12168cf0a9c335ebc7.jpg

a5bb4b50574a6150ec5ce18165a14543.jpg

db11611cd163721bdfaf3f2e2a2c2de6.jpg

Ich benutze für mein Projekt zwei DC echte begiebt.

???

Beschreib die Funktion der Relais, die die Motore steuern.
Beschreib mir bitte die Funktion dieses Codeabschnittes:

if (summe<10 ) {   //Wenn der Helligkeitswert 10 unterschreitet,...
    digitalWrite (NS1, HIGH);
  }
     if ((digitalRead(Taster)==HIGH )and (summe<10)){
    digitalWrite (NS1,LOW);
     
     
    delay(10000);
    digitalWrite(NS1,LOW);
   
   
   } 
   if ((digitalRead(Taster)==LOW )and (summe<10)){
    digitalWrite(NS2,HIGH);
   }
   if ((digitalRead(Taster)==HIGH )and (summe<10)){
    digitalWrite(NS2,LOW);
   
   }

Du mußt zwischen den Modi Tag= Ausrichtung und Nacht=Homestellung unterscheiden.
So wie Du den Sketch geschrieben hast wird immer ausgerichtet nur zusätzlich bei Dunkelheit auch in die Homstellung gefahren.

Grüße Uwe

Hallo Uwe, danke schon mal für deine Antwort.

Funktion Relais Motoren:
Dies habe ich durch einen PsmGoods L293D geregelt.

Mit den 4 Outputs.

NS1 runterschwenken (aus meiner Position vor dem Tracker, also zu mir kippen).. etwas kompliziert beschrieben
NS2 wegschwenken ( aus meiner Position vor dem Tracker, weg von mir kippen)
EW3 im Uhrzeigersinn drehen
EW4 gegen Uhrzeigersinn drehen

Funktion Codeabschnitt:

Wenn der Helligkeitswert unter 10 ist und der Taster nicht gedrückt ist, kippe in die erste Richtung. Wenn nun der Taster erreicht wird stoppe. Falls der Taster nach 10s noch immer nicht erreicht ist stoppe ebenfalls.

Wenn dann der Taster immer noch nicht erreicht ist passiert das selbe in die andere Kipprichtung. Spätestens hier muss der Taster irgendwann auf HIGH sein.

Gleichzeitig mit dem LOW setzen des Motors erfolgt ein umschalten auf den Nachtmodus der Arduino mittels digitalWrite (Arduino2 HIGH);

(Hierfür benutze ich ein Miniaturrelais mit zwei Spulen ohne Stromverbrauch.
Es wird auf eine zweite arduino umgeschaltet, welche nur für die Lichtsteuerung zuständig ist (3LEDs und Neopixel) ...aber dies nur nebenbei) die Solartracker Arduino ist über Nacht somit sowieso ausgeschaltet.