
Wenn du Schwierigkeiten hast, deine Pflanzen am Leben zu erhalten, oder ein begeisterter Statistikfan bist, der es liebt, Bodenfeuchtigkeit über Wochen und Monate zu verfolgen und zu analysieren, dann ist dieser Beitrag genau das Richtige für dich.
Ich habe ein ausgefeiltes Skript entwickelt, das herkömmliche, analoge Bodenfeuchtigkeitssensoren automatisch kalibriert, deren Werte in Prozent ausgibt und die Daten mittels MQTT auch an Home Assistant usw. überträgt.
Was du benötigst
Hardware
- Einen Mikrocontroller wie ESP32 oder Arduino
Da der Code keine speziellen Bibliotheken verwendet und – abgesehen von der Stromversorgung des Sensors – lediglich einen Pin benötigt, ist er auf den meisten Geräten einsetzbar.
Falls du jedoch eine batteriebetriebene, langfristige Überwachung deiner Pflanzen anstrebst, empfehle ich den FireBeetle 2 ESP32-E. Mit diesem Modell habe ich Batterielaufzeiten von mehreren Monaten erreicht. - Einen Bodenfeuchtigkeitssensor (Soil Moisture Sensor)
Software
- Arduino IDE
- Home Assistant + MQTT Broker
Achtung Amazon Affiliate
Die Verkabelung
Verbinde das Pluskabel (+) mit einem 3V- oder 5V-Pin.
Wenn du, wie ich, einen ESP32 verwendest, ist der GPIO35 eine gute Wahl.
Bei einem ESP32 im D1-Format oder einem anderen Mikrocontroller wie Arduino solltest du in den Spezifikationen deines Geräts nach einem geeigneten analogen Pin suchen, da dieser notwendig ist, um die Daten des Sensors zu empfangen.
Stelle sicher, dass du den entsprechenden GPIO-Pin auch im Code anpasst.
Inbetriebnahme
Im oberen Teil des Codes ist es notwendig, die WLAN- und MQTT-Konfigurationen festzulegen.
Falls du noch keinen MQTT-Benutzer in Home Assistant hast, erstelle einfach einen neuen Admin-Benutzer und trage dessen Daten in den Code ein.
Beachte, dass die Berechtigungen der Home-Assistant-Benutzer auch für MQTT relevant sind.
Energieeffizienz ist entscheidend
WLAN, Bluetooth und Sensorabfragen verbrauchen viel Energie. Diese Faktoren sind ausschlaggebend für eine lange Akkulaufzeit.
Im Code kannst du die Variable sleepTimeSeconds anpassen, um zu steuern, wie häufig die Feuchtigkeitsdaten an Home Assistant übermittelt werden.
- Zum Debuggen: kurze Intervalle
- Im Dauerbetrieb: einmal pro Stunde oder seltener
Mit dieser Einstellung kannst du bei einem 3000 mAh-Akku eine Laufzeit von etwa sechs Monaten erreichen.
Automatische Kalibrierung
Die meisten Bodenfeuchtigkeitssensoren erfordern eine manuelle Kalibrierung.
Das ist lästig, besonders bei mehreren Sensoren, da sich die Werte je nach Kabellänge, Pin und Lötstelle unterscheiden.
Ich habe daher eine automatische Kalibrierung implementiert:
- Sensor während des Flashens komplett trocken lassen
- Nach dem Upload 2–3 Sekunden warten
- Innerhalb von 20 Sekunden den Sensor in Wasser tauchen
Der ESP32 lernt so automatisch Minimal- und Maximalwerte und gibt die Feuchtigkeit anschließend in Prozent aus.
Die Werte werden dauerhaft im NVS gespeichert und bleiben auch nach einem Stromverlust erhalten.
Die Kalibrierungszeit lässt sich über die Variable calibrationPeriod anpassen.
Die serielle Konsole zeigt dabei die ermittelten Werte an.
Rekalibrierung
Falls du neu kalibrieren möchtest, kannst du mit folgendem Skript den nichtflüchtigen Speicher des ESP32 vollständig löschen.
#include <Arduino.h>
#include <Preferences.h>
Preferences preferences;
void setup() {
Serial.begin(115200);
preferences.begin("moisture", false);
bool isCleared = preferences.getBool("isCleared", false);
if (!isCleared) {
Serial.println("Lösche Kalibrierungsdaten...");
preferences.clear();
preferences.putBool("isCleared", true);
Serial.println("Kalibrierungsdaten wurden zurückgesetzt.");
} else {
Serial.println("Kalibrierungsdaten wurden bereits gelöscht.");
}
preferences.end();
delay(2000);
Serial.println("System wird neu gestartet.");
ESP.restart();
}
void loop() {
}
Code für die Bodenfeuchtigkeitsüberwachung
#include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <Preferences.h>
const int moistureSensorPin = 35;
Preferences preferences;
int airValue;
int waterValue;
unsigned long startTime;
const unsigned long calibrationPeriod = 20000;
const unsigned long sleepTimeSeconds = 20;
const char* ssid = "[SSID]";
const char* password = "[PASSWORT]";
const char* mqttServer = "[MQTT_SERVER_IP]";
const char* mqttUser = "[MQTT_BENUTZERNAME]";
const char* mqttPassword = "[MQTT_PASSWORT]";
const char* mqttTopic = "pflanzen/pflanze01";
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(115200);
preferences.begin("moisture", false);
airValue = preferences.getInt("airValue", 4095);
waterValue = preferences.getInt("waterValue", 0);
bool isCalibrated = preferences.getBool("isCalibrated", false);
if (!isCalibrated) {
Serial.println("Kalibrierung beginnt...");
startTime = millis();
}
setup_wifi();
client.setServer(mqttServer, 1883);
}
void loop() {
bool isCalibrated = preferences.getBool("isCalibrated", false);
if (!client.connected()) {
reconnect();
}
client.loop();
if (!isCalibrated && millis() - startTime < calibrationPeriod) {
int sensorValue = analogRead(moistureSensorPin);
waterValue = max(waterValue, sensorValue);
airValue = min(airValue, sensorValue);
} else if (!isCalibrated) {
preferences.putInt("airValue", airValue);
preferences.putInt("waterValue", waterValue);
preferences.putBool("isCalibrated", true);
}
if (isCalibrated) {
int sensorValue = analogRead(moistureSensorPin);
int moisturePercent = map(sensorValue, airValue, waterValue, 100, 0);
moisturePercent = constrain(moisturePercent, 0, 100);
char msg[50];
sprintf(msg, "%d", moisturePercent);
client.publish(mqttTopic, msg);
esp_sleep_enable_timer_wakeup(sleepTimeSeconds * 1000000);
esp_deep_sleep_start();
}
}
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
}
void reconnect() {
while (!client.connected()) {
client.connect("ArduinoClient", mqttUser, mqttPassword);
delay(5000);
}
}
Home Assistant Integration
In der configuration.yaml:
mqtt:
sensor:
- name: "Pflanze 1 Bodenfeuchtigkeit"
state_topic: "pflanzen/pflanze01"
unit_of_measurement: "%"
Danach Konfiguration prüfen und Home Assistant neu starten.
Der Sensor erscheint anschließend in den Entitäten.
Fehlerbehebung
Die serielle Konsole liefert detaillierte Statusmeldungen zu:
- WLAN-Verbindung
- MQTT-Verbindung
- Kalibrierungswerten
- Berechneten Feuchtigkeitswerten
Sind keine Daten in Home Assistant sichtbar, lohnt sich ein Blick ins MQTT-Broker-Log.
3D-Druck-Gehäuse
Wenn du Akkus und den FireBeetle 2 ESP32-E verwendest, habe ich dafür ein passendes Case entworfen, das den ESP32 zumindest etwas vor Erde schützt:
Kommentare