Hallo, ich bin neu hier im Forum, habe aber schon einige Erfahrungen mit kleineren Projekten. Nun taste mich Stück für Stück in einen etwas größeren Arduinoprojekt vorran und stecke nun fest.
Grundaufgabe: Ich möchte gerne ein Blakonkraftwerk (2 Solarzellen) mit einer Sonnennachführung über entsprechenden Gestell und Linearmotoren über Arduino Uno steuern. Ich habe ein Kreuz mit 4 Fotowiderständen gebaut. Die Werte werden ausgelesen und Differenzen der Werte für Tagesverlauf und Jahresverlauf führen dazu, dass verschiedene Relais angesteuert werden, die dann 2 Linearmotoren ansteuern. Das funktioniert soweit im Versuchsaufbau gut.
Nun möchte ich gerne ein paar "Extras " einbauen. Als erstes möchte ich, wenn die Widerstandwerte von 2 Widerständen unter den Wert 80 fallen, dass ein bestimmter Ausgang low geht und ein anderer high. Diese Funktion soll den Abend entsprechend die Module von Ostausrichtung wieder auf West fahren.
Grundsätzlich haben die Linearmotoren Endschalter, es wäre praktisch egal wenn der Befehl (wenn Wert unter 80 dann) über Nacht ansteht. Aber ich glaube die Relais finden das auf Dauer nicht so schön.
Am Ende des Sktechs habe ich diese Funktion eingebaut. Dilay wird dann an die max. Fahrdauer des Linearmotors noch angepasst. Jetzt ersteinmal 4000.
Frage:
Wie bekomme ich es hin, dass wenn der Wert unter 80 fällt (auch das muss in der Praxis natürlich noch an die Vorortverhältnisse angepasst werden) die Ausgänge 12 und 13 entsprechend angestert werden? Im Moment passiert das schon, aber nach der delay(4000) Zeit wird 12 auf high und dann gleich wieder auf low gesetzt. Das ist also nicht der richtige Weg.
Info zur Relaiskarte: Damit das Relais abfällt, muss ich den Arduinoausgang auf high setzen.
Ich hoffe mein Problem konnte ich für die Profis hier vernüftig beschreiben und habe alle nötigen Detail erwähnt.
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
}
void loop() {
// Helligkeit der beiden lichtempfindlichen Widerstände 11 und 12 für Tagesneigung
int gelb12 = analogRead(0);
int braun11 = analogRead(1);
// Helligkeit der beiden lichtempfindlichebn Widerstände 21 und 22 für Jahresneigung
int grau22 = analogRead(2);
int blau21 = analogRead(3);
// Differenz ausrechnen Widerstandswert Tagesneigung
int diff1 = (gelb12 - braun11);
// Differenz ausrechnen Widerstandswerte Jahresneigung
int diff2 = (grau22 - blau21);
// Wenn braun11 und gelb12 Werte über 80 haben und
// Wenn gelb12 deutlich heller als braun11, dann Realis 1.1 anziehen und Realis 2.1 abfallen
if ((braun11 and gelb12 > 80) and diff1 > 80) {
digitalWrite(12, HIGH);
digitalWrite(13, LOW);
delay(500);
}
//Wenn braun11 und gelb12 Werte über 80 haben und
// Wenn braun11 deutlich heller als gelb12, dann Realis 1.1 abfallen und Relais 2.1 anziehen
if ((braun11 and gelb12 > 80) and diff1 < -80) {
digitalWrite(12, LOW);
digitalWrite(13, HIGH);
delay(500);
}
//Wenn braun11 und gelb12 Werte über 80 haben und
// Wenn grau22 deutlich heller als blau21, dann Realis 3.1 anziehen und Realis 4.2 abfallen
if ((braun11 and gelb12 > 80) and diff2 > 80) {
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
delay(500);
}
//Wenn braun11 und gelb12 Werte über 80 haben und
// Wenn blau21 deutlich heller als grau22, dann Realis 3.1 abfallen und Relais 4.2 anziehen
if ((braun11 and gelb12 > 80) and diff2 < -80) {
digitalWrite(11, LOW);
digitalWrite(10, HIGH);
delay(500);
}
// Wenn die Differenz 1 kleiner +/- 79 ist und der Wert gelb12 über 80 ist, dann beide Relais abfallen lassen
if (diff1 <= 79 and diff1 >= -79 and gelb12 >80) {
digitalWrite(13, HIGH);
digitalWrite(12, HIGH);
delay(1000);
}
// Wenn die Differenz 2 kleiner +/- 79 ist und der Wert blau21 über 80 ist, dann beide Relais abfallen lassen
if (diff2 <= 79 and diff2 >= -79 and blau21 > 80) {
digitalWrite(11, HIGH);
digitalWrite(10, HIGH);
delay(1000);
}
// Wenn Wert von braun11 und gelb12 unter 80 Fällt (am Abend bei Dunkelheit), dann Relais anziehen und nach delay abfallen lassen
if (braun11 and gelb12 < 80) {
digitalWrite(12, LOW);
digitalWrite(13, HIGH);
delay(4000);
digitalWrite(12, HIGH);
}
// Die beiden Helligkeitswerte und Dufferenzen zu Testzwecken an den PC übertragen
Serial.println(String(gelb12) + " " + String(braun11) + " " + String(diff1) + " " + String(grau22) + " " + String(blau21) + " " + String(diff2));
delay(200);
}
Dieser Text wird ausgeblendet
