
Hinweis!Werbung:
Dieser Beitrag enthält min. einen Partnerlink. Info
Aufgepasst!
Günstige Hardware und kostenlose eBooks für den Arduino gibt es bei AZ Delivery
Vor Kurzem habe ich mit dem Gedanken gespielt, mir eine Wetterstation für den Balkon zu kaufen.
Aus keinem bestimmten Grund, sondern einfach nur, weil ich Bock hatte, mir die Daten, die entstehen, anzugucken.
Wie passend, dass schon über ein Jahr lang ein BME280 und ein ESP-32 Dev Kit C in meiner Schublade liegen und dort vor sich hin gammeln.
Grund genug, sich endlich mal damit auseinanderzusetzen und was Feines daraus zu bauen – eine kleine Wetterstation.
Bisher hatte ich den ESP-32 nicht angefasst, weil die Einrichtung unter Arduino bisher recht nervig sein sollte. Allerdings ist dieser Prozess nun arg vereinfacht worden und wird z.B. auf der Seite esp32-server.de erläutert.
Wechseln Sie zum „Datei“/“Voreinstellungen“, Tragen Sie in Eingabefeld „Zusätzliche Boardverwalter-URLs“. folgende URL: https://dl.espressif.com/dl/package_esp32_index.json . jetzt können Sie über „Werkzeuge“ -> „Board“ -> „Boardverwalter“ esp32 suchen und installieren.
http://esp32-server.de
Weiterhin benötigt man noch die Adafruit BME280 Library und die Adafruit Unified Sensor Library, um den BME280 ansteuern zu können. Beide Bibliotheken kann man über die IDE beziehen.
Anschließend wurde ein wenig gelötet und programmiert.
Dabei bin ich auf ein paar Herausforderungen getroffen, die es zu lösen galt.
Zum einen der unglaublich hohe Stromverbrauch im aktiven Modus des ESP-32, denn dadurch dass das Ding neben WLAN auch noch Bluetooth und 40nm Low-Power-Technologie an Bord hat, verbraucht es doch deutlich mehr Strom als notwendig.
Meine Powerbank mit 5200mAh war nach 1,5 Tagen leergelutscht. Nicht gut.
Nun verhält es sich aber so, dass man den ESP-32 in einen von drei Stromsparmodi versetzen kann. Dabei ist es sogar möglich, einen Zeitwert mitzugeben, nach dessen Ablauf der ESP-32 von allein wieder startet. Dies ist möglich, da der ULP Co-Prozessor weiterhin mit Strom versorgt wird, während alle anderen Stromfresser schlafen.
Also den Code nochmal umgestellt und das Problem wurde zwar nicht aus der Welt geschafft, aber zumindest reduziert.
Ziel war es, die Wetterstation möglichst lange mit einer Batterie CR123A zu betreiben.
Die andere Herausforderung war das Gehäuse. Da der BME280 nicht nur die Temperatur, sondern auch die Luftfeuchte messen kann, darf es sich um kein geschlossenes Behältnis handeln, da sonst die Werte verfälscht werden.
Eine kurze Recherche ließ mich die TFA Schutzhülle von Dostmann finden, die wie geschaffen für mein Vorhaben zu sein schien. Gekauft.
Heute wurde dann alles zusammengebaut und auf dem Balkon an einer schattigen Stelle montiert.
Mein „Weatherino“ sendet die Daten übrigens an ein php-Skript, welches eine mySQL mit eben diesen füttert und bei Bedarf auf wetter.janbpunkt.de wieder ausgibt.
Nachfolgend ein paar Bilder und der Quellcode. Die Wetterdaten sind auf https://wetter.janbpunkt.de einsehbar
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 |
//inkludieren, was wir so brauchen #include <Wire.h> #include <SPI.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> #include <WiFi.h> #include <HTTPClient.h> //umrechnungsfaktor mikrosekunden zu minuten #define uS_TO_S_FACTOR 60000000 //zeit, wie lange der esp schlafen soll #define TIME_TO_SLEEP 15 //wlan-daten const char* ssid = "Ein WLAN"; const char* password = "wlanpasswort"; //BME280 deklarieren Adafruit_BME280 bme; //SETUP void setup() { //zum wlan verbinden WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); } //BME280 initialisieren bme.begin(); //kurz warten delay(500); //daten senden, wenn wlan verbunden if ((WiFi.status() == WL_CONNECTED)) { HTTPClient http; float temperature = bme.readTemperature(); float pressure = bme.readPressure() / 100.0F; float humidity = bme.readHumidity(); String url; url += "https://wetter.janbpunkt.de/xyz.php?temp="; url += String(temperature); url += "&press="; url += String(pressure); url += "&hum="; url += String(humidity); http.begin(url); http.GET(); http.end(); } //wlan trennen, damit es nach neustart wieder verbinden kann WiFi.disconnect(true); //schlafenszeit festlegen esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); //schlafen legen esp_deep_sleep_start(); } void loop() { //nix } |
Und nun bin ich gespannt, wie lange die Batterie durchhält.
Update
Nachdem das mit der autarken Stromversorgung alles nix war, weil trotz diverser Optimierungen am Code (sleep-Mode etc pp) der Stromverbrauch zu hoch war und ich die Akkus (ich bin von der o.g. Batterie auf 4x 1,2V Akkus umgestiegen) alle paar Tage wechseln musste, hab ich nun eine Steckdose in die Nähe verlegt und betreibe den Weatherino per USB.
LoRa wäre wohl noch eine Option gewesen, aber ich wollte mir nicht noch ein neues Board kaufen.
Außerdem konnte ich so den Code ein wenig umbauen und kann selbigen zukünftig per WLAN anpassen, sollte dies notwendig sein, da das Board dauerhaft verbunden ist.
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 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
//inkludieren, was wir so brauchen #include <WiFi.h> #include <ESPmDNS.h> #include <WiFiUdp.h> #include <ArduinoOTA.h> #include <HTTPClient.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> float oldTemp = 0; float oldHum = 0; float oldPress = 0; float currTemp = 0; float currHum = 0; float currPress = 0; float temperature = 0; float humidity = 0; float pressure = 0; bool start = true; unsigned long previousMillis = 0; //10 Sekunden (debug) //const long interval = 10000; //10 Minuten const long interval = 600000; //wlan-daten const char* ssid = "Hier gibt es Bier!"; const char* password = "wlankey"; //BME280 deklariere Adafruit_BME280 bme; // I2C //SETUP void setup() { //BME280 initialisieren bme.begin(0x76); //Seriellen Monitor aktivieren Serial.begin(115200); //zum WLAN verbinden - kann bei WPA2 sehr lange dauern WiFi.disconnect(); WiFi.mode(WIFI_STA); WiFi.enableSTA(true); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Verbinde zum WLAN..."); } Serial.println("Verbunden - IP: "); Serial.println(WiFi.localIP()); //Hostname ArduinoOTA.setHostname("weatherino"); //Remote PW ArduinoOTA.setPassword("1234Passwort"); ArduinoOTA .onStart([]() { String type; if (ArduinoOTA.getCommand() == U_FLASH) type = "sketch"; else // U_SPIFFS type = "filesystem"; // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end() Serial.println("Start updating " + type); }) .onEnd([]() { Serial.println("\nEnd"); }) .onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%\r", (progress / (total / 100))); }) .onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); else if (error == OTA_END_ERROR) Serial.println("End Failed"); }); ArduinoOTA.begin(); Serial.println("Ready"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); } void loop() { ArduinoOTA.handle(); unsigned long currentMillis = millis(); if ((currentMillis - previousMillis) >= interval || start==true) { start = false; //die Zeit in Millis seit dem letzten Aufruf previousMillis = currentMillis; //BME280 abfragen currTemp = bme.readTemperature(); currHum = bme.readHumidity(); currPress = bme.readPressure() / 100.0F; //auf 43m Hoehe umrechnen. currPress = (currPress/pow(1-(43/44330.0),5.255)); if (oldTemp != 0) { temperature = (currTemp+oldTemp)/2; } else temperature = currTemp; if (oldHum != 0) { humidity = (currHum+oldHum)/2; } else humidity = currHum; if (oldPress != 0) { pressure = (currPress+oldPress)/2; } else pressure = currPress; oldTemp = temperature; oldHum = humidity; oldPress = pressure; //WLAN nochmal prüfen while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Verbinde zum WLAN..."); } //Daten senden HTTPClient http; String url; url += "https://wetter.janbpunkt.de/xyz.php?temp="; url += String(temperature); url += "&hum="; url += String(humidity); url += "&press="; url += String(pressure); http.begin(url); int httpCode = http.GET(); String payload = ""; if (httpCode > 0) { payload = http.getString(); } Serial.println(payload); http.end(); } } |
Wenn Dir dieser Artikel geholfen und/oder gefallen hat, freue ich mich, wenn Du janbpunkt.de mit einer kleinen Spende per PayPal unterstützt. Jeder Betrag ist willkommen.
Über einen Kommentar freue ich mich natürlich auch :-)

Jan B-Punkt

Neueste Artikel von Jan B-Punkt (alle ansehen)
- Adventskalender Gewinnspiele 2020 - 1. Dezember 2020
- Rauchfrei v2 – Erster Monat überstanden - 29. November 2020
- ohsnap! vs Spigen-Halterung - 6. November 2020
- Warum ich kaum noch lokal kaufe - 4. November 2020
- Rauchfrei v2 – Tag 5 überstanden - 2. November 2020
Wie lang reichen denn jetzt die Batterien?
Mit 4 AAA Akkus komme ich derzeit leider nur auf unbefriedigende 3-5 Tage. Je nachdem, wie warm/kalt es ist und ob das WLAN im ersten Versuch verbindet.
Sobald ich das optimiert bekommen habe, gibt’s nochmal ein Update mit der „Lösung“.
Hallo Jan,
an welchen PINs am ESP hast du den BME Sensor angeschlossen?
LG
Jan
Gute Frage. Schau einfach in das Schaltbild Deines ESP und guck, welche Pins für SDA und SDC sind.
hallo jan,
als blutiger anfänger verwirrt mich das etwas. meinst du vielleicht SCL und SDA ?
Ja, Du hast Recht.
Ich kann mir diese Abkürzungen nie merken :-D
Hi Jan,
mich würde interessieren an welche PINs ich die cr123a anschließen soll? Habe ein ESP32 Nodemcu von joy-it. Könntest du mir bitte sagen an welche PINs an deinem Board du die Batterie angeschlossen hast? Danke!
Moin X,
da guckst Du am besten mal auf den Schaltplan von Deinem Board. Ich habe festgestellt, dass die PINs durchaus unterschiedlich belegt sind.
Viele Grüße
Jan
Hallo Jan,
dein Projekt hat mich dazu inspiriert meine eigene Wetterstation zu bauen.
Mein Aufbau ist im Prinzip identisch zu deinem, allerdings frage ich mich wie du die Wetterdaten so schön darstellst (mit wählbarem Zeitfenster und Extremwerten). Könntest du mir den PHP/HTML Code deiner Webseite als Vergleich/Hilfestellung schicken?
Liebe Grüße und Danke im voraus
Lars