Lehrmeister für meine Codeprobleme gesucht

Hallo zusammen,

ich bin ein nicht so all zu erfahrener Arduino Mitstreiter aber ich hab mich trotzdem mal an ein großes Projekt gewagt und zwar:

Will ich eine Halterung für die Solarzelle meines Vaters konstruieren damit sich die Solarzelle der Sonne mitdrehen kann. Desweitern Plane ich auch aus Sicherheitsgründen eine Abdeckung die Runterfährt und somit die Solarzelle schützt sobald ein starker Wind weht oder es Regnet. Und genau da ist das Problem wo ich nicht mehr weiter komme mit der Programmierung weil ich einfach keine Ahnung habe wie man in diesem Fall den Delay umgehen kann damit er nicht mein ganzen Code aufhält.

Meine Konkrete frage wäre jzt kann mir jmd helfen die delay´s in diesem Code durch wahrscheinlich Millis zu ersetzten?

Das wäre mega nett und ich wäre euch Tausendmal Dankbar

-stahl999

int D = 0;
int C = 0;

//---Servo---
#include <Servo.h>
 
Servo myservo;
 
int angle = 90;


//---Wind---
const int m_time = 3;      
int wind_ct = 0;
float wind = 0.0;
unsigned long time = 0;


//---Motor---
int RichtungsPin13 = 13; 
  int PausenPin8 = 8;
  int Speed11 = 11; 



void setup()//-----------------------------------------------------------------------------------------
{
  Serial.begin(9600);
  time = millis();

 //---Servo--- 
  pinMode(3, OUTPUT);
myservo.attach(44);


//-M- = Motor
 pinMode(RichtungsPin13,OUTPUT);
 pinMode(PausenPin8,OUTPUT);

}
void loop()//-----------------------------------------------------------------------------------------
{

//---Servo---
int rightEye = analogRead(4);
int leftEye = analogRead(5);
 

int diff = (rightEye - leftEye);
 

if (diff > 30) {
angle = angle+2;
}
 

if (diff < -30) {
angle = angle-2;
}
 

if (angle > 200) {
angle = 200;
}
 

if (angle < 2) {
angle = 2;
}
 

myservo.write(angle);
 
//--------------------------------------------------

  meassure();
  Serial.print(wind);       //Speed in Km/h
  Serial.print(" km/h - ");
  Serial.print(wind / 3.6); //Speed in m/s
  Serial.print(" m/s");
  Serial.print("       ");
  Serial.print(" D:");
  Serial.print(D);
  Serial.print(" C:");
  Serial.println(C);
 
//--------------------------------------------------

if (wind > 0.2){ 
    C = C+1;
 
    }
//--------------------------------------------------
//Klappe soll zufahren

if(C==1){
angle = 90;

 delay(1000);
    
    
 digitalWrite(RichtungsPin13,HIGH); 
 digitalWrite(PausenPin8,LOW); 
 analogWrite(Speed11,255);
delay(3000);
 
D = 1;
  
}  else{
  digitalWrite(PausenPin8,HIGH);
  }

//--------------------------------------------------
//Klappe soll auffahren

// Hier soll auf 5min Hochgezählt werden und danach soll der Motor die Klappe schließen jedoch wird der 5min timer wieder genullt wenn inner halb der 5sec der wind wieder > 0.2 ist. 
Kurz nochmal zusammengefasst soll hier wenn die windstärke für 5min nicht stärker als definiert ist die Klappe wieder hochfahren 
,das gleich soll auch mit dem Regensenor passieren den muss ich jedoch  erst noch kaufen irgenwelche tipps? 
 
 digitalWrite(RichtungsPin13,LOW); 
 digitalWrite(PausenPin8, value); 
 analogWrite(Speed11,255);
  delay(3000); 
 
  
C = 0;
D = 0;
  
   
} else {
  
  digitalWrite(PausenPin8,HIGH); 
  
  } 

}

//--------------------------------------------------
//---Wind---

void countWind() {
  wind_ct ++;
}

void meassure() {
  wind_ct = 0;
  time = millis();
  attachInterrupt(1, countWind, RISING);
  detachInterrupt(1);
  wind = (float)wind_ct / (float)m_time * 2.4;
}

(Oh und ich sollte vlt erwähnen das nicht alle teile des Code´s von mir sind ich hab mir auch Funktionen aus dem Internet zusammengesucht.)

Wie möchtest du denn, dass wir dir helfen, wenn du uns deinen Sketch nicht zeigst.

Poste den bitte in Code-Tags, Schaltfläche </> oben links im Editorfenster.

Edit:
Ok, das hat sich grad überschnitten.

Meine Konkrete frage wäre jzt kann mir jmd helfen die delay in diesem Code durch wahrscheinlich Millis zuersetzten?

-->millis() ist schon mal richtig... die genaue Anwendung findest Du im Beispiel BlinkWithoutDelay :wink:
Oder Du schaust Dir mal dieses Tutorial durch

Nachführen lohnt nicht. Da ist es günstiger mehr Solarfläche zur Verfügung zu stellen.

-->Wo hast Du das denn her :o
In meinem Heimatort hat jetzt eine neue Autowaschanlage geöffnet, die beziehen ihren Strom über ein großes Solarpanel, welches eben der Sonne nachgeführt wird. Irgendwo kann es sich also doch rentieren...

noiasca:
Nachführen lohnt nicht. Da ist es günstiger mehr Solarfläche zur Verfügung zu stellen.

Na in meinem Fall schon da dank unsere ungünstigen Laage die Sonnen nur etwa 3std auf die Solarzelle scheint was bei einer mitdrehenden nicht der Fall wäre zudem will ich ja meinem Vater eine freude damit machen.

Hi

An einer Nachführung hätte ich aber auch noch Spaß - meine vier Zellen stehen recht genau nach Süd, bekommen aber erst ab 11 Sonne (... das störende Haus ist's Eigene - wird also wohl weiter stören), weshalb mir die späte Sonne interessant wäre.

Zu Deinem Sketch:

  • packe die Einzelteile in separate Funktionen, damit reduziert sich Dein loop() auf 'Regen', 'Wind', 'Sonne nachführen'.
  • in den Unterfunktionen entscheidest Du, ob Handlungsbedarf besteht - wenn nicht, direkt wieder raus
  • in den Unterfunktionen baust Du Dir einen Merker, was die Funktion zuletzt gemacht hat - so kann dann
    -- windstatus==1 -> setze Startzeit, windstatus++;
    -- windstatus==2 -> Wartezeit vorbei? Nein -> direkt wieder raus, sonst windstatus++
    -- .... also eine State-Maschine (von Status zu Status springen nach Bedingungen) pro Unter-Funktion

Bei Regen würde ich Nichts machen - je kälter das Modul ist, desto besser läuft Es.
Auch kann so ein Solar-Modul eine ganze Menge aus - hatte Mal einen Bericht auf N24 (??) gesehen, wo glaub ein rundes Bleigewicht mit 1m Auslage auf 90° (waagerecht) gezogen wurde um dann auf das senkrecht stehende Modul fallen zu lassen (das Gewicht schwingt an dem Pendel die 90° zum Modul, deformiert Das um einige cm und Alles 'dotzt zurück' - die Zeitlupenaufnahme sah echt unheimlich aus!!)
Viel mehr Gedanken würde ich mir darum machen, daß der Tracker samt Modul nicht vom Wind weggetragen wird.

Eine Beschattung plane ich bei der Thermischen ein ... aber Das ist eine ganz andere Baustelle ...

MfG

Erstmal vielen Dank für deine Programmierungsansetze leider hab ich einfach keine Ahnung wie ich sie umsetzten soll da ich mich noch nie soweit in das Thema Arduino gewagt hab und genau deswegen suche ich auch ein Lehrmeister der mir das Thema bei bringen kann, drum wäre ich leider auf beispiele angewiesen :(.

OH und Ja du hast recht die Solarzelle ist Wasserdicht nur Leider die LDR´s nicht :confused: und meine Halterung ist nicht für Wind ausgelegt da Sie dadurch viel zu Schwer werden würde für die Position wo ich sie Hin Geplant habe.

Hi

Nimm Dir einen Zettel und schreibe auf, was der Sketch wann machen soll.
Zerlege die Aufgaben dabei schon, damit Du überall nur kleine Probleme zu Lösen hast.
Schreibe alle Kleinigkeiten mit in diesen 'Ablaufplan', Die Dir einfallen.

Fange mit einem Sketch an, Der nur die Unterfunktion sonnennachführung() enthält.
Auch dort kannst Du bei jedem Aufruf zuerst prüfen, ob bereits eine Minute vergangen ist - viel öfter wirst Du nicht umstellen müssen (bzw. 180° in 12 Std, wenn Du das Servo eh nur gradweise ansteuern kannst ...)
(theoretisch kannst Du auch komplett auf Zeit setzen, mit einer DS3231 würde 1x Nachstellen pro Jahr dicke ausreichen (sofern die Servos die Grade wirklich einhalten) - sonst mit normalem DC-Motor wäre die LDR-Methode einfacher)

Ich stelle mir die Funktion dann ungefähr so vor:

  • prüfen, ob bereits 1 Minute um ist. Nein -> Return (Funktion verlassen)
  • aktuelle Uhrzeit merken (aka millis() )
  • prüfen, ob wir Nachstellen müssen. Nein -> Return
  • Nachstellen, Return

Wenn Das so weit läuft (zum Testen die Wartezeit auf Sekunden runter brechen), kann der Wind mit rein kommen.

  • Schutz aktiv? Wind < 0,2? Wartezeit vorbei? Ja -> Schutz deaktivieren
  • Wind >0,2? Schutz aktivieren, (Neu-)Start der Wartezeit

Diese Funktionen rennen nur so durch, da in den Einzelzweigen im Normalfall Nichts zu machen ist.
Wenn bei der Nachführung die Minute um ist, sind's noch ein/zwei weitere Prüfungen, Die auch nicht jedes Mal zu einem Motorlauf führen.
Der Motorlauf wird hier aber auch NUR gestartet und nach einer Zeit gestoppt - also wieder kein delay()!

MfG

Die Frage ist ob man eine Einachsen-Nachführung (West -Ost und fixen Winkel der Drehachse zb 40°) oder bauen soll oder einen 2 Achsen-Nachführung.

Hi

Einachsennachführung reicht absolut. Das Fundament wird deutlich einfacher und mit ein wenig Überlegung geht auch eine mechanische Sommer/Winter Umstellung z.B. 20 und 40 Grad. Die muss dann 2 mal im Jahr händisch betätigt werden.

Zweiachsennachführung bringt rechnerisch natürlich mehr. Nur die Kosten für das Fundament werden deutlich höher und allgemein unterschätzt werden die Wind Microvibrationen. Die Anforderungen an das Getriebe sind groß damit das älter als 1 Jahr wird. Vereisungsschutz ist auch ein Problem.

Nachführung mittels LDR oder sonstiger Sensoren ist völlig sinnlos. Der Sonnenstand ist so gut berechenbar dass das Anfahren einer Position nach Berechnung vollkommen ausreicht.

Wenn irgendwie geht mehr Module und keine Mechanik.

uwefed:
Die Frage ist ob man eine Einachsen-Nachführung (West -Ost und fixen Winkel der Drehachse zb 40°) oder bauen soll oder einen 2 Achsen-Nachführung.

Ich denke wie Viktor93 schon gesagt hat lohnt sich eine 2 Achsen-Nachführung nicht wirklich da sich die mehr kosten und vor allem der mehr Aufwand beim Konstrurieren sowie Programmieren nicht rentieren ( Korrigiert mich bitte wenn ich mit dieser Ansicht falsch liege.)

Viktor93:
Hi

Einachsennachführung reicht absolut. Das Fundament wird deutlich einfacher und mit ein wenig Überlegung geht auch eine mechanische Sommer/Winter Umstellung z.B. 20 und 40 Grad. Die muss dann 2 mal im Jahr händisch betätigt werden.

Zweiachsennachführung bringt rechnerisch natürlich mehr. Nur die Kosten für das Fundament werden deutlich höher und allgemein unterschätzt werden die Wind Microvibrationen. Die Anforderungen an das Getriebe sind groß damit das älter als 1 Jahr wird. Vereisungsschutz ist auch ein Problem.

Nachführung mittels LDR oder sonstiger Sensoren ist völlig sinnlos. Der Sonnenstand ist so gut berechenbar dass das Anfahren einer Position nach Berechnung vollkommen ausreicht.

Wenn irgendwie geht mehr Module und keine Mechanik.

Ich find die Nachführung per Sonnenstand Berechnung ein ziemlich gut idea worüber ich noch gar nicht nachgedacht habe. Könnte mir da vlt jmd ein bsp. Code schreiben das wäre sehr aufmerksam da ich auch hier wieder keine idea habe wie ich das umsetzten soll.

Edit: Oder kann mir jemand Tutorials empfehlen die mich in diesem Fall weiter bringen?

MfG

postmaster-ino:
Hi

Nimm Dir einen Zettel und schreibe auf, was der Sketch wann machen soll.
Zerlege die Aufgaben dabei schon, damit Du überall nur kleine Probleme zu Lösen hast.
Schreibe alle Kleinigkeiten mit in diesen 'Ablaufplan', Die Dir einfallen.

Fange mit einem Sketch an, Der nur die Unterfunktion sonnennachführung() enthält.
Auch dort kannst Du bei jedem Aufruf zuerst prüfen, ob bereits eine Minute vergangen ist - viel öfter wirst Du nicht umstellen müssen (bzw. 180° in 12 Std, wenn Du das Servo eh nur gradweise ansteuern kannst ...)
(theoretisch kannst Du auch komplett auf Zeit setzen, mit einer DS3231 würde 1x Nachstellen pro Jahr dicke ausreichen (sofern die Servos die Grade wirklich einhalten) - sonst mit normalem DC-Motor wäre die LDR-Methode einfacher)

Ich stelle mir die Funktion dann ungefähr so vor:

  • prüfen, ob bereits 1 Minute um ist. Nein -> Return (Funktion verlassen)
  • aktuelle Uhrzeit merken (aka millis() )
  • prüfen, ob wir Nachstellen müssen. Nein -> Return
  • Nachstellen, Return

Wenn Das so weit läuft (zum Testen die Wartezeit auf Sekunden runter brechen), kann der Wind mit rein kommen.

  • Schutz aktiv? Wind < 0,2? Wartezeit vorbei? Ja -> Schutz deaktivieren
  • Wind >0,2? Schutz aktivieren, (Neu-)Start der Wartezeit

Diese Funktionen rennen nur so durch, da in den Einzelzweigen im Normalfall Nichts zu machen ist.
Wenn bei der Nachführung die Minute um ist, sind's noch ein/zwei weitere Prüfungen, Die auch nicht jedes Mal zu einem Motorlauf führen.
Der Motorlauf wird hier aber auch NUR gestartet und nach einer Zeit gestoppt - also wieder kein delay()!

MfG

Wirklich ein Großes danke für deine Bemühungen, generell bin ich von diesem Forum echt Positiv überrascht ihr seit echt alle mega Hilfs bereit :slight_smile:

Jzt müsst ich nur noch wissen wie ich deine Idea in ein richtigen Code umwandel könntest du mir da vlt weiter helfen?

MfG

Hi

Für 'Hilfe zur Selbsthilfe' ist so ein Forum ja da :wink:

Womit drehst Du die PV-Module?
Wie kannst Du von der aktuellen Drehung auf einen Winkel schließen?
(DC-Motor mit Dreh-Encoder oder Stepper wäre hier wohl recht einfach im Programm abzubilden, beim Encoder musste man einen Korrektur-Winkel ausmessen, beim Stepper würde ein End-Taster für fixe Verhältnisse sorgen)

Unterm Strich muß Dein Programm (neben den Unwetter-Dingen) eigentlich nur alle Minute 'schauen', ob die PV-Module etwas verdreht werden müssen.
Wenn Ja, werden dem Stepper die passende Anzahl an Schritte gegeben (ist ja sturr zeitabhängig, so eine Sonne) - dabei muß der Stepper nicht Mal schnell sein, Er muß nur schneller sein, als die Sonne!!
Ggf. berechnet man auch einfach nur die Wartezeit zwischen den Schritten und macht halt alle x Millisekunden einen Step, bis die Sonne untergegangen ist, dann kurbelt man zurück und wartet auf den nächsten Startschuß - so 6:00 bis 18:00 (also 12 Stunden, 720 Minuten, 43200 Sekunden) für 180° - Das sollte ein Arduino 'im Kopf' zusammen rechnen können, wann der nächste Schritt/das nächste Grad benötigt wird.

MfG

Ähnlich, wenn mit einem Dreh-Encoder und normalem DC-Motor (bzw. hier ging so ziemlich Alles an Motor) gearbeitet wird.

MfG

postmaster-ino:
Hi

Für 'Hilfe zur Selbsthilfe' ist so ein Forum ja da :wink:

Womit drehst Du die PV-Module?
Wie kannst Du von der aktuellen Drehung auf einen Winkel schließen?
(DC-Motor mit Dreh-Encoder oder Stepper wäre hier wohl recht einfach im Programm abzubilden, beim Encoder musste man einen Korrektur-Winkel ausmessen, beim Stepper würde ein End-Taster für fixe Verhältnisse sorgen)

Unterm Strich muß Dein Programm (neben den Unwetter-Dingen) eigentlich nur alle Minute 'schauen', ob die PV-Module etwas verdreht werden müssen.
Wenn Ja, werden dem Stepper die passende Anzahl an Schritte gegeben (ist ja sturr zeitabhängig, so eine Sonne) - dabei muß der Stepper nicht Mal schnell sein, Er muß nur schneller sein, als die Sonne!!
Ggf. berechnet man auch einfach nur die Wartezeit zwischen den Schritten und macht halt alle x Millisekunden einen Step, bis die Sonne untergegangen ist, dann kurbelt man zurück und wartet auf den nächsten Startschuß - so 6:00 bis 18:00 (also 12 Stunden, 720 Minuten, 43200 Sekunden) für 180° - Das sollte ein Arduino 'im Kopf' zusammen rechnen können, wann der nächste Schritt/das nächste Grad benötigt wird.

MfG

Ähnlich, wenn mit einem Dreh-Encoder und normalem DC-Motor (bzw. hier ging so ziemlich Alles an Motor) gearbeitet wird.

MfG

Ich hatte bei der Motor wahl an einen Schrittmotor gedacht. Da sich denk ich die schritte relativ gut in 180° umrechnen lassen, oder lieg ich da falsch?

Hier die Produktbeschreibung:

Schrittmotor mit Flanschmaß 42x42mm
Baulänge: 49,5mm
Haltemoment: 0,50Nm
Phasenstrom: 1,0A

· Hybrid-Schrittmotor, 1,8°
· High Torque Version
· 2 Phasen, bipolar
· Eckige Bauweise, Flanschmaß 42x42mm (NEMA17)
· 200 Schritten/Umdrehung (1,8 Grad Schrittwinkel)
· 5mm Achse
· Litzenlänge: 300mm typ.
· Optimiert für Microstepping

Also wären das wenn ich die Beschreibung Richtig gelsen habe 100 SChritte für 180°.

Also bedeutet das wenn wir mit den 720min rechnen das jede 7,2min der Motor ein schritt machen muss.

Ich kann des ja für jede Jahreszeit extra machen.

Oh und ich hab noch ne Frage wie Verhält sich der Arduino eig. mit Sommer / Winterzeit da sich dann ja die Morgentlichestartzeit um eine Std verändert?

Da würde ich Dir empfehlen immer die gleiche Zeitzone zu benutzen. Also entweder alles in Winterzeit oder gleich in UTC.

Gruß Tommy

Hi

Ich denke nicht, daß der Stepper die Module direkt drehen kann - etwas Getriebe wirst DU Da wohl noch benötigen (ggf. eine Kette, kleines Ritzel auf Stepper, großes Ritzel am Gestell.

Als Zeit würde ich 'Winterzeit' (= eben Normalzeit) nehmen oder wie Tommy schrieb, UTC.
Wenn der Arduino via RTC die Zeit mithält, sollten sich die nächsten Jahre keine größeren Beanstandungen in der Ausrichtung ergeben.

Die Sonne geht ja im Sommer nicht zu einer anderen Zeit auf, nur weil WIR die Uhr irgendwo hin gestellt haben.
Mit der ganzen Zeitumstellerei hat der Arduino überhaupt Nichts 'am Hut' - für Ihn beginnt um 6:00 (Winterzeit) der Tag und um 18:00 (Winterzeit) sind die 180° fertig.

MfG

stahl999:
Also bedeutet das wenn wir mit den 720min rechnen das jede 7,2min der Motor ein schritt machen muss.

Ein unbestromter Schrittmotor hat kein Haltemoment, Du brauchst eine "Bremse". Ein selbsthaltendes Getriebe könnte eine Lösung sein. Mein Gefühl tendiert daher eher zu einem 12V Getriebemotor (mit Schnecke) und Drehgeber.

Ok, nur Zweiter.

Die Sonne geht ja im Sommer nicht zu einer anderen Zeit auf, nur weil WIR die Uhr irgendwo hin gestellt haben.
Mit der ganzen Zeitumstellerei hat der Arduino überhaupt Nichts 'am Hut' - für Ihn beginnt um 6:00 (Winterzeit) der Tag und um 18:00 (Winterzeit) sind die 180° fertig.

Im Prinzip richtig. Gilt aber strenggenommen für 15° Ost . Wessis (z.B. 9° E) sehen die Sonne im Süden um 12:24 CET

(Ich hoffe Links schicken ist in diesem Forum erlaubt wenn nicht Lösch ich sie natürlich Sofort.)

Ich hab mich mal nach Getriebemotor umgeschaut und bin auf diesen hier gestoßen wäre der Praktikabel?

Als Encoder hab ich vlt an sowas hier gedacht oder habt ihr mir da was besseres?

https://eckstein-shop.de/Pololu-Optical-Encoder-Pair-Kit-for-Micro-Metal-Gearmotors-5V?curr=EUR&gclid=Cj0KCQjwgMnYBRDRARIsANC2dflg28JI2aAqgWCkq2v7V29i6GMsHzSrxFiETWxX-VhUcirFDWOqEEYaAkGqEALw_wcB

stahl999:
(Ich hoffe Links schicken ist in diesem Forum erlaubt wenn nicht Lösch ich sie natürlich Sofort.)

Links sind kein Problem, allerdings sind das, was Du gepostet hast, keine Links.
Hier nochmal für die mobilen Nutzer, anklickbar:

Getriebemotor

Encoder