Arduino Nano Wetterstation: Sensor-Kit & OLED-Display
Komponenten und Zubehör
- 1× Arduino Nano R3
- 1× BMP280 Barometer-Sensor (I2C/SPI, z. B. Seeed Grove)
- 1× DHT11 Temperatur- & Feuchtesensor (4 Pins)
- 1× 0,96″ OLED Display 128×64 (I2C, z. B. ElectroPeak)
- 1× GUVA-S12SD UV-Sensor (analog)
- 1× DS3231 RTC-Modul (I2C)
Benötigte Werkzeuge
- Lötkolben + bleifreies Lötzinn
- 3D-Drucker (für Gehäuse, z. B. Ender 3, PLA, 20 % Infill, 70 mm/s, Supports nötig)
Software
- Arduino IDE
- Autodesk Fusion 360 (Gehäuse-Design, STL-Datei im Projekt enthalten)
Projektüberblick
Eine lokale Wetterstation ohne Internetzugang: Misst Luftdruck, Temperatur, Luftfeuchte, UV-Index (bei Fenstermontage) und zeigt Uhrzeit, Datum, Wochentag an. Alle Daten auf einem 0,96″ OLED-Display in 4 Seiten mit 5 s Wechselintervall.








Schritt 1: Gehäuse drucken


STL-Datei im Projekt enthalten. Grünes PLA, 20 % Infill, Supports, 70 mm/s auf Ender 3.
Schritt 2: BMP280 (SPI-Modus)
Verdrahtung: CS→D10, SDA(MOSI)→D11, SDO(MISO)→D12, SCK→D13.
Bibliothek: Adafruit_BMP280. Initialisierung im setup(), Auslesen im loop() mit bmp.readPressure() (Pa → /100 = hPa), bmp.readTemperature(), bmp.readAltitude(1005.47) (lokalen Mittelwert-Druck in hPa einsetzen).
Schritt 3: DS3231 RTC (I2C)
Verdrahtung: SCL→A5, SDA→A4.
Zeit einmalig mit DS3231_set.ino (Bibliotheks-Beispiel) stellen. Bibliothek DS3231.h, Wochentag per switch über clock.getDoW() (1=Samstag … 7=Freitag).
Schritt 4: DHT11
Data-Pin → D2. Bibliothek DHT.h, dht.readHumidity().
Schritt 5: GUVA-S12SD UV-Sensor
Analogausgang (kalibrierte Spannung proportional zu UV-Intensität, 240–370 nm). An A0 anschließen.
float sensorValue = analogRead(A0);
float sensorVoltage = sensorValue / 1024.0 * 5.0;
int UV_index = sensorVoltage / 0.1; // 0,1 V pro UV-Index-Stufe
Schritt 6: OLED-Display (I2C, 128×64, SSD1306)
SCK→A5, SDA→A4 (gemeinsamer I2C-Bus mit RTC & BMP280).
Bibliotheken: Adafruit_GFX.h, Adafruit_SSD1306.h, Fonts FreeSans9pt7b, FreeMonoBoldOblique12pt7b. Bitmaps für Icons (Rahmen, Sonne, etc.) im Flash (PROGMEM).
Anzeigeschleife: 4 Seiten (Zeit, Druck/Höhe, Temp/Feuchte, UV-Index), je 5 s, display.clearDisplay() + Neuaufbau.
Kompletter Code
#include <Wire.h> #include <SPI.h> #include <Adafruit_BMP280.h> #include <DS3231.h> #include <DHT.h>
#include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <Fonts/FreeSans9pt7b.h> #include <Fonts/FreeMonoBoldOblique12pt7b.h>
#define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET 4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define BMP_SCK 13 #define BMP_MISO 12 #define BMP_MOSI 11 #define BMP_CS 10
DS3231 clock; bool century=false, h12Flag, pmFlag;
Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK);
#define DHTPIN 2 #define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
// PROGMEM Bitmaps frame0, frame1, frame2 ... (siehe Original)
void setup() {
Serial.begin(57600);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("SSD1306 failed")); }
Wire.begin(); dht.begin();
if(!bmp.begin()) { Serial.println(F("Problem.bmp")); while(1) delay(10); }
// Startbildschirm
display.clearDisplay(); display.setTextColor(WHITE); display.setTextSize(1);
display.setCursor(0,9); display.setFont(&FreeSans9pt7b); display.println("**** LOCAL ****");
display.setCursor(0,38); display.setFont(&FreeMonoBoldOblique12pt7b); display.println("wather");
display.setCursor(27,58); display.println("Station"); display.display(); delay(2000);
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, Adafruit_BMP280::SAMPLING_X2,
Adafruit_BMP280::SAMPLING_X16, Adafruit_BMP280::FILTER_X16,
Adafruit_BMP280::STANDBY_MS_500);
}
void loop() {
// Seite 1: Zeit
display.clearDisplay(); display.setTextColor(WHITE); display.setTextSize(1);
display.setCursor(13,15); display.setFont(&FreeMonoBoldOblique12pt7b);
display.print(clock.getHour(h12Flag,pmFlag)); display.setCursor(38,15); display.println(":");
display.setCursor(50,15); display.println(clock.getMinute());
display.setCursor(70,15); display.println(pmFlag?" PM":" AM ");
display.setFont(&FreeSans9pt7b); display.setCursor(20,60); display.println(clock.getDate());
display.setCursor(40,60); display.println("/"); display.setCursor(46,60); display.println(clock.getMonth(century));
display.setCursor(65,60); display.println("/"); display.setCursor(70,60); display.println("20");
display.setCursor(90,60); display.println(clock.getYear());
display.setCursor(30,30); display.setFont(&FreeSans9pt7b);
switch(clock.getDoW()){ case 1:display.println("Saturday");break; case 2:display.println("Sunday");break;
case 3:display.println("Monday");break; case 4:display.println("Tuesday");break;
case 5:display.println("Wednesday");break; case 6:display.println("Thursday");break;
case 7:display.println("Friday");break; }
display.display(); delay(5000);
// Seite 2: Druck & Höhe
display.clearDisplay(); display.drawBitmap(0,0,frame0,40,40,1);
display.setFont(&FreeSans9pt7b); display.setCursor(41,28); display.println(bmp.readPressure()/100);
display.setCursor(110,28); display.setFont(); display.println("hPa");
display.setCursor(0,55); display.setFont(&FreeSans9pt7b); display.println("Altitude:");
display.setCursor(65,62); display.println(bmp.readAltitude(1005.47)); display.setCursor(113,62); display.println("m");
display.display(); delay(5000);
// Seite 3: Temp & Feuchte
display.clearDisplay(); display.setFont(&FreeMonoBoldOblique12pt7b);
display.drawBitmap(0,5,frame1,40,51,1);
display.setCursor(35,30); display.print(bmp.readTemperature());
display.setFont(&FreeSans9pt7b); display.setCursor(102,28); display.println(" *"); display.setCursor(110,31); display.println(" C");
display.setFont(); display.setCursor(66,45); display.println("RH :");
byte RH = dht.readHumidity(); display.setCursor(95,45); display.println(RH); display.setCursor(110,45); display.println("%");
display.drawBitmap(0,56,frame2,135,15,1); display.display(); delay(5000);
// Seite 4: UV-Index
display.clearDisplay();
float sensorValue = analogRead(A0);
float sensorVoltage = sensorValue / 1024.0 * 5.0;
int UV_index = sensorVoltage / 0.1;
display.setFont(&FreeSans9pt7b); display.setCursor(0,15); display.print(" UV INDEX ");
display.setCursor(58,45); display.println(UV_index); display.display(); delay(5000);
}
Schaltplan

Herstellungsprozess
- DIY Solar-betriebene Wetterstation mit Raspberry Pi
- Outdoor-Wetterstation mit Raspberry Pi 2 & ADS-WS1 bauen
- Raspberry Pi Wetterstation bauen, die tägliche Wetterdaten per E-Mail sendet
- Fortgeschrittene Wetterstation v2.0: Echtzeit Temperatur, Druck, Feuchte & Höhe Monitoring
- Arduino-gesteuerte 6-Shot-Getränkemischstation – Bauen Sie Ihren eigenen Cocktail-Automaten
- Multi-Position Temperatursensor-System für Smart-Home-Integration
- Hochleistungs-Datenlogger für Arduino-Wetterballons
- Tragbare Arduino-Wetterstation für 10$ bauen (Nano, DHT22, BMP180 & LCD)
- Wetterstation mit Arduino & ThingSpeak IoT (DHT11 + ESP8266)
- WiFi-Wetterstation mit ESP8266 & DHT22 – Daten zu ThingSpeak