Arduino UNO Mini-Wetterstation – DIY-Sensor-Hub mit ESP8266 IoT
Komponenten und Zubehör
- 1× Arduino UNO
- 1× ESP8266 ESP-01 (WiFi-Modul)
- 1× Arduino Proto Shield (oder Steckbrett)
- 1× DHT22 Temperatur-/Feuchtesensor
- 1× Grove Light Sensor (oder BH1750)
- 1× Grove UV Sensor (GUVA-S12SD)
- 1× Grove Barometer Sensor (BMP085/BMP180)
- 1× Grove Dust Sensor (GP2Y1010AU0F)
- Widerstände: 2× 1 kΩ, 1× 10 kΩ, 1× 4,75 kΩ
- Steckbrücken, USB-Kabel / Netzteil
Software & Cloud
- Arduino IDE
- ThingSpeak Account (Kanal mit 7 Feldern)
- Bibliotheken:
DHT,Adafruit_BMP085_Unified,SoftwareSerial - Android-App: ThingsView (Google Play)
Projektbeschreibung
Eine kompakte Wetterstation, die sieben Umweltparameter misst und per ESP8266 an ThingSpeak sendet. Stromversorgung über USB (PC oder Ladegerät). Kein Gehäuse im Scope – Fokus auf Sensorik & Datenübertragung.
Gemessene Größen & Sensoren
| Größe | Sensor | ThingSpeak Feld |
|---|---|---|
| Temperatur (°C) | DHT22 | Field 3 |
| Luftfeuchte (%) | DHT22 | Field 2 |
| Atmosphärendruck (hPa) | BMP085 | Field 6 |
| Lichtstärke (analog) | Grove Light | Field 1 |
| UV-Index | Grove UV | Field 4 |
| Feinstaubkonzentration (pcs/0.01cf) | Grove Dust | Field 5 |
| Temperatur 2 (°C) | BMP085 | Field 7 |
Verdrahtung
Alle Sensoren gemäß Schaltplan auf Proto Shield / Breadboard verdrahten. ESP-01 an SoftwareSerial (Pins 10=RX, 11=TX). Dust-Sensor an Pin 8 (Pulsweitenmessung). I2C-Sensoren (BMP085) an A4/A5. DHT22 an Pin 2.
ThingSpeak Einrichtung
- Bei ThingSpeak registrieren → Neuen Channel anlegen.
- 7 Felder definieren (Namen wie Tabelle oben).
- Write API Key kopieren → in Code als
ZZZZZeintragen. - WLAN-SSID (
XXXXX) & Passwort (YYYYY) im Code setzen. - Code hochladen → Station sendet alle 60 s Daten (30 s Messzyklus für Feinstaub).
Android-App ThingsView
- App installieren → Channel ID eingeben → „Add“.
- Graphische Anzeige aller 7 Variablen in Echtzeit.
Arduino-Code (weatherBox.ino)
#include
#include
#include
#include
#include
#include
#define SSID "XXXXX" // WLAN SSID
#define PASS "YYYYY" // WLAN Passwort
#define IP "184.106.153.149" // api.thingspeak.com IP
#define DHT22_PIN 2
String GET = "GET /update?key=ZZZZZ&field1="; // Write API Key
SoftwareSerial monitor(10, 11); // RX, TX zu ESP8266
dht DHT;
Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085);
// Pins
int luminancePin = A0;
int uvPin = A1;
int dustPin = 8;
unsigned long duration, starttime;
unsigned long sampletime_ms = 30000; // 30 s Feinstaub-Sampling
unsigned long delay_time = 60000; // 60 s Sendeintervall
unsigned long lowpulseoccupancy = 0;
float ratio = 0, concentration = 0;
void setup() {
Serial.begin(9600);
monitor.begin(9600);
Serial.println("Initializing...");
pinMode(dustPin, INPUT);
// BMP085
Serial.println("Detecting BMP085...");
if (!bmp.begin()) {
Serial.println("BMP085 nicht gefunden! Verkabelung/I2C prüfen.");
while (1);
}
Serial.println("BMP085 OK!");
// ESP8266 Kommunikation testen
monitor.flush();
monitor.println("AT");
delay(2000);
if (monitor.find("OK")) Serial.println("ESP8266: OK");
else Serial.println("ESP8266 ERROR");
connectWiFi();
Serial.print("Sampling ("); Serial.print(sampletime_ms/1000); Serial.println("s)...");
starttime = millis();
}
void loop() {
// Feinstaub: Low-Pulse-Occupancy messen
duration = pulseIn(dustPin, LOW);
lowpulseoccupancy += duration;
// Alle 30 s Feinstaub berechnen & alle Sensoren senden
if ((millis() - starttime) >= sampletime_ms) {
ratio = lowpulseoccupancy / (sampletime_ms * 10.0); // %
concentration = 1.1*pow(ratio,3) - 3.8*pow(ratio,2) + 520*ratio + 0.62; // Datenblatt-Formel
lowpulseoccupancy = 0;
// Andere Sensoren lesen
char buf[10];
float luminance = analogRead(luminancePin);
float uv = analogRead(uvPin) * 0.0049 * 307 / 200; // UV-Index Berechnung
int chk = DHT.read22(DHT22_PIN);
float humidity = DHT.humidity;
float temperature = DHT.temperature;
sensors_event_t event;
bmp.getEvent(&event);
float pressure = 0, temperature1 = 0;
if (event.pressure) {
pressure = event.pressure;
bmp.getTemperature(&temperature1);
}
// Strings formatieren (ohne Leerzeichen)
String luminanceStr = dtostrf(luminance, 4, 1, buf); luminanceStr.replace(" ", "");
String uvStr = dtostrf(uv, 4, 1, buf); uvStr.replace(" ", "");
String humidityStr = dtostrf(humidity, 4, 1, buf); humidityStr.replace(" ", "");
String tempStr = dtostrf(temperature, 4, 1, buf); tempStr.replace(" ", "");
String dustStr = dtostrf(concentration, 4, 1, buf); dustStr.replace(" ", "");
String pressureStr = dtostrf(pressure, 4, 1, buf); pressureStr.replace(" ", "");
String temp1Str = dtostrf(temperature1, 4, 1, buf); temp1Str.replace(" ", "");
// An ThingSpeak senden
updateSensors(luminanceStr, humidityStr, tempStr, uvStr, dustStr, pressureStr, temp1Str);
Serial.print("Wait "); Serial.print(delay_time/1000); Serial.println("s for next sampling");
delay(delay_time);
Serial.println(); Serial.print("Sampling ("); Serial.print(sampletime_ms/1000); Serial.println("s)...");
starttime = millis();
}
}
void updateSensors(String l, String h, String t, String uv, String d, String p, String t1) {
String cmd = "AT+CIPSTART=\"TCP\",\""; cmd += IP; cmd += "\",80";
monitor.println(cmd); delay(2000);
cmd = GET; cmd += l; cmd += "&field2="; cmd += h; cmd += "&field3="; cmd += t;
cmd += "&field4="; cmd += uv; cmd += "&field5="; cmd += d; cmd += "&field6="; cmd += p;
cmd += "&field7="; cmd += t1; cmd += "\r\n";
delay(1000);
int len = cmd.length();
monitor.println("AT+CIPSEND=" + String(len)); delay(2000);
monitor.print(cmd);
if (monitor.find("OK")) Serial.println("Transmission OK");
else Serial.println("Transmission failed!");
}
boolean connectWiFi() {
Serial.println("Connecting WiFi...");
monitor.println("AT+CWMODE=1"); delay(2000);
monitor.flush();
String cmd = "AT+CWJAP=\""; cmd += SSID; cmd += "\",\""; cmd += PASS; cmd += "\"";
monitor.println(cmd); delay(5000);
if (monitor.find("OK")) { Serial.println("WiFi connected!"); return true; }
else { Serial.println("WiFi failed!"); return false; }
}
Wichtige Hinweise
- ESP-01 benötigt stabile 3,3 V (max. 300 mA Peak) – nicht vom Arduino 3,3 V Pin! Eigenen Regler (AMS1117) nutzen.
- Dust-Sensor: 30 s Sampling (Low-Pulse-Occupancy) nach Datenblatt Sharp GP2Y1010AU0F.
- UV-Berechnung: Grobe Umrechnung Analog→Volt→mW/m²→Index. Für präzise Werte Kalibrierung nötig.
- ThingSpeak Free: 15 s Mindestintervall – hier 60 s gewählt.
- Code nutzt SoftwareSerial für ESP8266; Hardware-Serial (Pins 0/1) bleibt für Debug frei.
Herstellungsprozess
- Raspberry Pi Wetterstation bauen, die tägliche Wetterdaten per E-Mail sendet
- Arduino-Uno-Roboter zur Personenerkennung – Sensorintegration Schritt für Schritt
- K30 CO₂-Sensor: Echtzeit-Luftqualitätsmessung mit Arduino
- Digitales Stadiometer bauen: Körpergröße messen mit Arduino & Lasersensor VL53L0X
- Arduino UNO WiFi Webserver: LED per Browser steuern
- Einfacher Taschenrechner mit Arduino UNO – Einsteigerprojekt
- Sensorturm mit Arduino Cloud: Temperatur, Bewegung & Gase überwachen
- Tragbares Persistence-of-Vision-Display mit Arduino UNO und ATtiny85 bauen
- Arduino Nano Wetterstation: Sensor-Kit & OLED-Display
- Smart Health Monitoring Station: Arduino, Bluetooth und Sensoren