Eine große Frage für Leute mit Garten ist, wie viel hat es geregnet? Mit diesem Wissen kann die Bewässerung entsprechend angepasst werden und weniger oder mehr (automatisch) gegossen werden. Dazu bauen wir einen ESP8266 Regensensor, der misst, wie viel es pro Quadratmeter geregnet hat. Auch ein Raspbery Pi eignet sich dafür. Mittels MQTT und/oder anderen Übertragungsmöglichkeiten schicken wir die Daten an ein Smart Home System, welches den Niederschlag pro Stunde und pro Tag aufzeichnet.
Zubehör
Das Gehäuse für den ESP8266 Regensensor ist mit einem 3D-Drucker gedruckt worden und gibt es in dieser Form nicht zu kaufen. Alternativ kann man sich ein Modell auch drucken lassen, wobei das bei häufigerem Drucken um einiges teurer wird.
Für den Regensensor wird jedenfalls folgendes Zubehör benötigt:
- Alle Teile des 3D Models (am besten in einer hellen Farbe)
- ESP8266: NodeMCU Dev Board
- Reed Sensor Modul mit PCB (auf den Bildern siehst du, welches Modell ich verwendet habe)
- Female-Female Jumper Kabel
- Kleine runde Magnete
- Heißkleber
- Wasserdichtes Micro-USB-Kabel (Alternativ: Die Stromversorgung mittels Solarzellen ist auch möglich)
Außerdem würde ich kein schwarzes Filament empfehlen (diesen Fehler habe ich begangen). Durch die Sonneneinstrahlung erhitzt es zu schnell und geht u.U. ein, sodass das Regensensor-Gehäuse unbrauchbar wird.
Zusammenbau des ESP8266 Regensensors
Nachdem du alle Teile beisammen hast, fangen wir mit der Unterschale und dem Abflussbecken an, welche mit zwei Verbindungsstücken übereinander gesteckt werden.
Wir fahren mit Halterung für den Magnetsensor fort, durch den drei Jumperkabel mit unterschiedlichen Farben kommen:
Das NodeMCU Dev Board wird an seiner Halterung mit zwei Schrauben befestigt und kann anschließend einfach aufgehängt werden.
Schiebe nun die Halterung mit den Jumperkabeln vorsichtig durch das Verbindungsstück und schraube den Reed Sensor darauf. Du kannst nun ebenfalls die Jumper Kabel verbinden (ich habe die Pins vom PCB ein wenig gebogen).
In der Mitte der Wippe wird der kleine runde Magnet mit Heißkleber fixiert. Die Wippe kann dann eingesetzt werden:
Auf der anderen Seite werden die Jumperkabel mit den ESP8266 verbunden. Je nachdem welches Modell du verwendest, kann die Pin Belegung unterschiedlich sein. Jedenfalls wird GND (Sensor) an GND vom ESP8266 angeschlossen, VCC (Sensor) an 3V3 (ESP) und D0 (Sensor) an D5 (ESP8266).
Nun kannst du den ESP8266 bereits an den Strom anschließen. Wir möchten erreichen, dass die LED des Sensors nur leuchtet, wenn die Wippe auf einer Seite ist. Hierfür musst du ggf. den Drehwiederstand etwas justieren und die Abstände zwischen Sensor und Magnet etwas ändern. Jedes Wippen soll eine Änderung des Status erzeugen.
Hast du das erreicht, können wir das Oberteil bereits aufsetzten. Nur noch die Programmierung fehlt, welche wir anschließend vornehmen.
Zu guter Letzt können wir die Oberfläche noch z.B. mit Wachs begießen, sodass das Wasser besser in die Mitte fließt.
Software auf den ESP8266 übertragen
Um den Code, der die Regenmenge bestimmt, auf den ESP8266 übertragen zu können, benötigen wir die Arduino IDE. Diese muss für den ESP8266 angepasst werden (Details dazu findest du hier).
Öffne ein neues Fenster und füge folgenden Code ein:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
#include <Arduino.h> #include <ESP8266WiFi.h> #include <PubSubClient.h> #define USE_SERIAL Serial const char* WIFISSID = "Wifi Name"; // SSID name const char* WIFIPASS = "Wifi Passwort"; // password const char* MQTT_BROKER = "192.168.1.220"; // IP of the MQTT Broker const char* MQTT_CHANNEL = "/RainDrop/data"; // in which Channel should the results be published const char* MQTT_CLIENT_NAME = "ESP8266ClientRain1"; bool firstLoop = true; // Indicates that this is the first loop int triggerPin = 14; // The stick reading about it tipped. int totalCount = 0; // a simple calculator that adds how many tipping it has done since its start. const char* mmPerSquareMeter = "0.094175";// 1.25 ml per dipper change, 94.175 ml per m^2 (=1.25*75.34), = 0.094175mm/m^2 // diameter of raingauge is about 130mm, r = 65mm, surface = pi*r^2 = 132.73 cm^2 // therefore per m^2 (=10000cm^2) we have a factor of about 75.34 bool lastState = false; // Specifies which mode was last time. bool currentState = false; // Specifies the state of the loop now unsigned long lastChanged = 0; // when did we change the status the last time WiFiClient espClient; PubSubClient client(espClient); long lastMsg = 0; char msg[50]; int value = 0; void setup() { Serial.begin(115200); setup_wifi(); client.setServer(MQTT_BROKER, 1883); } void setup_wifi() { delay(10); Serial.println(); Serial.print("Connecting to "); Serial.println(WIFISSID); WiFi.begin(WIFISSID, WIFIPASS); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Attempt to connect // If you do not want to use a username and password, change next line to if (client.connect(MQTT_CLIENT_NAME)) { //if (client.connect(MQTT_CLIENT_NAME, mqtt_user, mqtt_password)) { Serial.println("connected"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } void loop() { // connect to MQTT broker if (!client.connected()) { reconnect(); } client.loop(); int currentState = digitalRead(triggerPin); if (firstLoop){ lastState = currentState; firstLoop = false; // Sets that it has now run the startup. }; // If it is the first startup then it should not send a dump // Checks the value of the stick, translates it to a bool value. if (currentState == 1){currentState = true;} else {currentState = false;} // Checks whether the previous loop has the same loop as the current loop. Will not go into this first loop. if (lastState != currentState){ lastState = currentState; // between two changes, there should be 1 sec difference if ((millis() - lastChanged) > 1000 ) { totalCount++; lastChanged = millis(); client.publish(MQTT_CHANNEL, mmPerSquareMeter ); Serial.print("Number of times:"); Serial.println(totalCount); } } delay(150); // small delay to avoid false readings. } |
Hier musst du noch deine Wifi-Daten anpassen (Zeilen 7-8). Danach kannst du die Datei speichern und auf den ESP hochladen.
In diesem Beispiel wird davon ausgegangen, dass ein MQTT Server verfügbar ist und an diesen unsere Daten gesendet werden können. Hierfür nutzen wir den PubSubClient. Du kannst ihn folgendermaßen installieren: Sketch -> Include Library -> Manage Libraries -> nach „PubSubClient“ (Nick O’Leary) suchen und installieren:
Manueller Regensensor Test
Um den ESP8266 Regensensor auf seine Funktionalität zu überprüfen, können wir eine bekannte Menge Wasser nehmen (z.B. 100ml) und dieses langsam in die Öffnung gießen. Jedes Mal, wenn es „klackt“ (die Wippe verändert ihre Position), sind 1,25ml durchgelaufen. Um die Änderungen z.B. in OpenHAB sichtbar zu machen, können wir diesem Tutorial folgen.
In meinem Test habe ich die Wassermenge gemessen, bis die Wippe die Position gewechselt hat. Du kannst dies nachmessen oder meine Werte übernehmen. Der Niederschlag pro Quadratmeter in Milliliter (ml) wird entsprechend der Kreisfläche berechnet. Sofern du ein modifiziertes Objekt nutzt, muss die Rechnung angepasst werden (Π*r²), wobei der Radius (r) hier ~130 mm ist.
20 Kommentare
Eine schöne Idee !!
Ein Regensensor ist eine nette Idee – aber prinzipiell der falsche Ansatz. Ein Regensensor weiß nicht, ob in 1 Stunde ein Wolkenbruch erwartet wird – er muss also mit einer Wettervorhersage kombiniert werden. Falls die sich irrt, reicht ein späteres Gießen i.d.R. auch noch aus. Ein Regensensor weiß aber auch kaum (je nach Sensortyp gibt es mechanische Tricks wie aufquellendes Leder), wie groß die Verdunstung der letzten Tage war – auch hier ist eine Kombination mit einer Wetterbeobachtung notwendig, besser noch die Kombination mit einem Feuchtesensor. Und wenn man den hat – wozu dann der Regensensor? Der macht nur für die Beobachtung großräumiger, langdauernder Ereignisse Sinn, also z.B. die Vorhersage, wo der Grundwasserpegel liegen wird. Für das im Teaser genannte Szenario Gartenbewässerung ist ein Feuchtesensor erheblich geeigneter als ein Regensensor, denn es zählt nicht die fallende, sondern die im Boden vorhandene Feuchtigkeit. Und selbst für die Frage, ob ein Regenschirm eingepackt werden soll, ist die Vorhersage wichtiger als der Ist-Zustand.
Das mit dem Wolkenbruch kann man ja dann auch in Node Red auswerten, es ist ja auch ohnehin eine Berechnung der Regenmenge Berengnungsmenge erforderlich. Feuchtesensoren sind aus meiner Sicht anfällig, da finde ich diesen Ansatz schon realistisch. Auch gequollenes Leder sehe ich als eine echte Herausforderung für einen Maker.
Ich gebe für dieses tolle Projekt einen Daumen hoch, vielen Dank für diesen Bericht.
Viel Spaß beim nächsten Bodenfeuchte-Projekt. Alles im DIY-Bereich Erhältliche übersteht kein Jahr.
Bei mir laufen Helligkeit, Luftfeuchte und TempSensoren kombiniert mit Regenmesser.
Über Langzeitdaten(>1Jahr) und eigene Beobachtungen lassen sich Abhängigkeiten erkennen.
Also entweder Liter je Quadratmeter oder mm, aber mm je Quadratmeter ist Unsinn.
Wo steht mm pro qm?
Quellcode Zeile 18
Regenmenge wird auch im Wetterbericht immer mit mm pro qm angegeben. 1000mm sind übrigens 1000 Liter. So gesehen eine Leichte Umrechnung
Nein, Niederschlag wird immer in mm angegeben, Du schreibst ja selbst 1000 mm sind 1000 Liter und nicht 1000 mm je qm.
ist kein Unsinn, denn das einspricht einem Liter/m² und 1000 mm auf 1m² sind dann auch wieder 3-dimensional und entsprechen 1000 Liter oder 1 m³
Finde die Idee, gut, erinnert mich an meine Davis VP2 👍😀
@Thomas Stein
Schön wäre es , wenn man lesen und verstehen könnte,
hier geht es nicht um Bodenfeuchte, sondern, wenn ein User gerne wissen möchte wieviel Liter es in einer bestimmten Zeit geregnet hat.
Mexico67
Gibt es die Druckvorlage für den Magnetsensor wie im Bild auch noch zum downloaden, Auf der verlinkten Seite von Thingiverse konnte ich die STL-Datei nicht finden. Sonst finde ich das eine gute Idee und muss mir noch etwas einfallen lassen um den Magnetsensor dauerhaft zu befestigen.
Ich hätte ebenfalls interesse an diesem Teil
Hallo Felix,
danke für das tolle Tutorial. Den Regenmengenmesser habe ich mit ein paar kleinen Änderungen nachgebaut.
Den Sensor habe ich vor Einbau mit einem Schutzlack versehen, den ESP außerhalb des eigentlichen Gerätes platziert und weitere Ablauföffnungen für das Wasser vorgesehen (vor Allem im Boden der Schale (eventueller Starkregen/ eventuelle Eisbildung).
Nun meine eigentlichen Fragen:
Wie muss der Sketch abgeändert werden, dass er a die kumulierten Werte (Volumen) sagen wir zB. der letzten 10-60 Sekunden oder b aller x Sekunden die kumulierte Anzahl der Wippenwechsel sendet. Ebenfalls ist mir aufgefallen, dass bei schnellem Wippenwechsel die Anzahl der Wechsel kleiner als tatsächlich auf der seriellen Konsole angegeben wird.
Für eine Antwort im Voraus dankend
Kramykram
Vielen Dank, genau das habe ich gesucht :-)))
Ich hoffe jetzt nur, dass sich zeitnah ein wenig Ruhe für das Projekt findet.
Hallo zusammen, erstmal danke für die tolle Idee. Ich habe alles bis auf die Übertragung zum Mosquitto Broker unter Homeassistant zum laufen gebracht.
Nut die Übertragung funktioniert leider nicht. Ich sehe im Log das der Regensensor sich connected, aber es wird kein Eintrag mit einem Messwert angelegt. Hat da jemand eine Idee?
Viele Grüße
Vielen Dank für den Post. 🙂
Ich hab mir den Regenmesser jetzt nachgebaut und mit ein paar Hardware- und Softwareänderungen funktioniert es super.
Ich musste den Reedsensor etwas anders platzieren und habe etwas mit Heißkleber rumgebastelt.
An dem Code habe ich einiges geändert und Features wie WiFi sleep eingebaut (das macht ordentlich was aus – von 700 mA auf 200mA im „idle“). Die Inbuilt LED lasse ich auch immer kurz aufblinken, wenn es eine Erkennung gibt.
Auch bei MQTT sende ich die Daten in JSON und habe eine kleine Fehlerdetection eingebaut, die dann einen Fehlercode über MQTT sendet, falls die Wippe in der Mitte stehen bleibt und es ein dauerhaftes Signal gibt.
Hier der Link: https://gist.github.com/Xitee1/5ede55927c9a37c06dc6015e38e46d51
Geniales Projekt.
Ganz klasse Arbeit und genau das was ich brauche.
Finde es echt cool auch mit dem Hinweis des dunklen Filaments.
Wäre toll wenn Andere hier ihre Verbesserungen wie oben Xitee schon verlinkte, auch posten würden.
Vielen Dank!
Vielen dank für diesen tollen Beitrag! Ein Frage habe ich zu der Programmierung: Hat es einen Grund, dass der Status der Wippe bei jedem Durchlauf des Loops abgefragt wird, anstatt die Wippe über einen Interrupt (Flankenwechsel) auszuwerten?