In diesem Beitrag zeigen wir dir, wie du dir mit dem ESP32 deine eigene Wetterstation baust!
Kompakte Wetterstationen haben längst auch in privaten Haushalten Einzug gefunden. Und das kommt nicht von ungefähr: Denn die Temperatur, die Luftfeuchtigkeit und den Luftdruck messen zu können, ist mit großem Nutzen verbunden. So erleichtert die Kenntnis hinsichtlich des aktuellen Wetters nicht nur die Planung des Alltags. Die Messung der Luftfeuchtigkeit kann beispielsweise auch nützliche Informationen liefern, die die eigenen vier Wände betreffen. Liegt die Luftfeuchtigkeit nämlich bei mehr als 60 Prozent, besteht die erhöhte Gefahr, dass sich an den Wänden Schimmel bildet. Der Luftdruck kann wiederum Aufschluss über bevorstehende Wetterveränderungen geben. Du siehst: Eine Wetterstation bringt verschiedene Vorteile mit sich. Umso praktischer ist es, dass du ein solches Gerät nicht für teures Geld zu kaufen brauchst, sondern mithilfe weniger Software- und Hardware-Komponenten ganz leicht selbst herstellen kannst. Wie du hierbei am besten vorgehst, zeigen wir dir im Folgenden.
Das brauchst du, um deine eigene ESP32 Wetterstation zu bauen:
- ESP32: Mit dem Microcontroller erhältst du einen leistungsstarken Allrounder für dein Projekt. Wie der Name bereits andeutet, ist das Gerät 32-bittig. Es verfügt über einen großen Speicher und ist mit WLAN und Bluetooth ausgestattet.
- BME280 Sensor: Der verhältnismäßig preisgünstige Sensor ist in der Lage, sowohl die Temperatur als auch die Luftfeuchtigkeit und den Luftdruck zu messen. Somit stellt der BME280 für deine Wetterstation das ideale Hilfsmittel dar.
- 40pin Jumper / Dupont Kabel Female – Female trennbar zum Verbinden der Bauteile.
- Arduino IDE: Mithilfe dieser Software, der integrierten Entwicklungsumgebung von Arduino, wird der untenstehende Code geschrieben und anschließend hochgeladen.
- Adafruit BME280 Library und Adafruit unified Sensor Library: Die beiden Bibliotheken sind zur Messung der Wetterdaten elementar.
Alle für dieses Projekt notwendigen Artikel landen mit einem Klick auf den Button direkt in deinem Warenkorb, sofern sie in unserem Shop verfügbar sind. Kontrolliere daher deinen Warenkorb genau!
Tutorial: Schritt für Schritt zur eigenen ESP32 Wetterstation
- Zuallererst musst du den Arduino Core für ESP32 installieren, damit der ESP32 in der Arduino IDE gefunden werden kann. Dazu öffnest du die Voreinstellungen und gibst anschließend im Feld „Zusätzliche Boardverwalter-URLs“ die URL https://dl.espressif.com/dl/package_esp32_index.json ein. Die Adresse für ESP8266-Boards lautet http://arduino.esp8266.com/stable/package_esp8266com_index.json. Mehrere URLs können mit einem Komma getrennt eingegeben werden.
- Unter den Menüpunkten „Board“ > „Boardverwalter“ kannst du das ESP32 Modul nun finden und installieren. Am einfachsten findet man das Modul mit der Eingabe on “ESP” in das Suchfenster.
- Im Anschluss musst du die beiden Bibliotheken für den Adafruit BME280 und den Adafruit unified Sensor installieren. Hierzu ist es notwendig, Arduino DIE zu öffnen. Wähle die Menüpunkte „Sketch“ „Bibliothek einbinden“ „Bibliotheken verwalten“ und installiere dann die Bibliotheken.
- Nun geht es an die Schaltung: Verbinde den Microcontroller und den BME280 Sensor mithilfe der GPIOs. Die Beschriftungen der Stiftleisten dienen hierbei als wertvolle Hilfe.
Die Pins verbindest du folgendermaßen miteinander:
- BME280 „VCC“ (+) pin mit ESP32 „3.3V“ pin verbinden.
- BME280 „GND“ (-) pin mit ESP32 „GND“ pin verbinden.
- BME280 „SCL“ pin mit ESP32 „D22“ pin verbinden.
- BME280 „SDA“ pin mit ESP32 „D21“ pin verbinden.
- Im nächsten Schritt lädst du den folgenden Code auf deinen ESP32. Bitte beachte, dass du deine WLAN SSID und dein Passwort im Code ergänzen musst. Der Code lautet folgendermaßen:
#include <WiFi.h>
#include <WebServer.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme;
float temperature, humidity, pressure, altitude;
//Geben Sie hier Ihre WLAN ssid und passwort ein
const char* ssid = "****";
const char* password = "****";
WebServer server(80);
void setup()
{
Serial.begin(115200);
delay(100);
bme.begin(0x76);
Serial.println("Verbinden mit ");
Serial.println(ssid);
//Verbindung herstellen
WiFi.begin(ssid, password);
//WIFI prüfen
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi verbunden..!");
Serial.print("IP= "); Serial.println(WiFi.localIP());
server.on("/", OnConnect);
server.onNotFound(NotFound);
server.begin();
Serial.println("Start");
}
//////////////////////////// Hauptprogramm
void loop() {
server.handleClient();
}
void OnConnect() {
temperature = bme.readTemperature();
humidity = bme.readHumidity();
pressure = bme.readPressure() / 100.0F;
altitude = bme.readAltitude(SEALEVELPRESSURE_HPA);
server.send(200, "text/html", SendHTML(temperature,humidity,pressure,altitude));
}
void NotFound(){
server.send(404, "text/plain", "Not found");
}
//////////////////////////// HTML Benutzeroberfläche
String SendHTML(float temperature,float humidity,float pressure,float altitude) //Send temperature , humidity , pressure und altitude
{
String str = "<!DOCTYPE html> <html>\n";
str +="<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
str +="<meta http-equiv=\"refresh\" content=\"2\">\n"; //Automatische Seitenaktualisierung
str +="<title>ESP32 Wetterstation</title>\n";
str +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
str +="h1 {color: #0000FF;}\n"; //
str +="body{margin-top: 50px;} h1 {color: #0000FF;margin: 50px auto 30px;}\n";
str +="p {font-size: 24px;color: #444444;margin-bottom: 10px;}\n";
str +="</style>\n";
str +="</head>\n";
str +="<body>\n";
str +="<div id=\"webpage\">\n";
str +="<h1>BME280 Wetterstation</h1>\n";
str +="<p>Temperature: ";
str +=temperature;
str +="°C</p>";
str +="<p>Humidity: ";
str +=humidity;
str +="%</p>";
str +="<p>Pressure: ";
str +=pressure;
str +="hPa</p>";
str +="<p>Altitude: ";
str +=altitude;
str +="m</p>";
str +="</div>\n";
str +="</body>\n";
str +="</html>\n";
return str;
}
Um den Code hochzuladen musst du zunächst das ESP32-Board mit deinem Computer verbinden und dann in der Arduino IDE dein Board auswählen („ESP32 Dev Module“ oder „DOITESP32 DEVKIT V1“):
Im nächsten Schritt musst du den Port auswählen, mit dem du deinen ESP32 mit deinem Computer verbunden hast. Unter Windows kannst du den richtigen Port auch über den Geräte-Manager unter dem Punkt Anschlüsse (COM & LTP) finden.
Unter Linux kannst du den Port mit Hilfe des Terminals und der folgenden Befehle finden:
ls /dev/ttyUSB*
# oder
ls /dev/ttyACM*
Nun gilt es, den Code für deine ESP32 Wetterstation zu laden: Dies wird durch Drücken des Buttons „Hochladen“ – rechts oben in der Ecke – veranlasst.
- Nachdem du den Code hochgeladen hast, musst du den seriellen Monitor mit einer Baudrate von 115200 öffnen, um auf den Webserver zugreifen zu können. Den seriellen Monitor kannst du in der Arduino IDE mit einem Klick auf den Button rechts oben öffnen. Die Baudrate des Monitors kann mit der Tastenkombination STRG + T, b, 115200 geändert werden. Drücke anschließend die Taste EN auf deinem ESP32. Sofern keine Probleme vorliegen, wird die dynamische IP-Adresse, die dein Router erhalten hat, ausgegeben, woraufhin dir die Meldung „Start“ angezeigt wird.
- Zuletzt musst du nur noch einen Browser laden und die IP-Adresse eingeben, die dir auf dem seriellen Monitor angezeigt wird. Jetzt kannst du die gemessenen Werte im Interface auslesen.
Mögliche Fehler
Wenn du den Sketch genannten Code auf deinen ESP32 laden möchtest und die Fehlermeldung
“A fatal error occurred: Failed to connect to ESP32: Timed
out… Connecting…“.
erhälst, bedeutet dies, dass dein Arduino nicht im flashing/uploading Modus ist. Wenn du in der Arduino IDE das richtige Board und den richtigen Anschluss ausgewählt hast, musst du den “Boot” Button am ESP32 gedrückt halten um das Problem zu lösen.
Geschafft! Deine ESP32 Wetterstation ist einsatzbereit
Glückwunsch, deine eigene ESP32 Wetterstation ist nun funktionsfähig! Tipp: Platziere deine neue Konstruktion am besten nicht in der Nähe von Heizungsrohren oder an Orten, die übermäßig viel direkte Sonneneinstrahlung abbekommen. Dies könnte nämlich die Temperaturmessung verfälschen. Eine Wand an der Nordseite deiner Wohnung eignet sich hingegen bestens als Standort.
Wir wünschen dir viel Spaß mit deiner Wetterstation und hoffen dir noch viele weitere Inspirationen für künftige Projekte lieferen zu können.
Solltest du Fragen zu diesem Projekt haben, kannst du diese gerne mit Hilfe der Kommentarfunktion an uns richten.
Euer BerryBase-Team!
Falls dich Projekte mit der Arduino IDE interessieren, schaue dir hier auch unsere weiteren Tutorials an.
Cool, aber nur mal eine kurze Frage, werden auch negative Temperaturen mit Minuszeichen angezeigt?
Ja negative Temperaturen sollten auch angezeigt werden.
Viele Grüße,
dein BerryBase-Team
Danke und ein Frohes Fest…..
Das wünschen wir ebenfalls! 🙂
Cooler Beitrag, aber irgendwie bin ich zu blöd, welche Bibliotheken müssen denn noch hinzugefügt werden? Oben steht 5 x #include aber im oberen Bereich ist nur die Rede von zwei? Bei mir fehlt immer die Bibliothek zu WebServer server(80). Aber sonst ne Mega Sache!
Cooler Beitrag, aber irgendwie bin ich zu blöd, welche Bibliotheken müssen denn noch hinzugefügt werden? Oben steht 5 x #include aber im oberen Bereich ist nur die Rede von zwei? Bei mir fehlt immer die Bibliothek zu WebServer server(80). Aber sonst ne Mega Sache!
Der Punkt “Bibliotheken einbinden/Bibliotheken verwalten” lädt die entsprechenden Bibliotheken in deine lokale Arduino IDE, die #include Anweisung im Code sorgt dann später dafür, dass die entsprechende Bibliothek beim compilieren genutzt wird. Das ist das Grundschema, dein Problem ist aber ein anderes…die wifi.h und webserver.h sind in deinem Fall noch nicht definiert und sind ggfs. durchaus Boardspezifisch. Solltest Du z.B. einen ESP8266 nutzen und dafür wie ganz am Anfang beschrieben unter Boardverwalter die entsprechenden Einträge gemacht und das ESP8266 Paket installiert haben, dann kannst Du im Quellcode vor “WiFi.h” direkt “ESP8266” einsetzen – also steht dann da “ESP8266WiFi.h” und das gleiche beim WebServer.h -> “ESP8266WebServer.h” und dann beim Aufruf der Funktion ein paar Zeilen weiter wird aus “WebServer server(80);” einfach “ESP8266WebServer server(80);” und schon sollte das klappen!
Moin!
Fange gerade mit dem 32er an…
Ihr Projekt ist soweit gut (hatte ich schon mit meinen ersten Versuchen) Arduino schon mal gemacht.
wie sieht es mit einem TFT Display und einem Gewittermelder aus?
Das Versuche ich bis dato erfolglos , Mangels Zeit (nur im Urlaub und in der Winterruhe) das wäre mein Finaler Abschluss.
Ich bin Gärtner, ich wollte mir schon was Fertiges Kaufen aber selber was Bauen macht mir mehr Spaß.
Gärtner ist zur Zeit meine Not Beschäftigung.
Kennt ihr eine Passende Seite / Literatur?
Mercy!
Hallo, ich würde es interessant finden, die Daten auch aufzeichnen zu können und
ggf. dann mit zb. Excel auswerten und grafisch darstellen zu können. Gibt es dazu
ein Projekt???
beste Grüße / Wilfried
Liebe Community,
benötige Hilfe beim letzten Schritt.
Arduino installiert .
Alle lib installiert.
Richtig verkabelt.
Programm in Sketch.
Baud serielle Monitor läuft.
Verbindung mit Handy über WLAN Hotspot.
IP Adresse wird in serielle Monitor angezeigt.
Wo ist dies nun einzugeben, um eine ordentliche Anzeige zu erhalten.
IP Eingabe auf Handy keine Seite baut sich auf.
IP Eingabe auf Laptop keine Eingabe.
Freue mich auf schnelle Hilfe
Vielen Dank
Vielen lieben Dank.
Läuft auch auf dem ESP8266 (D1 Mini) super. Nur wurde das °-Symbol im Browser falsch angezeigt (davor war ein a).
Daher habe ich folgende Änderung ab Zeile 95 vorgenommen:
str =”°”; //° Grad-Symbol
str =”C”;
Viele Grüße!
Ich habe das Projekt geladen und es funktioniert auch wie beschrieben aber nur im Browser. Wie kann ich es ändern damit ich die Daten auf mein Smartphone im Browser lesen kann?
Danke für eine Antwort.
Peter
Das Projekt ist daran unschuldig. Basic Networking: Wenn Dein Schlaufon nicht im selben WLAN ist wie die Schaltung, steht Dir Dein Router im Wege. Quick&Dirty: Port-Weiterleitung auf dem Router einrichten (LASS ES! Damit lädst Du jedes Scriptkiddie der Welt ein, Deinem Netz eínen Besuch abzustatten). Oder halt die Daten von einer HomeAutomation scrapen lassen und das “Veröffentlichen” der überlassen. Oder … braucht alles ein wenig Vorwissen 🙂
Hallo Till,
ich verwende auch den esp8266. Welche digitalen Anschlüsse hast du verwendet?
Ich war der Meinung, dass diese definiert werden müssen, kann aber dazu im Code nichts finden.
3,3 Volt und Ground sind wohl klar. Ich habe noch D1 und D2 versucht, bringt aber kein Ergebnis.
Viele Grüße
Hans-Jürgen
I2C-“Ports” sind vordefiniert. Die Ports hier sind halt GPIO21 = I2C1 DA und GPIO22 = I2C1 CL.
Wer’s klein mag und ein D1 Mini verwenden will: Das verfügt über kein Hardware TWI (Two Wire Interface), sondern hat es in Software implementiert. Das bedeutet, dass man so ziemlich jede zwei digitalen Pins verwenden können. Standardmäßig verwendet die I²C-Bibliothek Pin 4 als SDA und Pin 5 als SCL. (Das Datenblatt spezifiziert GPIO2 als SDA und GPIO14 als SCL).
Du musst also im Datenblatt des von Dir verwendeten 8266-Controllers nachsehen, was da für I2C vorgesehen ist
Nachtrag: Hab die Schaltung mal mit einem XIAO_ESP32S3 gebaut (https://www.seeedstudio.com/XIAO-ESP32S3-p-5627.html). Weil, ist klein, ist ESP32 (https://nextcloud.mpi-inf.mpg.de/index.php/s/eRkwoC69Kq4dBTS). Jetzt noch ein Akku mit Laderegler, 3D-Druck-Gehäuse und irgendwo im Garten aufhängen.
BTW, das “°” verweigerte bei mir hartnäckig den Dienst. Mit “°” ersetzen, geht. 🙂
Das macht richtig Lust, zu experimentieren. Wie erfolgt die Stromversorgung?
Kann man die Ausgabe in eine Datei umleiten, speichern und später auslesen?