Smarte Wetterstation mit Arduino UNO und AWS-Integration bauen
Komponenten und Zubehör
| Komponente | Beschreibung | Anzahl |
|---|---|---|
| Arduino UNO | Mikrocontroller | 1 |
| USB-A auf Micro-USB Kabel | Programmierung/Strom | 1 |
| Steckbrett (generic) | Aufbau | 1 |
| Jumper-Kabel (generic) | Verbindungen | 1 |
| Plexiglas 4 mm | Gehäuse | 1 |
| Widerstand 221 Ohm | Für LCD-Hintergrundbeleuchtung | 1 |
| Adafruit Standard LCD - 16x2 Weiß auf Blau | Anzeige | 1 |
| Maxim DS1307 RTC (I²C) | Echtzeituhr | 1 |
| Fotowiderstand (LDR) | Lichtmessung | 1 |
| DHT11 Temp. & Feuchtigkeitssensor (4 Pins) | Umgebungssensor | 1 |
| Temperatursensor (LM35) | Präzise Temperaturmessung | 1 |
| IR-Empfänger (generic) | Für Fernbedienung | 1 |
| Wasserstandssensor | Flüssigkeitspegel | 1 |
| Sunfounder Starter RFID Kit | Zusatzkomponente | 1 |
Notwendige Werkzeuge und Maschinen
- Lasercutter (generic) - Für Gehäusebau
Über dieses Projekt
AWS (Arduino Weather Station) liefert präzise Rund-um-die-Uhr-Umweltdaten. Basiert auf Arduino-Mikrocontroller und unterstützt einen vollständigen Sensorsatz für Umgebungsanalyse.
Ziel
Ziel der Steuereinheit ist die Erfassung von Sensordaten und Anzeige über ein LCD-Display. Die kompakte Bauweise ermöglicht den Einbau in ein kleines, per Lasercutter gefertigtes Gehäuse.
Verwendete Sensoren
Bilder der Sensoren sind im Originalprojekt enthalten.
Wasser- und Schneepegel-Sensor
Zeigt Wasserstand in Überkopftanks an, verhindert Überlauf und ermöglicht jederzeitige Standabfrage.
DHT11 Feuchtigkeits- und Temperatursensor
Kalibrierter digitaler Sensor mit hoher Zuverlässigkeit, Langzeitstabilität, schneller Reaktion, Störfestigkeit und niedrigem Kosten.
Fotowiderstand (LDR)
Lichtabhängiger Widerstand zur Erkennung von Lichtpräsenz/-abwesenheit oder Lichtintensitätsmessung. Hoher Widerstand im Dunkeln, starker Abfall bei Lichteinfall.
LCD I2C 1602 Display
Serieller Bus mit nur zwei bidirektionalen Leitungen (SDA, SCL). Blauer Potentiometer zur Hintergrundbeleuchtungsjustierung. Typische Spannungen +5V oder +3.3V.
DS1302 Echtzeituhr-Modul
Basiert auf DS1302-Chip mit Echtzeituhr/Kalender und 31 Bytes statischem RAM. Zeitformat hh/mm/ss, Datumsformat yyyy/mm/dd.
LM35 Temperatursensor
Präzisionssensor. ADC wandelt analog in digital um: ADC-Wert = Sample * 1024 / Referenzspannung (+5V). Bei +5V Referenz: Digitalwert = Eingangsspannung * 205.
Infrarot-Empfänger und Fernbedienung
Arbeiten zusammen: IR-Empfänger empfängt Daten von Fernbedienung. Tastenbelegung:
- Taste 0: Uhrzeit und Datum auf LCD
- Taste 1: Temperatur (LM35) und Feuchtigkeit (DHT11)
- Taste 2: Dunkelheitsprozentsatz
- Taste 3: Flüssigkeitspegel (mm)
- „Cycle“-Taste: Alle Bildschirme nacheinander im 4-Sekunden-Intervall
Bilder der Bildschirminhalte sind im Originalprojekt enthalten.
Die AWS (Arduino Weather Station)
Schritt 1: Gehäusebau
Nach Projektgröße Plexiglasbox konstruiert. Flächen mit Verriegelungen und Sensorauslässen in AutoCAD entworfen, per Lasercutter geschnitten, mit starkem Kleber montiert.
Schritt 2: Schaltplan und Hardware-Verbindungen
Schaltplan mit Fritzing erstellt. Verbindungen sind einfach.
Schritt 3: Arduino-Programmierung
Code in Arduino IDE mit allen nötigen Bibliotheken programmiert.
Schritt 4: Funktionsweise
AWS erfasst Umweltdaten und macht sie per Infrarot-Fernbedienung auf LCD abrufbar. 5 verschiedene Bildschirme:
- Startbildschirm: „Arduino Weather Station“ mit Fade-Effekt. Erscheint beim Einschalten und nach jeder Datenabfrage.
- Datum/Uhrzeit (Taste 0): 10 Sek. Anzeige, dann Rückkehr zum Startbildschirm.
- Feuchtigkeit/Temperatur (Taste 1): Daten von DHT11 und LM35. 10 Sek. Anzeige.
- Dunkelheit (Taste 2): LDR-Daten als Dunkelheitsprozentsatz. 10 Sek. Anzeige.
- Flüssigkeitspegel (Taste 3): Pegelhöhe in mm. 10 Sek. Anzeige.
Alle vier Datenscreens nacheinander per „Cycle“-Taste im 4-Sekunden-Intervall (ein Durchlauf).
Vorsichtsmaßnahmen
- Kein Flüssigkeitskontakt mit Board/Station.
- Nach Niederschlag Wasserbehälter leeren, Sensor prüfen/reinigen.
- Akku hält ca. 2 Tage → alle 2 Std. laden.
- IR-Sensor kann bei ~0°C ausfallen → Box öffnen, Reset-Taste drücken.
- Reset-Taste ändert RTC DS1302 nicht (Pufferbatterie ~10 Jahre).
- Bei Stromausfall Datum/Zeit neu setzen im Code (auskommentieren nach Einstellung).
Code
//include sketch libraries
#include <IRremote.h>
#include <stdio.h>
#include <string.h>
#include <DS1302.h>
#include <dht.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#define lmPin A1
LiquidCrystal_I2C lcd(0x27, 16, 2);
dht DHT;
const int DHT11_PIN = 4;
const int waterSensor = 0;
int waterValue = 0, mmwaterValue = 0;
int sensorPin = A3;
int luce = 0, pluce = 0;
float tem = 0;
long lmVal = 0;
const int irReceiverPin = 3;
IRrecv irrecv(irReceiverPin);
decode_results results;
uint8_t RST_PIN = 5, SDA_PIN = 6, SCL_PIN = 7;
char buf[50], day[10];
DS1302 rtc(RST_PIN, SDA_PIN, SCL_PIN);
void print_time() {
Time t = rtc.time();
memset(day, 0, sizeof(day));
switch (t.day) {
case 1: strcpy(day, "Sun"); break;
case 2: strcpy(day, "Mon"); break;
case 3: strcpy(day, "Tue"); break;
case 4: strcpy(day, "Wed"); break;
case 5: strcpy(day, "Thu"); break;
case 6: strcpy(day, "Fri"); break;
case 7: strcpy(day, "Sat"); break;
}
snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d", day, t.yr, t.mon, t.date, t.hr, t.min, t.sec);
Serial.println(buf);
lcd.setCursor(2, 0); lcd.print(t.yr); lcd.print("-"); lcd.print(t.mon/10); lcd.print(t.mon%10); lcd.print("-"); lcd.print(t.date/10); lcd.print(t.date%10); lcd.print(" "); lcd.print(day);
lcd.setCursor(4, 1); lcd.print(t.hr); lcd.print(":"); lcd.print(t.min/10); lcd.print(t.min%10); lcd.print(":"); lcd.print(t.sec/10); lcd.print(t.sec%10);
}
void setup() {
Serial.begin(9600);
rtc.write_protect(false); rtc.halt(false);
irrecv.enableIRIn();
lcd.init(); lcd.backlight();
pinMode(sensorPin, INPUT);
Time t(2017, 12, 9, 11, 20, 00, 7);
rtc.time(t);
}
void loop() {
// Startbildschirm "Arduino Weather Station" buchstabenweise anzeigen
lcd.setCursor(0, 0); lcd.print("A"); delay(50);
lcd.setCursor(1, 0); lcd.print("r"); delay(50);
lcd.setCursor(2, 0); lcd.print("d"); delay(50);
lcd.setCursor(3, 0); lcd.print("u"); delay(50);
lcd.setCursor(4, 0); lcd.print("i"); delay(50);
lcd.setCursor(5, 0); lcd.print("n"); delay(50);
lcd.setCursor(6, 0); lcd.print("o"); delay(50);
lcd.setCursor(8, 0); lcd.print("W"); delay(50);
lcd.setCursor(9, 0); lcd.print("e"); delay(50);
lcd.setCursor(10, 0); lcd.print("a"); delay(50);
lcd.setCursor(11, 0); lcd.print("t"); delay(50);
lcd.setCursor(12, 0); lcd.print("h"); delay(50);
lcd.setCursor(13, 0); lcd.print("e"); delay(50);
lcd.setCursor(14, 0); lcd.print("r"); delay(50);
lcd.setCursor(4, 1); lcd.print("S"); delay(50);
lcd.setCursor(5, 1); lcd.print("t"); delay(50);
lcd.setCursor(6, 1); lcd.print("a"); delay(50);
lcd.setCursor(7, 1); lcd.print("t"); delay(50);
lcd.setCursor(8, 1); lcd.print("i"); delay(50);
lcd.setCursor(9, 1); lcd.print("o"); delay(50);
lcd.setCursor(10, 1); lcd.print("n"); delay(50);
if (irrecv.decode(&results)) {
if (results.value == 0xFF6897) { // Taste 0: Zeit
lcd.clear(); print_time(); delay(10000); lcd.clear(); delay(200); irrecv.resume();
}
if (results.value == 0xFF30CF) { // Taste 1: Temp/Hum
lcd.clear();
int chk = DHT.read11(DHT11_PIN);
lcd.setCursor(0, 0); lcd.print("Tem:");
lmVal = analogRead(lmPin);
tem = (lmVal * 0.0048828125 * 100);
lcd.print(tem); lcd.print(char(223)); lcd.print("C ");
lcd.setCursor(0, 1); lcd.print("Hum:"); lcd.print(DHT.humidity, 1); lcd.print(" % ");
delay(10000); lcd.clear(); delay(200); irrecv.resume();
}
if (results.value == 0xFF18E7) { // Taste 2: Dunkelheit
lcd.clear(); lcd.setCursor(4, 0); lcd.print("Darkness:");
luce = analogRead(sensorPin);
pluce = map(luce, 0, 1023, 0, 100);
lcd.setCursor(6, 1); lcd.print(pluce); lcd.print("%");
delay(10000); lcd.clear(); delay(200); irrecv.resume();
}
if (results.value == 0xFF7A85) { // Taste 3: Flüssigkeitspegel
lcd.clear(); lcd.setCursor(0, 0); lcd.print("Fluid level(mm):");
waterValue = analogRead(waterSensor);
mmwaterValue = map(waterValue, 0, 1023, 0, 40);
lcd.setCursor(6, 1); lcd.print(mmwaterValue);
delay(10000); lcd.clear(); delay(200); irrecv.resume();
}
if (results.value == 0xFF9867) { // Cycle-Taste
lcd.clear(); print_time(); delay(4000); lcd.clear(); delay(200);
int chk = DHT.read11(DHT11_PIN);
lcd.setCursor(0, 0); lcd.print("Tem:");
lmVal = analogRead(lmPin);
tem = (lmVal * 0.0048828125 * 100);
lcd.print(tem); lcd.print(char(223)); lcd.print("C ");
lcd.setCursor(0, 1); lcd.print("Hum:"); lcd.print(DHT.humidity, 1); lcd.print(" % ");
delay(4000); lcd.clear(); delay(200);
lcd.setCursor(4, 0); lcd.print("Darkness:");
luce = analogRead(sensorPin);
pluce = map(luce, 0, 1023, 0, 100);
lcd.setCursor(6, 1); lcd.print(pluce); lcd.print("%");
delay(4000); lcd.clear(); delay(200);
lcd.setCursor(0, 0); lcd.print("Fluid level(mm):");
waterValue = analogRead(waterSensor);
mmwaterValue = map(waterValue, 0, 1023, 0, 40);
lcd.setCursor(6, 1); lcd.print(mmwaterValue);
delay(4000); lcd.clear(); delay(200);
irrecv.resume();
}
}
}
Fazit
Wetterstation mit Arduino, die Datum/Zeit und Umweltdaten erfasst und per Infrarot-Fernbedienung auf LCD anzeigt.
Zusatzdateien
- CAD-Datei:
box_a5et5f4U9F.dwg(Gehäuse) - Schaltplan:
aws_DMDwb4iUZp.fzz(Fritzing)
Herstellungsprozess
- Fortgeschrittene Wetterstation v2.0: Echtzeit Temperatur, Druck, Feuchte & Höhe Monitoring
- TinyML Spracherkennung mit Edge Impulse auf Arduino Nano 33 BLE Sense
- Echtzeit-Gyroskop-Spiel mit Arduino Nano & MPU-6050
- Arduino-gesteuerte 6-Shot-Getränkemischstation – Bauen Sie Ihren eigenen Cocktail-Automaten
- Arduino Digitaler Würfel: LCD-Würfel mit Zufallszahlen (1–6)
- Find Me: Smarter Gegenstands-Finder mit Arduino und Bluetooth
- Audio-reaktive Schreibtischlampe mit Arduino Nano bauen
- Hochleistungs-Datenlogger für Arduino-Wetterballons
- Tragbare Arduino-Wetterstation für 10$ bauen (Nano, DHT22, BMP180 & LCD)
- NeoPixel-Matrix Pong auf Arduino Nano: Neon-Pong selbst bauen