Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

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

Arduino Wetter-Uhr: Echtzeit Datum, Uhrzeit, Temperatur & Luftfeuchte

Ein Mikrocontroller als Zentrale. UNO oder Nano (genügend Pins) funktionieren beide.

DHT11 Sensor

Arduino Wetter-Uhr: Echtzeit Datum, Uhrzeit, Temperatur & Luftfeuchte

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

Arduino Wetter-Uhr: Echtzeit Datum, Uhrzeit, Temperatur & Luftfeuchte

Präzises Echtzeituhr-Modul mit temperaturkompensiertem Quarz (TCXO) und Pufferbatterie. Genauer als DS1307. I2C-Adresse: 0x68. SDA → A4, SCL → A5.

128×64 OLED Grafikdisplay

Arduino Wetter-Uhr: Echtzeit Datum, Uhrzeit, Temperatur & Luftfeuchte

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.

Arduino Wetter-Uhr: Echtzeit Datum, Uhrzeit, Temperatur & Luftfeuchte

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):

Schaltpläne

Fritzing-Dateien (Breadboard & Schematic) im Anhang. OLED-Pinout siehe Code-Kommentare.

Herstellungsprozess

  1. Aktuelles Datum und Uhrzeit in Python abrufen: Praktischer Leitfaden
  2. Raspberry Pi Temperatur- & Feuchtigkeits-Netzwerkmonitor – DIY Setup Guide
  3. Fern-Temperatursensor mit Raspberry Pi & Python bauen – Schritt-für-Schritt-Anleitung
  4. Nahtlose Temperatur- & Feuchtigkeitsüberwachung am Raspberry Pi mit EzTemp
  5. Netzwerkfähige Labor-Wetterstation mit Raspberry Pi bauen
  6. Multi-Sensor Temperatur- & Licht-Überwachung mit Raspberry Pi & DS18B20
  7. Feuchtigkeitssensor verifizieren und kalibrieren für präzise Messungen
  8. Java Datum und Zeit meistern: Konstruktoren, Methoden & Best Practices
  9. C++ Datum & Zeit: Umfassender Leitfaden
  10. Datum & Zeit in Python meistern: Praktischer Leitfaden