Hallo.
Ich bin neu hier im Forum und auch in der Arduino-Welt. Mich hat der Basteldrang gepackt und ich habe vor eine automatische Bewässerungsanlage für unser Tomatenhaus zu bauen, bzw. diese zu verbessern.
Aktuell stehen 4 große Pflanzkübel im Tomatenhaus. In einem der Kübel ist ein kapazitiver Feuchtigkeitssensor versenkt. Meine Arduino Nano Kopie liest die feuchte der Erde aus und wenn diese zu trocken ist schaltet er die Pumper per für 30 Sekunden ein. Danach wartet er 15 Minuten.
Das ganze läuft über eine Autobatterie mit einer 12V 1.5A mini China-Pumpe. Der Code macht was er soll. Es hat sich aber herausgestellt dass die Pumpe zu wenig Druck hat um alle Pflanzen gleichmäßig zu bewässern. Immerhin muss sie vier Schläuche bzw Ausgänge mit genug Druck versorgen und sowieso müssen sich alle Pflanzen nach dem Wasserbedarf des einen Kübels richten. Das möchte ich gerne ändern.
Die Anlage wird aufgerüstet und bekommt dazu ein 5 Wege Magnetventil und einen Sensor pro Kübel. In festen Abständen einen Sensorwert im Pflanzkübel abgefragt werden. Ist die Erde zu trocken soll ein Ventil öffnen und eine Pumpe einschalten. Danach soll der Sensorwert im Intervall solange überprüft werden bis die Erde feucht genug ist. Erst dann soll die Pumpe wieder abschalten und das Ventil schließen. Danach geht das ganze mit dem nächsten Kübel weiter.
Dafür habe ich folgenen Sketch geschrieben:
int ventil1 = 1; // Namen für Digitalpins 1-5
int ventil2 = 2;
int ventil3 = 3;
int ventil4 = 4;
int pumpe = 5;
int sens1 = A1; // Namen für Analogpins 1-4
int sens2 = A2;
int sens3 = A3;
int sens4 = A4;
int senswert1; // Name für Sensorwert
int senswert2;
int senswert3;
int senswert4;
void setup() {
pinMode(1, OUTPUT); // Digitale Pins 1-5 werden auf OUTPUT gestellt
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
}
void loop() {
senswert1 = analogRead(sens1); // Wert von Sensor wird ausgelesen
if (senswert1 > 600) // Wenn Sensorwert größer 600 dann nachfolgende Anweisungen ausführen
{
digitalWrite(ventil1, HIGH); // Ventil öffnen
delay(3000); // 3 Sekunden warten
digitalWrite(pumpe, HIGH); // Pumpe an
delay(5000); // 5 Sekunden warten
while (senswert1 > 475) // Solange Sensorwert größer 475 ist nachfolgende Anweisungen ausführen
{
delay(2000); // 2 Sekunden Warten
senswert1 = analogRead(sens1); // Sensorwert auslesen. Zurück zu "while"
}
digitalWrite(pumpe, LOW); // Pumpe aus
delay(3000); // 3 Sekunden warten
digitalWrite(ventil1, LOW); // Ventil 1 schließen
delay(3000); // 3 Sekunden warten
}
senswert2 = analogRead(sens2);
if (senswert2 > 600) {
digitalWrite(ventil2, HIGH);
delay(3000);
digitalWrite(pumpe, HIGH);
delay(5000);
while (senswert2 > 475) {
delay(2000);
senswert2 = analogRead(sens2);
}
digitalWrite(pumpe, LOW);
delay(3000);
digitalWrite(ventil2, LOW);
delay(3000);
}
senswert3 = analogRead(sens3);
if (senswert3 > 600) {
digitalWrite(ventil3, HIGH);
delay(3000);
digitalWrite(pumpe, HIGH);
delay(5000);
while (senswert3 > 475) {
delay(2000);
senswert3 = analogRead(sens3);
}
digitalWrite(pumpe, LOW);
delay(3000);
digitalWrite(ventil3, LOW);
delay(3000);
}
senswert4 = analogRead(sens4);
if (senswert4 > 600) {
digitalWrite(ventil4, HIGH);
delay(3000);
digitalWrite(pumpe, HIGH);
delay(5000);
while (senswert4 > 475) {
delay(2000);
senswert4 = analogRead(sens4);
}
digitalWrite(pumpe, LOW);
delay(3000);
digitalWrite(ventil4, LOW);
}
delay(900000);
}
Das ist mein zweiter Code den ich selber erstellt habe. Man verzeihe mir bitte meine mangelnden Vorkenntnisse Ich warte noch auf die Ventile und die Sensoren aber ich dachte mir man kann die Profis ja schon mal drüber schauen lassen
Wird der Code denn so funktionieren und passt die while Schleife so?
Ich habe es so verstanden dass alles was in den {} nach "while" kommt solange ausgeführt wird bis die Bedingung von while nicht mehr erfüllt wird?
In diesem Fall wenn der Wert vom Sensor unter 475 fällt dann wird der Teil nach den {} von "while" ausgeführt (Pumpe aus, Ventil zu).
while (senswert2 > 475) {
delay(2000);
senswert2 = analogRead(sens2);
}
digitalWrite(pumpe, LOW);
delay(3000);
digitalWrite(ventil2, LOW);
delay(3000);
Es wird wohl empfohlen nicht mit "delay()" sondern mit "millis()" zu arbeiten. Ist das hier unbedingt nötig? Die delays werde ich evtl noch umstellen. Ich will nur vermeiden dass die Ventile geschlossen sind wärend die Pumpe läuft.
Vielen Dank schon mal für die Antworten.
Relak