Arduino Wetter-Uhr: Echtzeit Datum, Uhrzeit, Temperatur & Luftfeuchte
Komponenten und Zubehör
| Arduino UNO | × | 1 |
| DHT11 Temperatur- & Feuchtesensor (4 Pins) | × | 1 |
| DS3231 RTC Modul (I2C) | × | 1 |
| Widerstand 10 kΩ (DHT11 Pull-up) | × | 1 |
| SSD1306 OLED 128×64 (Adafruit) | × | 1 |
| Steckbrett | × | 1 |
| Jumper-Kabel | × | 15 |
Über dieses Projekt
Eine eigene Uhr mit Datum, Temperatur und Luftfeuchte ist einfacher zu bauen, als man denkt.
Arduino UNO / Nano
Ein Mikrocontroller als Zentrale. UNO oder Nano (genügend Pins) funktionieren beide.
DHT11 Sensor
Günstiger digitaler Temperatur-/Feuchtesensor. Kapazitiver Feuchtesensor + Thermistor. Wichtig: Mindestens 2 Sekunden Pause zwischen Messungen.
Hinweis: Nach einmaligem Stellen der Uhrzeit die Zeile im Code auskommentieren und neu kompilieren, sonst wird die RTC bei jedem Reset neu gesetzt.
DS3231 RTC Modul
Präzises Echtzeituhr-Modul mit temperaturkompensiertem Quarz (TCXO) und Pufferbatterie. Genauer als DS1307. I2C-Adresse: 0x68. SDA → A4, SCL → A5.
128×64 OLED Grafikdisplay
Kompakt, hell, steuerbar per SPI oder I2C (Jumper auf Rückseite). Adafruit-Bibliotheken vorausgesetzt. Günstigere Alternativen möglich, aber Bibliotheks-Kompatibilität prüfen.
Code
Time_Temp_Humidity_Display.ino (Arduino)
Benötigte Bibliotheken: Adafruit_GFX, Adafruit_SSD1306, dht, RTClib (oder manuelle I2C-Funktionen wie im Code).
// OLED (Software SPI)
#include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h>
#define OLED_MOSI 9 #define OLED_CLK 10 #define OLED_DC 11 #define OLED_CS 12 #define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
// DHT11
#include <dht.h>
dht DHT;
#define DHT11_PIN 3
int DHTtimer = 0;
// DS3231 I2C
#define DS3231_I2C_ADDRESS 0x68
byte decToBcd(byte val) { return (val/10*16) + (val%10); }
byte bcdToDec(byte val) { return (val/16*10) + (val%16); }
void setup() {
Wire.begin(); Serial.begin(9600);
// Einmalig Zeit setzen, dann AUSKOMMENTIEREN:
// setDS3231time(0,24,12,6,3,2,17); // s,m,h,WoW,Tag,Monat,Jahr
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
}
void setDS3231time(byte s, byte m, byte h, byte dow, byte dom, byte mo, byte y) {
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); Wire.write(decToBcd(s)); Wire.write(decToBcd(m));
Wire.write(decToBcd(h)); Wire.write(decToBcd(dow));
Wire.write(decToBcd(dom)); Wire.write(decToBcd(mo)); Wire.write(decToBcd(y));
Wire.endTransmission();
}
void readDS3231time(byte *s, byte *m, byte *h, byte *dow, byte *dom, byte *mo, byte *y) {
Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
*s = bcdToDec(Wire.read() & 0x7f); *m = bcdToDec(Wire.read());
*h = bcdToDec(Wire.read() & 0x3f); *dow = bcdToDec(Wire.read());
*dom = bcdToDec(Wire.read()); *mo = bcdToDec(Wire.read()); *y = bcdToDec(Wire.read());
}
void displayTime() {
byte s,m,h,dow,dom,mo,y;
readDS3231time(&s,&m,&h,&dow,&dom,&mo,&y);
// Serial Ausgabe
Serial.print(h); Serial.print(":"); if(m<10)Serial.print("0"); Serial.print(m);
Serial.print(":"); if(s<10)Serial.print("0"); Serial.print(s);
Serial.print(" "); Serial.print(dom); Serial.print("/"); Serial.print(mo); Serial.print("/"); Serial.print(y);
Serial.print(" Wochentag: ");
// OLED: Datum & Uhrzeit
display.setCursor(50,0); display.print(dom); display.print(",");
display.setCursor(91,0); display.print("20"); display.print(y);
// Uhrzeit formatiert
if(h<10){display.setCursor(40,10);display.print("0");} display.setCursor(40,10);display.print(h);display.print(":");
if(m<10){display.setCursor(58,10);display.print("0");} display.setCursor(58,10);display.print(m);display.print(":");
if(s<10){display.setCursor(75,10);display.print("0");} display.setCursor(75,10);display.print(s);
// Wochentag
const char* days[] = {"","So","Mo","Di","Mi","Do","Fr","Sa"};
display.setCursor(20,0); display.print(days[dow]);
// Monat
const char* months[] = {"","Jan","Feb","Mar","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"};
display.setCursor(70,0); display.print(months[mo]);
// Analog Uhr Zeiger (grafisch)
float pi = 3.14;
// Stunde
float a = (h-15)*30; float b = a*pi/180;
display.drawLine(40,41, 40+9*cos(b), 41+9*sin(b), WHITE);
// Minute
a = (m-15)*6; b = a*pi/180;
display.drawLine(40,41, 40+17*cos(b), 41+17*sin(b), WHITE);
// Sekunde
a = (s-15)*6; b = a*pi/180;
display.drawLine(40,41, 40+19*cos(b), 41+19*sin(b), WHITE);
// Ziffernblatt statisch
display.drawCircle(40,41,22,WHITE); display.drawCircle(40,41,1,WHITE);
// Striche 12,3,6,9 + Zwischenstriche ...
}
void ReadTempAndHum() {
int chk = DHT.read11(DHT11_PIN);
display.setCursor(70,45); display.print("Temp: "); display.print(DHT.temperature,0); display.print("C");
display.setCursor(70,56); display.print("Hum: "); display.print(DHT.humidity,0); display.print("%");
Serial.print(" Hum: "); Serial.print(DHT.humidity,1); Serial.print("% Temp: "); Serial.print(DHT.temperature,1); Serial.println("C");
}
void loop() {
displayTime();
DHTtimer++;
if(DHTtimer > 1) { // alle 2 Sekunden
display.fillRect(70,45,128,64,BLACK);
ReadTempAndHum();
DHTtimer = 0;
}
delay(1000);
display.display();
// Zeitbereich löschen für nächsten Frame
display.fillRect(0,0,64,64,BLACK);
display.fillRect(0,0,128,20,BLACK);
}
Benutzerdefinierte Teile & Bibliotheken
Benötigte Library-ZIPs (im Repository):
- Adafruit_SSD1306
- Adafruit_GFX
- DHT Sensor Library
- Arduino RTC Library
Schaltpläne
Fritzing-Dateien (Breadboard & Schematic) im Anhang. OLED-Pinout siehe Code-Kommentare.
Herstellungsprozess
- Aktuelles Datum und Uhrzeit in Python abrufen: Praktischer Leitfaden
- Raspberry Pi Temperatur- & Feuchtigkeits-Netzwerkmonitor – DIY Setup Guide
- Fern-Temperatursensor mit Raspberry Pi & Python bauen – Schritt-für-Schritt-Anleitung
- Nahtlose Temperatur- & Feuchtigkeitsüberwachung am Raspberry Pi mit EzTemp
- Netzwerkfähige Labor-Wetterstation mit Raspberry Pi bauen
- Multi-Sensor Temperatur- & Licht-Überwachung mit Raspberry Pi & DS18B20
- Feuchtigkeitssensor verifizieren und kalibrieren für präzise Messungen
- Java Datum und Zeit meistern: Konstruktoren, Methoden & Best Practices
- C++ Datum & Zeit: Umfassender Leitfaden
- Datum & Zeit in Python meistern: Praktischer Leitfaden