Atomuhren, UTC, DCF77, RDS, DAB, Mobilfunk, GPS, NTP u.a. tragen dazu bei, dass zeitabhängige Systeme weltweit synchron bleiben. Und so verwundert es nicht, dass Uhren sich selbsttätig von Sommer- auf die Winterzeit umstellen und sekundengenaue Zeitangaben machen.
Das hier vorzustellende Projekt soll einen Blick auf die Hintergründe ermöglichen und zeigen, wie mithilfe der Internet-Referenz ntppool.org/de/ einem LCD-Display und einem WLAN-fähigen Mikrocontroller die genaue Uhrzeit vorgehalten werden kann.
Den Zugang zum WLAN-Netz und damit zum Internet ermöglicht das ESP8266-Modul, das hier auf dem Board HUZZAH der Firma Adafruit verbaut ist. Das USB zu TTL Kabel ermöglicht eine konventionelle Anbindung an die Arduino-IDE. Näheres dazu hier und hier.
Statt des HUZZAH-Boards kann kann nur dann eine andere NodeMCU benutzt werden, wenn sie einen 5V Ausgang hat, wie die des Herstellers LoLin. Die Spannungsversorgung erfolgt über den USB-Port des PC.
Das zweizeilige LCD-Display 1602 ist mit einem I2C-Interface ausgestattet. Näheres dazu hier.
Pinbelegung: I2C-Interface HUZZAH LoLin GND GND GND VCC V+ VU SDA #4 D2 SCL #5 D1 Serielles Kabel HUZZAH Schwarz GND Rot V+ Grün RX Weiß TX
Programmcode:
#include <LiquidCrystal_I2C.h>
#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
char *ssid = "******";
char *password = "******";
char daysOfTheWeek[7][12]={"SONNTAG","MONTAG","DIENSTAG","MITTWOCH","DONNERSTAG","FREITAG","SAMSTAG"};
String formattedDate;
String Datum;
String Zeit;
LiquidCrystal_I2C lcd(0x27, 16, 2);
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 3600); //+3600sec (Winterzeit)
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while ( WiFi.status() != WL_CONNECTED ) {
delay (500);
Serial.print ( "." );
}
timeClient.begin();
}
void loop() {
formattedDate=timeClient.getFormattedDate();
int splitT = formattedDate.indexOf("T");
Datum = formattedDate.substring(0, splitT);
Zeit = formattedDate.substring(splitT+1, formattedDate.length()-1);
Serial.print(formattedDate);
Serial.println();
Serial.print("TAG: ");
Serial.println(daysOfTheWeek[timeClient.getDay()]);
Serial.print("DATUM: ");
Serial.println(Datum);
Serial.print("UHRZEIT: ");
Serial.println(Zeit);
Serial.println();
timeClient.update();
lcd.begin();
lcd.backlight();
lcd.clear();
lcd.setCursor(4, 0);
lcd.print(daysOfTheWeek[timeClient.getDay()]);
lcd.setCursor(0, 1);
lcd.print(Datum);
lcd.print(" ");
if (timeClient.getHours() < 10){
lcd.print('0');
}
lcd.print(timeClient.getHours());
lcd.print(":");
if (timeClient.getMinutes() < 10){
lcd.print('0');
}
lcd.print(timeClient.getMinutes());
delay(15000);
}
Vor dem Download des Programms muss auf dem HUZZAH-Board der Knopf GPIO 0 gehalten und zudem die Reset-Taste kurz gedrückt werden. Das Board ist programmierbereit, wenn die rote LED glimmt.