Hinweis!
Dieser Beitrag enthält min. einen Partnerlink.
Info zu meinen Partnerlinks
Aufgepasst!
Günstige Hardware und kostenlose eBooks für den Arduino gibt es bei AZ Delivery
Info zu meinen Partnerlinks
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 ein langes Kabel gekauft und betreibe den Weatherino per USB-Netzteil.
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 Beitrag geholfen hat und/oder Du mich finanziell unterstützen magst, kannst Du dies gerne per Paypal machen.
Alternativ kannst Du Dir meinen Amazon-Partnerlink in die Favoriten legen und Amazon bei Deinen zukünftigen Einkäufen darüber aufrufen:
Es entstehen Dir dadurch keine Mehrkosten, ich erhalte aber eine kleine Provision.
Über einen Kommentar freue ich mich natürlich auch :-)
Jan B-Punkt
Neueste Artikel von Jan B-Punkt (alle ansehen)
- Adventskalender Gewinnspiele 2024 - 1. Dezember 2024
- Freie News für freie User – Schneller als die Paywall - 22. April 2024
- Adventskalender Gewinnspiele 2023 - 1. Dezember 2023
- Angespielt: Starship Troopers: Extermination - 19. Mai 2023
- Fazit zum ATOMSTACK A5 pro nach zwei Monaten Nutzung - 9. Mai 2023
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
Servus. Wie sieht es mit Korrosion im Dostmann Gehäuse aus?
Hast du die Teile extra geschützt mit Isolationslack?
Moin,
ich hab das Board lediglich in Frischhaltefolie verpackt :-D
Scheint zu reichen.
Hi vielleicht kann dir das bei deinem stromproblem helfen, ich glaub es gibt auch eine ondemant funtion, damit der sensor nicht misst, wenn mans gar ned braucht, bin mir aber ned sicher ob das auch in der adafruit-bme biblio. implementiert ist. woher hast du eigentl. den code zur höhenkorrektur ( currPress = (currPress/pow(1-(43/44330.0),5.255)); LG Daniel Recommended Modes - Based on Bosch BME280I2C environmental sensor data sheet. Weather Monitoring : forced mode, 1 sample/minute pressure ×1, temperature ×1, humidity ×1, filter off Current Consumption = 0.16 μA RMS Noise = 3.3 Pa/30 cm, 0.07 %RH Data Output Rate 1/60 Hz Humidity Sensing :… Weiterlesen »
Hallo, ich erhalte nach dem hochladen folgenden Fehler:
Verbinde zum WLAN…
Verbunden – IP:
192.168.xxx.xx
Ready
IP address: 192.168.xxx.xx
<!DOCTYPE HTML PUBLIC „-//IETF//DTD HTML 2.0//EN“>
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL was not found on this server.</p>
</body></html>
wenn ich dann im Browser die IP-Adresse aufrufe kommt keine Verbindung.
Danke für Antwort!
Moin Reinhard, Du scheinst da an einer Stelle gedanklich falsch abgebogen zu sein. Der Arduino selbst bietet kein Webinterface oder zeigt die Daten im Browser an. Dazu brauchst Du eine Datenbank und einen Webserver, an den die Daten geschickt werden können. Das ist der Teil, der ab //Daten senden 1 //Daten senden stattfindet. Da baue ich einen HTTP-Request und schicke diesen an mein Script, welches die Daten in eine mySQL schreibt, aus welcher später die eigtl. Wetter-Seite diese wieder abruft. Siehe auch im Beitrag Mein „Weatherino“ sendet die Daten übrigens an ein php-Skript, welches eine mySQL mit eben diesen füttert… Weiterlesen »
Hallo Jan,
vielen Dank für Deine Antwort.
Ein Software-Experte bin ich nicht und kann daher Deine Hinweise nicht umsetzen.
Ich benötige lauffähigen Code oder eine für mich nachvollziebare Anleitung.
Sicherlich kannst Du mir helfen.
Gruß
Reinhard
Moin Reinhard,
sei mir nicht böse, aber ich werde hier nicht erläutern, wie man einen Webserver aufsetzt, eine Tabelle in mySQL anlegt, ein PHP-Script schreibt etc pp.
Vllt. wäre eine fertige Lösung für Dich besser?
Amazon hat da ja recht viel im Angebot: https://amzn.to/3228mB6 (Ref-Link)
Viele Grüße
Jan
sehr sehr schade. Wirklich.
Das einzige, was schade ist, ist Deine Kostenlos-Mentalität.
Mal im Ernst: wie stellst Du Dir das vor?
Einen Webserver aufzusetzen ist kein trivialer Vorgang.
Und wenn es Dir an Grundlagen der Programmierung fehlt, wird es wenig bringen, wenn ich Dir das fertige Script gebe, da dies angepasst werden muss.
Und bitte nicht vergessen, dass ich kein Dienstleister bin, sondern jemand, der solche Projekte für sich selbst(!) in der eigenen Freizeit baut.
Wenn Du jemanden suchst, der Dir eine fertige Lösung baut, müssen wir anfangen über Geld zu reden/schreiben.
Viele Grüße und viel Erfolg.