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?