← Alle Projekte

Wetterstation mit OLED-Display

Mittel

Eine kleine Wetterstation, die Temperatur, Luftfeuchtigkeit und Luftdruck misst und auf einem OLED anzeigt. Drei Sensoren werden kombiniert, zwei davon ueber I2C. Eigenes Projekt von arduino.lehrstun.de — keine externe Anleitung noetig.
Dauer: ca. 90 Minuten.
Quelle: Eigenes Projekt von arduino.lehrstun.de

Bauteile aus eurem Kasten: DHT22 (AM2302) BMP280 OLED Display SSD1306 (0.96 Zoll) Breadboard (Steckbrett) Jumperkabel-Set Widerstand 10 kOhm

Zusaetzlich: Breadboard, Jumperkabel

Anleitung

Was du am Ende hast: Ein kleines Geraet, das die aktuelle
Temperatur, Luftfeuchtigkeit und den Luftdruck auf einem
kleinen Display anzeigt — neu gemessen alle paar Sekunden. Daraus
kannst du sogar das Wetter vorhersagen (faellt der Druck, kommt
Regen).

Was du brauchst

  • Arduino Uno + USB-Kabel
  • BMP280 Sensor (Druck und Temperatur, I2C)
  • DHT22 Sensor (Temperatur und Luftfeuchtigkeit, 1-Wire)
  • OLED-Display SSD1306 0.96 Zoll (I2C, 128 x 64 Pixel)
  • Breadboard + ca. 10 Jumperkabel
  • 10 kOhm-Widerstand als Pull-Up fuer DHT22 (manche Module haben
    ihn schon eingebaut — siehe Bauteile)

So funktioniert es

Drei Sensoren, zwei verschiedene Schnittstellen:

  • I2C (eine Datenleitung SDA + Takt SCL): Daran haengen sowohl der
    BMP280 (Adresse 0x76) als auch das OLED (Adresse 0x3C) —
    beide gleichzeitig auf denselben zwei Kabeln. Das ist der Vorteil
    von I2C: viele Geraete teilen sich einen Bus.
  • 1-Wire (proprietaer): Der DHT22 braucht eine eigene
    Datenleitung, weil er ein eigenes Protokoll spricht.

Der Sketch fragt alle drei Sensoren der Reihe nach ab und schreibt die
Werte ins Display.

Schritt fuer Schritt

1. Bibliotheken installieren

In der Arduino-IDE: Werkzeuge -> Bibliotheken verwalten. Such nach
und installiere folgende vier:

  • Adafruit BMP280 Library (von Adafruit)
  • DHT sensor library (von Adafruit)
  • Adafruit SSD1306 (von Adafruit)
  • Adafruit GFX Library (wird automatisch nachgefragt)

2. Schaltung aufbauen

Auf dem Breadboard verteilen, alle drei Sensoren parallel mit 5V und
GND versorgen. Dann:

Bauteil Pin am Bauteil Pin am Arduino
BMP280 VCC 5V
BMP280 GND GND
BMP280 SDA A4
BMP280 SCL A5
OLED VCC 5V
OLED GND GND
OLED SDA A4 (gleicher Bus!)
OLED SCL A5 (gleicher Bus!)
DHT22 VCC (1) 5V
DHT22 DATA (2) D2
DHT22 GND (4) GND

Wichtig: Zwischen DATA und VCC am DHT22 einen 10-kOhm-Widerstand
einbauen (Pull-Up) — sonst kommen keine Werte. Manche DHT22-Module
haben den schon drauf.

3. Sketch hochladen

Den Sketch unten kopieren, hochladen, Seriellen Monitor auf 9600
Baud oeffnen. Das OLED sollte nach ein paar Sekunden Werte zeigen.

4. Pruefen und kalibrieren

  • Vergleiche Temperatur mit dem Schul-Thermometer im Raum. Liegen
    beide Sensoren (BMP280 + DHT22) zusammen? Sind die Werte plausibel?
  • Halt den Daumen auf den DHT22 (nicht zu fest druecken!) — die
    Feuchte sollte langsam steigen.
  • Geh mit dem ganzen Aufbau ein paar Stockwerke nach oben oder
    unten
    : der Luftdruck aendert sich (rund 1 hPa pro 8 Meter
    Hoehenunterschied).

5. Erweiterungen

  • Hoehenmeter anzeigen: aus der Druckdifferenz zur Meereshoehe
    laesst sich die Hoehe ueber Normal-Null berechnen.
  • Trend-Anzeige: speicher die letzten 10 Druckwerte; wenn der Druck
    faellt -> Regen-Symbol, wenn er steigt -> Sonne.
  • Min/Max merken: zeig zusaetzlich die hoechste und niedrigste
    Temperatur seit dem Einschalten.
  • Datenlogger: jede Minute eine Zeile in den Seriellen Monitor
    schreiben, dann am PC mitschneiden und ein Diagramm draus machen.

Aufbau

Aufbau-Bild folgt

Was du dabei lernst:
Drei Sensoren in einem Sketch kombinieren | I2C-Bus mit zwei Geraeten teilen | Bibliotheken installieren und nutzen | Display formatiert ansteuern | Werte plausibilisieren

Der Sketch

Lies die Kommentare hinter // mit — dort steht, was jede Zeile macht.

// Wetterstation — BMP280 + DHT22 + OLED SSD1306
// Arduino Uno, alles parallel (BMP280 + OLED auf I2C, DHT22 auf D2).

#include <Wire.h>                  // I2C (eingebaut, kein Install noetig)
#include <Adafruit_BMP280.h>       // Druck + Temperatur
#include <Adafruit_SSD1306.h>      // OLED-Treiber
#include <DHT.h>                   // DHT22

#define DHTPIN 2
#define DHTTYPE DHT22

Adafruit_BMP280 bmp;               // I2C-Adresse 0x76 (Default 0x77)
Adafruit_SSD1306 oled(128, 64);    // 128x64 Pixel
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);

  // OLED starten (Adresse 0x3C beim 0.96"-Modul)
  if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println("OLED nicht gefunden!");
    while (true);  // hier haengen bleiben
  }
  oled.clearDisplay();
  oled.setTextColor(SSD1306_WHITE);
  oled.setTextSize(1);

  // BMP280 starten — die meisten Breakouts antworten auf 0x76
  if (!bmp.begin(0x76)) {
    Serial.println("BMP280 nicht gefunden!");
    oled.setCursor(0, 0); oled.print("BMP280 fehlt!");
    oled.display();
    while (true);
  }

  dht.begin();
}

void loop() {
  // Drei Sensoren auslesen
  float t_dht  = dht.readTemperature();
  float feucht = dht.readHumidity();
  float t_bmp  = bmp.readTemperature();
  float druck  = bmp.readPressure() / 100.0;   // Pa -> hPa

  // Auf Seriellen Monitor (zur Kontrolle)
  Serial.print("T(DHT)=");  Serial.print(t_dht,  1);
  Serial.print("C  T(BMP)="); Serial.print(t_bmp,  1);
  Serial.print("C  Feucht="); Serial.print(feucht, 0);
  Serial.print("%  Druck=");  Serial.print(druck,  1);
  Serial.println(" hPa");

  // OLED neu zeichnen
  oled.clearDisplay();

  oled.setCursor(0, 0);
  oled.setTextSize(2);
  oled.print(t_dht, 1); oled.print((char)247);  // Grad-Zeichen
  oled.print("C");

  oled.setCursor(0, 22);
  oled.setTextSize(1);
  oled.print("Feuchte: "); oled.print(feucht, 0); oled.print(" %");

  oled.setCursor(0, 36);
  oled.print("Druck:   "); oled.print(druck, 1); oled.print(" hPa");

  oled.setCursor(0, 50);
  oled.print("BMP-T:   "); oled.print(t_bmp, 1); oled.print(" C");

  oled.display();

  delay(2000);   // alle 2 Sekunden — DHT22 mag nicht oefter
}
Hilfe wenn's haengt

OLED zeigt nichts — pruef die I2C-Adresse. 0.96"-OLEDs sind meist
0x3C, manche aber 0x3D. Mit dem klassischen I2C-Scanner-Sketch
findest du die richtige Adresse.

BMP280 nicht gefunden — teste 0x76 und 0x77. Der I2C-Scanner zeigt
beide Adressen, falls beide Geraete am Bus haengen.

DHT22 zeigt nan (not a number) — meistens fehlt der
Pull-Up-Widerstand (10 kOhm) zwischen DATA und VCC. Auch zu kurze
Wartezeit zwischen Messungen kann das ausloesen — delay(2000) ist das
Minimum.

Druck-Werte wirken zu hoch (~990 hPa)? Das ist normal — der
"Standard-Luftdruck auf Meereshoehe" ist 1013 hPa, jeder Hoehenmeter
nach oben senkt ihn um ca. 0,12 hPa.

OLED flackert — kuerze delay() nicht. Das OLED-Display braucht
Zeit zum Neuzeichnen, dauerhaftes Loeschen + Neuzeichnen ohne Pause
sieht haesslich aus.

Festgefahren? KI-Tipps Troubleshooting