/*
Forum: https://forum.arduino.cc/t/hilfe-zum-automatischen-bewasserungscode/1426822
Wokwi: https://wokwi.com/projects/454058836291026945
Angepasster Sketch zur Bewässerungsanlage
Statt der Pumpe -> Blaue Led
Statt des Feuchtesensors -> Schiebepotentiometer
Einfache non-blocking Lösung
2026/01/24
ec2021
*/
constexpr byte sensorPin {A0}; // Bodenfeuchtesensor
constexpr byte relayPin {4}; // Relais / Pumpe
constexpr uint16_t sensorTrocken {550}; // Schwellwert Analogsensor für "zu trocken"
constexpr uint16_t sensorFeucht { 10}; // Schwellwert Analogsensor für "ausreichend feucht"
constexpr int16_t schwellWert {60}; // Schwellwert der umgerechneten Feuchte für "zu trocken"
constexpr unsigned long messIntervall {3000};// Zeitintervall zwischen zwei Messungen in ms
constexpr unsigned long pumpDauer {1000}; // Dauer des Pumpens in ms
int feuchtigkeit; // Feuchtigkeit in Prozent
unsigned long letzteMessung;
unsigned long pumpeEinZeit;
boolean pumpeAn = false;
void setup() {
pinMode(relayPin, OUTPUT);
digitalWrite(relayPin, HIGH); // Pumpe aus (LOW-aktives Relais)
Serial.begin(115200);
Serial.println("Bodenfeuchtigkeit wird gemessen...");
}
void loop() {
if (pumpeAn) {
pumpen();
} else {
messenUndAuswerten();
}
flackern();
}
void messenUndAuswerten() {
static boolean ersterAufruf = true;
if (millis() - letzteMessung > messIntervall || ersterAufruf) {
letzteMessung = millis();
ersterAufruf = false;
int sensorWert = constrain(analogRead(sensorPin), sensorFeucht, sensorTrocken);
feuchtigkeit = map(sensorWert, sensorTrocken, sensorFeucht, 0, 100);
Serial.print("Feuchtigkeit: ");
Serial.print(feuchtigkeit);
Serial.println(" %");
if (feuchtigkeit < schwellWert) {
Serial.println("Boden zu trocken -> Bewässerung AN");
digitalWrite(relayPin, LOW);
pumpeAn = true;
pumpeEinZeit = millis();
}
}
}
void pumpen() {
if (millis() - pumpeEinZeit > pumpDauer) {
Serial.println("Pumpe Aus");
digitalWrite(relayPin, HIGH);
pumpeAn = false;
letzteMessung = millis(); // Neue Startzeit für die nächste Messung setzen,
// nachdem die Pumpe wieder ausgeschaltet wurde
}
}
// Dient nur der Demo der nicht-blockierenden StateMachine
void flackern() {
constexpr uint8_t magentaPin {7};
constexpr unsigned long magentaBlink {150};
static boolean firstCall = true;
if (firstCall) {
pinMode(magentaPin, OUTPUT);
firstCall = false;
}
static unsigned long lastBlinking;
if (millis() - lastBlinking > magentaBlink) {
lastBlinking = millis();
byte state = !digitalRead(magentaPin);
digitalWrite(magentaPin, state);
}
}