Eine genau gehende Uhr

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.