NTP - Datum und Zeit OLED anzeigen

UNO WiFi Rev2, MKR 1010, Nano 33 IoT

# include "WiFiNINA.h"
#include "NTP.h"
#include "U8g2lib.h"

/*
  Typbezeichnung mit Bildschirmgröße in Pixeln
  1 = page buffer mode, F = full screen buffer mode
  Hardware I2C
  Name des OLEDs
  Rotation R0 (keine)
*/
// Parameter 0,96 Zoll SSD1306
U8G2_SSD1306_128X64_NONAME_1_HW_I2C oled(U8G2_R0, U8X8_PIN_NONE);

// Parameter 1,3 Zoll SH1106
// U8G2_SH1106_128X64_NONAME_1_HW_I2C oled(U8G2_R0, U8X8_PIN_NONE);

// SSID und Passwort des Routers
char Router[] = "Router_SSID";
char Passwort[] = "xxxxxxxx";

WiFiUDP wifiUdp;
NTP ntp(wifiUdp);

// Zeit bis zur nächsten Messung
static unsigned long GesicherteStartZeit = 0;
unsigned long Startzeit;

// 30 Sekunden Intervall, kann angepasst werden
int Intervall = 30000;

void setup() 
{
  Serial.begin(9600);
  delay(500);

  // WiFi starten DHCP
  WiFi.begin(Router, Passwort);

  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(500);
  }

  // SSID des Routers anzeigen
  Serial.print("Verbunden mit ");
  Serial.println(WiFi.SSID());

  // IP anzeigen
  Serial.print("IP: ");
  Serial.println(WiFi.localIP());

  /*
    Zeitzone
    CEST: Central European Summertime
    Beginn europäische Sommerzeit letzter Sonntag im März 2 Uhr GMT + 2 Stunden
  */
  ntp.ruleDST("CEST", Last, Sun, Mar, 2, 120);

  // CET: Central European Time
  // Beginn Normalzeit letzter Sonntag im Oktober 3 Uhr GMT + 1 Stunde
  ntp.ruleSTD("CET", Last, Sun, Oct, 3, 60);

  // ntp starten
  ntp.begin();

  // OLED starten
  oled.begin();

  // Schriftart
  oled.setFont(u8g2_font_courB24_tf);

  // Zeichenfarbe weiß
  oled.setDrawColor(1);

  // horizontale Schrift
  oled.setFontDirection(0);

  // Datum und Zeit beim Start anzeigen
  ntp.update();
  oled.clearDisplay();

  oled.firstPage();
  do 
  {
    oled.setCursor(2, 15);
    oled.setFont(u8g2_font_t0_22_te);

    // Tag: führende 0 ergänzen
    if (ntp.day() < 10) oled.print("0");
    oled.print(ntp.day());
    oled.print(".");

    // Monat: führende 0 ergänzen
    if (ntp.month() < 10) oled.print("0");
    oled.print(ntp.month());
    oled.print(".");

    // Jahr
    oled.print(ntp.year());

    // horizontale Linie
    oled.drawHLine(1, 22, oled.getDisplayWidth());
    oled.setCursor(2, 63);

    // Uhrzeit
    // Stunden: führende 0 ergänzen
    oled.setFont(u8g2_font_logisoso32_tf);
    if (ntp.hours() < 10) oled.print("0");
    oled.print(String(ntp.hours()) + ":");

    // Minuten: führende 0 ergänzen
    if (ntp.minutes() < 10) oled.print("0");
    oled.print(String(ntp.minutes()));
  } while (oled.nextPage());

  // Serielle Ausgabe
  switch (ntp.weekDay()) 
  {
    case 0:
      Serial.print("Sonntag ");
      break;

    case 1:
      Serial.print("Montag ");
      break;

    case 2:
      Serial.print("Dienstag ");
      break;

    case 3:
      Serial.print("Mittwoch ");
      break;

    case 4:
      Serial.print("Donnerstag ");
      break;

    case 5:
      Serial.print("Freitag ");
      break;

    case 6:
      Serial.print("Samstag ");
      break;
  }

  // Tag: führende 0 ergänzen
  if (ntp.day() < 10) Serial.print("0");
  Serial.print(ntp.day());
  Serial.print(".");

  // Monat: führende 0 ergänzen
  if (ntp.month() < 10) Serial.print("0");
  Serial.print(ntp.month());
  Serial.print(".");

  // Jahr
  Serial.print(ntp.year());
  Serial.print(" ");

  // Uhrzeit
  // Stunden: führende 0 ergänzen
  if (ntp.hours() < 10) Serial.print("0");
  Serial.print(String(ntp.hours()) + ":");

  // Minuten: führende 0 ergänzen
  if (ntp.minutes() < 10) Serial.print("0");
  Serial.println(String(ntp.minutes()));
}

void loop() 
{
  // Startzeit setzen
  Startzeit = millis();

  // wenn das festgelegte Intervall erreicht ist
  if (Startzeit - GesicherteStartZeit > Intervall) 
  {
    ntp.update();
    oled.clearDisplay();

    // Startzeit zurücksetzen
    GesicherteStartZeit = Startzeit;
    oled.setCursor(3, 20);
    oled.firstPage();
    do 
    {
      oled.setCursor(2, 15);
      oled.setFont(u8g2_font_t0_22_te);

      // Tag: führende 0 ergänzen
      if (ntp.day() < 10) oled.print("0");
      oled.print(ntp.day());
      oled.print(".");

      // Monat: führende 0 ergänzen
      if (ntp.month() < 10) oled.print("0");
      oled.print(ntp.month());
      oled.print(".");
      oled.print(ntp.year());

      // horizontale Linie
      oled.drawHLine(1, 22, oled.getDisplayWidth());
      oled.setCursor(2, 63);

      // Uhrzeit
      // Stunden: führende 0 ergänzen
      oled.setFont(u8g2_font_logisoso32_tf);
      if (ntp.hours() < 10) oled.print("0");
      oled.print(String(ntp.hours()) + ":");

      // Minuten: führende 0 ergänzen
      if (ntp.minutes() < 10) oled.print("0");
      oled.print(String(ntp.minutes()));
    } 
    while (oled.nextPage());

    // Serielle Ausgabe
    switch (ntp.weekDay()) 
    {
      case 0:
        Serial.print("Sonntag ");
        break;

      case 1:
        Serial.print("Montag ");
        break;

      case 2:
        Serial.print("Dienstag ");
        break;

      case 3:
        Serial.print("Mittwoch ");
        break;

      case 4:
        Serial.print("Donnerstag ");
        break;

      case 5:
        Serial.print("Freitag ");
        break;

      case 6:
        Serial.print("Samstag ");
        break;
    }

    // Tag: führende 0 ergänzen
    if (ntp.day() < 10) Serial.print("0");
    Serial.print(ntp.day());
    Serial.print(".");

    // Monat: führende 0 ergänzen
    if (ntp.month() < 10) Serial.print("0");
    Serial.print(ntp.month());
    Serial.print(".");

    // Jahr
    Serial.print(ntp.year());
    Serial.print(" ");

    // Uhrzeit
    // Stunden: führende 0 ergänzen
    if (ntp.hours() < 10) Serial.print("0");
    Serial.print(String(ntp.hours()) + ":");

    // Minuten: führende 0 ergänzen
    if (ntp.minutes() < 10) Serial.print("0");
    Serial.println(String(ntp.minutes()));
  }
}

Ardui­no R4 WiFi

#include "WiFiS3.h"
#include "NTP.h"
#include "U8g2lib.h"

/*
  Typbezeichnung mit Bildschirmgröße in Pixeln
  1 = page buffer mode, F = full screen buffer mode
  Hardware I2C
  Name des OLEDs
  Rotation R0 (keine)
*/
// Parameter 0,96 Zoll SSD1306
U8G2_SSD1306_128X64_NONAME_1_HW_I2C oled(U8G2_R0, U8X8_PIN_NONE);

// Parameter 1,3 Zoll SH1106
// U8G2_SH1106_128X64_NONAME_1_HW_I2C oled(U8G2_R0, U8X8_PIN_NONE);

// SSID und Passwort des Routers
char Router[] = "Router_SSID";
char Passwort[] = "xxxxxxxx";

WiFiUDP wifiUdp;
NTP ntp(wifiUdp);

// Zeit bis zur nächsten Messung
static unsigned long GesicherteStartZeit = 0;
unsigned long Startzeit;

// 30 Sekunden Intervall, kann angepasst werden
int Intervall = 30000;

void setup() 
{
  Serial.begin(9600);
  delay(500);

  // WiFi starten DHCP
  WiFi.begin(Router, Passwort);

  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(500);
  }

  // SSID des Routers anzeigen
  Serial.print("Verbunden mit ");
  Serial.println(WiFi.SSID());

  // IP anzeigen
  Serial.print("IP: ");
  Serial.println(WiFi.localIP());

  /*
    Zeitzone
    CEST: Central European Summertime
    Beginn europäische Sommerzeit letzter Sonntag im März 2 Uhr GMT + 2 Stunden
  */
  ntp.ruleDST("CEST", Last, Sun, Mar, 2, 120);

  // CET: Central European Time
  // Beginn Normalzeit letzter Sonntag im Oktober 3 Uhr GMT + 1 Stunde
  ntp.ruleSTD("CET", Last, Sun, Oct, 3, 60);

  // ntp starten
  ntp.begin();

  // OLED starten
  oled.begin();

  // Schriftart
  oled.setFont(u8g2_font_courB24_tf);

  // Zeichenfarbe weiß
  oled.setDrawColor(1);

  // horizontale Schrift
  oled.setFontDirection(0);

  // Datum und Zeit beim Start anzeigen
  ntp.update();
  oled.clearDisplay();

  oled.firstPage();
  do 
  {
    oled.setCursor(2, 15);
    oled.setFont(u8g2_font_t0_22_te);

    // Tag: führende 0 ergänzen
    if (ntp.day() < 10) oled.print("0");
    oled.print(ntp.day());
    oled.print(".");

    // Monat: führende 0 ergänzen
    if (ntp.month() < 10) oled.print("0");
    oled.print(ntp.month());
    oled.print(".");

    // Jahr
    oled.print(ntp.year());

    // horizontale Linie
    oled.drawHLine(1, 22, oled.getDisplayWidth());
    oled.setCursor(2, 63);

    // Uhrzeit
    // Stunden: führende 0 ergänzen
    oled.setFont(u8g2_font_logisoso32_tf);
    if (ntp.hours() < 10) oled.print("0");
    oled.print(String(ntp.hours()) + ":");

    // Minuten: führende 0 ergänzen
    if (ntp.minutes() < 10) oled.print("0");
    oled.print(String(ntp.minutes()));
  } 
  while (oled.nextPage());

  // Serielle Ausgabe
  switch (ntp.weekDay()) 
  {
    case 0:
      Serial.print("Sonntag ");
      break;

    case 1:
      Serial.print("Montag ");
      break;

    case 2:
      Serial.print("Dienstag ");
      break;

    case 3:
      Serial.print("Mittwoch ");
      break;

    case 4:
      Serial.print("Donnerstag ");
      break;

    case 5:
      Serial.print("Freitag ");
      break;

    case 6:
      Serial.print("Samstag ");
      break;
  }

  // Tag: führende 0 ergänzen
  if (ntp.day() < 10) Serial.print("0");
  Serial.print(ntp.day());
  Serial.print(".");

  // Monat: führende 0 ergänzen
  if (ntp.month() < 10) Serial.print("0");
  Serial.print(ntp.month());
  Serial.print(".");

  // Jahr
  Serial.print(ntp.year());
  Serial.print(" ");

  // Uhrzeit
  // Stunden: führende 0 ergänzen
  if (ntp.hours() < 10) Serial.print("0");
  Serial.print(String(ntp.hours()) + ":");

  // Minuten: führende 0 ergänzen
  if (ntp.minutes() < 10) Serial.print("0");
  Serial.println(String(ntp.minutes()));
}

void loop() 
{
  // Startzeit setzen
  Startzeit = millis();

  // wenn das festgelegte Intervall erreicht ist
  if (Startzeit - GesicherteStartZeit > Intervall) 
  {
    ntp.update();
    oled.clearDisplay();

    // Startzeit zurücksetzen
    GesicherteStartZeit = Startzeit;
    oled.setCursor(3, 20);
    oled.firstPage();
    do 
    {
      oled.setCursor(2, 15);
      oled.setFont(u8g2_font_t0_22_te);

      // Tag: führende 0 ergänzen
      if (ntp.day() < 10) oled.print("0");
      oled.print(ntp.day());
      oled.print(".");

      // Monat: führende 0 ergänzen
      if (ntp.month() < 10) oled.print("0");
      oled.print(ntp.month());
      oled.print(".");
      oled.print(ntp.year());

      // horizontale Linie
      oled.drawHLine(1, 22, oled.getDisplayWidth());
      oled.setCursor(2, 63);

      // Uhrzeit
      // Stunden: führende 0 ergänzen
      oled.setFont(u8g2_font_logisoso32_tf);
      if (ntp.hours() < 10) oled.print("0");
      oled.print(String(ntp.hours()) + ":");

      // Minuten: führende 0 ergänzen
      if (ntp.minutes() < 10) oled.print("0");
      oled.print(String(ntp.minutes()));
    } 
    while (oled.nextPage());

    // Serielle Ausgabe
    switch (ntp.weekDay()) 
    {
      case 0:
        Serial.print("Sonntag ");
        break;

      case 1:
        Serial.print("Montag ");
        break;

      case 2:
        Serial.print("Dienstag ");
        break;

      case 3:
        Serial.print("Mittwoch ");
        break;

      case 4:
        Serial.print("Donnerstag ");
        break;

      case 5:
        Serial.print("Freitag ");
        break;

      case 6:
        Serial.print("Samstag ");
        break;
    }

    // Tag: führende 0 ergänzen
    if (ntp.day() < 10) Serial.print("0");
    Serial.print(ntp.day());
    Serial.print(".");

    // Monat: führende 0 ergänzen
    if (ntp.month() < 10) Serial.print("0");
    Serial.print(ntp.month());
    Serial.print(".");

    // Jahr
    Serial.print(ntp.year());
    Serial.print(" ");

    // Uhrzeit
    // Stunden: führende 0 ergänzen
    if (ntp.hours() < 10) Serial.print("0");
    Serial.print(String(ntp.hours()) + ":");

    // Minuten: führende 0 ergänzen
    if (ntp.minutes() < 10) Serial.print("0");
    Serial.println(String(ntp.minutes()));
  }
}

ESP8266 (NodeM­CU und Wemos D1)

#include "ESP8266WiFi.h"
#include "time.h"    
#include "U8g2lib.h"

// OLED initialisieren
U8G2_SSD1306_128X64_NONAME_1_HW_I2C oled(U8G2_R0, U8X8_PIN_NONE);

// SSID und Passwort des Routers
char Router[] = "Router_SSID";
char Passwort[] = "xxxxxxxx";    

// NTP-Server aus dem Pool
# define Zeitserver "de.pool.ntp.org"

/*
  Liste der Zeitzonen
  https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
  Zeitzone CET = Central European Time -1 -> 1 Stunde zurück
  CEST = Central European Summer Time von
  M3 = März, 5.0 = Sonntag 5. Woche, 02 = 2 Uhr
  bis M10 = Oktober, 5.0 = Sonntag 5. Woche 03 = 3 Uhr
*/
# define Zeitzone "CET-1CEST,M3.5.0/02,M10.5.0/03"

// time_t enthält die Anzahl der Sekunden seit dem 1.1.1970 0 Uhr
time_t aktuelleZeit; 

/* 
  Struktur tm
  tm_hour -> Stunde: 0 bis 23
  tm_min -> Minuten: 0 bis 59
  tm_sec -> Sekunden 0 bis 59
  tm_mday -> Tag 1 bis 31
  tm_mon -> Monat: 0 (Januar) bis 11 (Dezember)
  tm_year -> Jahre seit 1900
  tm_yday -> vergangene Tage seit 1. Januar des Jahres
  tm_isdst -> Wert > 0 = Sommerzeit (dst = daylight saving time)
*/
tm Zeit;    

// Zeit bis zur nächsten Messung
static unsigned long GesicherteStartZeit = 0;
unsigned long Startzeit;

// Sekunden Intervall, kann angepasst werden
int Intervall = 10000;

void setup() 
{
  Serial.begin(9600);

  // Parameter für die zu ermittelnde Zeit
  configTime(Zeitzone, Zeitserver); 

  WiFi.begin(Router, Passwort);

  while (WiFi.status() != WL_CONNECTED) 
  {
    delay(200);
    Serial.print(".");
  }

  // SSID des Routers anzeigen
  Serial.println();
  Serial.print("Verbunden mit ");
  Serial.println(WiFi.SSID());

  // IP anzeigen
  Serial.print("IP: ");
  Serial.println(WiFi.localIP());

  // OLED starten
  oled.begin();
}

void loop() 
{
  // Startzeit setzen
  Startzeit = millis();

  // wenn das festgelegte Intervall erreicht ist
  if (Startzeit - GesicherteStartZeit > Intervall) 
  {
    ZeitAnzeigen();

    // Startzeit zurücksetzen
    GesicherteStartZeit = Startzeit;
  }
}

void ZeitAnzeigen() 
{
  // aktuelle Zeit lesen
  time(&aktuelleZeit);

  // localtime_r -> Zeit in die lokale Zeitzone setzen
  localtime_r(&aktuelleZeit, &Zeit);
  oled.clearDisplay();

  oled.setCursor(2, 63);

  oled.setFont(u8g2_font_courB24_tf);

  // Zeichenfarbe weiß
  oled.setDrawColor(1);

  // horizontale Schrift
  oled.setFontDirection(0);
  oled.firstPage();

  do 
  {
    // Datum anzeigen
    oled.setCursor(2, 15);
    oled.setFont(u8g2_font_t0_22_te);

    // Tag: führende 0 ergänzen
    if (Zeit.tm_mday < 10) oled.print("0");
    oled.print(Zeit.tm_mday);
    oled.print(".");

    // Monat: führende 0 ergänzen
    if (Zeit.tm_mon < 10) oled.print("0");
    oled.print(Zeit.tm_mon + 1);
    oled.print(".");

    oled.print(Zeit.tm_year + 1900);
    oled.setCursor(2, 63);
    oled.setFont(u8g2_font_logisoso32_tf);

    // horizontale Linie
    oled.drawHLine(1, 22, oled.getDisplayWidth());
    oled.setCursor(2, 63);

    // Zeit anzeigen
    oled.setFont(u8g2_font_logisoso32_tf);
    oled.setCursor(2, 63);

    if (Zeit.tm_hour < 10) oled.print("0");
    oled.print(Zeit.tm_hour);
    oled.print(":");

    if (Zeit.tm_min < 10) oled.print("0");
    oled.print(Zeit.tm_min);  
  } 
  while (oled.nextPage());

  // Serielle Ausgabe mit Namen des Wochentages
  switch (Zeit.tm_wday) {
    case 0:
      Serial.print("Sonntag ");
      break;

    case 1:
      Serial.print("Montag ");
      break;

    case 2:
      Serial.print("Dienstag ");
      break;

    case 3:
      Serial.print("Mittwoch ");
      break;

    case 4:
      Serial.print("Donnerstag ");
      break;

    case 5:
      Serial.print("Freitag ");
      break;

    case 6:
      Serial.print("Samstag ");
      break;
  }

  // Tag: führende 0 ergänzen
  if (Zeit.tm_mday < 10) Serial.print("0");
  Serial.print(Zeit.tm_mday);
  Serial.print(".");

  // Monat: führende 0 ergänzen
  if (Zeit.tm_mon < 10) Serial.print("0");
  Serial.print(Zeit.tm_mon + 1);
  Serial.print(".");

  // Anzahl Jahre seit 1900
  Serial.print(Zeit.tm_year + 1900);  
  Serial.print(" ");

  if (Zeit.tm_hour < 10) Serial.print("0");
  Serial.print(Zeit.tm_hour); 
  Serial.print(":");

  if (Zeit.tm_min < 10) Serial.print("0");
  Serial.print(Zeit.tm_min);  
  Serial.print(":");
  if (Zeit.tm_sec < 10) Serial.print("0");
  Serial.print(Zeit.tm_sec);  
  Serial.println();
  Serial.print("Tage seit 1. Januar: ");
  Serial.print(Zeit.tm_yday);
  Serial.println();
  if (Zeit.tm_isdst > 0) Serial.println("Sommerzeit");
}

ESP32-Wroom

#include "WiFi.h"
#include "time.h"    
#include "U8g2lib.h"

// OLED initialisieren
U8G2_SSD1306_128X64_NONAME_1_HW_I2C oled(U8G2_R0, U8X8_PIN_NONE);

// SSID und Passwort des Routers
char Router[] = "Router_SSID";
char Passwort[] = "xxxxxxxx";    

// NTP-Server aus dem Pool
# define Zeitserver "de.pool.ntp.org"

/*
  Liste der Zeitzonen
  https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
  Zeitzone CET = Central European Time -1 -> 1 Stunde zurück
  CEST = Central European Summer Time von
  M3 = März, 5.0 = Sonntag 5. Woche, 02 = 2 Uhr
  bis M10 = Oktober, 5.0 = Sonntag 5. Woche 03 = 3 Uhr
*/
# define Zeitzone "CET-1CEST,M3.5.0/02,M10.5.0/03"

// time_t enthält die Anzahl der Sekunden seit dem 1.1.1970 0 Uhr
time_t aktuelleZeit; 

/* 
  Struktur tm
  tm_hour -> Stunde: 0 bis 23
  tm_min -> Minuten: 0 bis 59
  tm_sec -> Sekunden 0 bis 59
  tm_mday -> Tag 1 bis 31
  tm_mon -> Monat: 0 (Januar) bis 11 (Dezember)
  tm_year -> Jahre seit 1900
  tm_yday -> vergangene Tage seit 1. Januar des Jahres
  tm_isdst -> Wert > 0 = Sommerzeit (dst = daylight saving time)
*/
tm Zeit;    

// Zeit bis zur nächsten Messung
static unsigned long GesicherteStartZeit = 0;
unsigned long Startzeit;

// Sekunden Intervall, kann angepasst werden
int Intervall = 10000;

void setup() 
{
  Serial.begin(9600);

  // Parameter für die zu ermittelnde Zeit
  configTzTime(Zeitzone, Zeitserver); 

  WiFi.begin(Router, Passwort);

  while (WiFi.status() != WL_CONNECTED) 
  {
    delay(200);
    Serial.print(".");
  }

  // SSID des Routers anzeigen
  Serial.println();
  Serial.print("Verbunden mit ");
  Serial.println(WiFi.SSID());

  // IP anzeigen
  Serial.print("IP: ");
  Serial.println(WiFi.localIP());

  // OLED starten
  oled.begin();
}

void loop() 
{
  // Startzeit setzen
  Startzeit = millis();

  // wenn das festgelegte Intervall erreicht ist
  if (Startzeit - GesicherteStartZeit > Intervall) 
  {
    ZeitAnzeigen();

    // Startzeit zurücksetzen
    GesicherteStartZeit = Startzeit;
  }
}

void ZeitAnzeigen() 
{
  // aktuelle Zeit lesen
  time(&aktuelleZeit);

  // localtime_r -> Zeit in die lokale Zeitzone setzen
  localtime_r(&aktuelleZeit, &Zeit);
  oled.clearDisplay();

  oled.setCursor(2, 63);

  oled.setFont(u8g2_font_courB24_tf);

  // Zeichenfarbe weiß
  oled.setDrawColor(1);

  // horizontale Schrift
  oled.setFontDirection(0);
  oled.firstPage();

  do 
  {
    // Datum anzeigen
    oled.setCursor(2, 15);
    oled.setFont(u8g2_font_t0_22_te);

    // Tag: führende 0 ergänzen
    if (Zeit.tm_mday < 10) oled.print("0");
    oled.print(Zeit.tm_mday);
    oled.print(".");

    // Monat: führende 0 ergänzen
    if (Zeit.tm_mon < 10) oled.print("0");
    oled.print(Zeit.tm_mon + 1);
    oled.print(".");

    oled.print(Zeit.tm_year + 1900);
    oled.setCursor(2, 63);
    oled.setFont(u8g2_font_logisoso32_tf);

    // horizontale Linie
    oled.drawHLine(1, 22, oled.getDisplayWidth());
    oled.setCursor(2, 63);

    // Zeit anzeigen
    oled.setFont(u8g2_font_logisoso32_tf);
    oled.setCursor(2, 63);

    if (Zeit.tm_hour < 10) oled.print("0");
    oled.print(Zeit.tm_hour);
    oled.print(":");

    if (Zeit.tm_min < 10) oled.print("0");
    oled.print(Zeit.tm_min);  
  } 
  while (oled.nextPage());

  // Serielle Ausgabe mit Namen des Wochentages
  switch (Zeit.tm_wday) {
    case 0:
      Serial.print("Sonntag ");
      break;

    case 1:
      Serial.print("Montag ");
      break;

    case 2:
      Serial.print("Dienstag ");
      break;

    case 3:
      Serial.print("Mittwoch ");
      break;

    case 4:
      Serial.print("Donnerstag ");
      break;

    case 5:
      Serial.print("Freitag ");
      break;

    case 6:
      Serial.print("Samstag ");
      break;
  }

  // Tag: führende 0 ergänzen
  if (Zeit.tm_mday < 10) Serial.print("0");
  Serial.print(Zeit.tm_mday);
  Serial.print(".");

  // Monat: führende 0 ergänzen
  if (Zeit.tm_mon < 10) Serial.print("0");
  Serial.print(Zeit.tm_mon + 1);
  Serial.print(".");

  // Anzahl Jahre seit 1900
  Serial.print(Zeit.tm_year + 1900);  
  Serial.print(" ");

  if (Zeit.tm_hour < 10) Serial.print("0");
  Serial.print(Zeit.tm_hour);  
  Serial.print(":");

  if (Zeit.tm_min < 10) Serial.print("0");
  Serial.print(Zeit.tm_min);  
  Serial.print(":");
  if (Zeit.tm_sec < 10) Serial.print("0");
  Serial.print(Zeit.tm_sec);  
  Serial.println();
  Serial.print("Tage seit 1. Januar: ");
  Serial.print(Zeit.tm_yday);
  Serial.println();
  if (Zeit.tm_isdst > 0) Serial.println("Sommerzeit");
}

Nano ESP32

#include "WiFi.h"
#include "time.h"    
#include "U8g2lib.h"
#include "Wire.h"

// OLED initialisieren
U8G2_SSD1306_128X64_NONAME_1_HW_I2C oled(U8G2_R0, U8X8_PIN_NONE);

// SSID und Passwort des Routers
char Router[] = "Router_SSID";
char Passwort[] = "xxxxxxxx";

// NTP-Server aus dem Pool
# define Zeitserver "de.pool.ntp.org"

/*
  Liste der Zeitzonen
  https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
  Zeitzone CET = Central European Time -1 -> 1 Stunde zurück
  CEST = Central European Summer Time von
  M3 = März, 5.0 = Sonntag 5. Woche, 02 = 2 Uhr
  bis M10 = Oktober, 5.0 = Sonntag 5. Woche 03 = 3 Uhr
*/
# define Zeitzone "CET-1CEST,M3.5.0/02,M10.5.0/03"

// time_t enthält die Anzahl der Sekunden seit dem 1.1.1970 0 Uhr
time_t aktuelleZeit; 

/* 
  Struktur tm
  tm_hour -> Stunde: 0 bis 23
  tm_min -> Minuten: 0 bis 59
  tm_sec -> Sekunden 0 bis 59
  tm_mday -> Tag 1 bis 31
  tm_mon -> Monat: 0 (Januar) bis 11 (Dezember)
  tm_year -> Jahre seit 1900
  tm_yday -> vergangene Tage seit 1. Januar des Jahres
  tm_isdst -> Wert > 0 = Sommerzeit (dst = daylight saving time)
*/
tm Zeit;    

// Zeit bis zur nächsten Messung
static unsigned long GesicherteStartZeit = 0;
unsigned long Startzeit;

// Sekunden Intervall, kann angepasst werden
int Intervall = 10000;

void setup() 
{
  Wire.begin();

  Serial.begin(9600);

  // Parameter für die zu ermittelnde Zeit
  configTzTime(Zeitzone, Zeitserver); 

  WiFi.begin(Router, Passwort);

  while (WiFi.status() != WL_CONNECTED) 
  {
    delay(200);
    Serial.print(".");
  }

  // SSID des Routers anzeigen
  Serial.println();
  Serial.print("Verbunden mit ");
  Serial.println(WiFi.SSID());

  // IP anzeigen
  Serial.print("IP: ");
  Serial.println(WiFi.localIP());

  // OLED starten
  oled.begin();
}

void loop() 
{
  // Startzeit setzen
  Startzeit = millis();

  // wenn das festgelegte Intervall erreicht ist
  if (Startzeit - GesicherteStartZeit > Intervall) 
  {
    ZeitAnzeigen();

    // Startzeit zurücksetzen
    GesicherteStartZeit = Startzeit;
  }
}

void ZeitAnzeigen() 
{
  // aktuelle Zeit lesen
  time(&aktuelleZeit);

  // localtime_r -> Zeit in die lokale Zeitzone setzen
  localtime_r(&aktuelleZeit, &Zeit);
  oled.clearDisplay();

  oled.setCursor(2, 63);

  oled.setFont(u8g2_font_courB24_tf);

  // Zeichenfarbe weiß
  oled.setDrawColor(1);

  // horizontale Schrift
  oled.setFontDirection(0);
  oled.firstPage();

  do 
  {
    // Datum anzeigen
    oled.setCursor(2, 15);
    oled.setFont(u8g2_font_t0_22_te);

    // Tag: führende 0 ergänzen
    if (Zeit.tm_mday < 10) oled.print("0");
    oled.print(Zeit.tm_mday);
    oled.print(".");

    // Monat: führende 0 ergänzen
    if (Zeit.tm_mon < 10) oled.print("0");
    oled.print(Zeit.tm_mon + 1);
    oled.print(".");

    // Anzahl Jahre seit 1900
    oled.print(Zeit.tm_year + 1900);
    oled.setCursor(2, 63);
    oled.setFont(u8g2_font_logisoso32_tf);

    // horizontale Linie
    oled.drawHLine(1, 22, oled.getDisplayWidth());
    oled.setCursor(2, 63);

    // Zeit anzeigen
    oled.setFont(u8g2_font_logisoso32_tf);
    oled.setCursor(2, 63);

    if (Zeit.tm_hour < 10) oled.print("0");
    oled.print(Zeit.tm_hour);
    oled.print(":");

    if (Zeit.tm_min < 10) oled.print("0");
    oled.print(Zeit.tm_min); 
  } 
  while (oled.nextPage());

  // Serielle Ausgabe mit Namen des Wochentages
  switch (Zeit.tm_wday) {
    case 0:
      Serial.print("Sonntag ");
      break;

    case 1:
      Serial.print("Montag ");
      break;

    case 2:
      Serial.print("Dienstag ");
      break;

    case 3:
      Serial.print("Mittwoch ");
      break;

    case 4:
      Serial.print("Donnerstag ");
      break;

    case 5:
      Serial.print("Freitag ");
      break;

    case 6:
      Serial.print("Samstag ");
      break;
  }

  // Tag: führende 0 ergänzen
  if (Zeit.tm_mday < 10) Serial.print("0");
  Serial.print(Zeit.tm_mday);
  Serial.print(".");

  // Monat: führende 0 ergänzen
  if (Zeit.tm_mon < 10) Serial.print("0");
  Serial.print(Zeit.tm_mon + 1);
  Serial.print(".");

  // Anzahl Jahre seit 1900
  Serial.print(Zeit.tm_year + 1900);
  Serial.print(" ");

  if (Zeit.tm_hour < 10) Serial.print("0");
  Serial.print(Zeit.tm_hour);
  Serial.print(":");

  if (Zeit.tm_min < 10) Serial.print("0");
  Serial.print(Zeit.tm_min); 
  Serial.print(":");
  if (Zeit.tm_sec < 10) Serial.print("0");
  Serial.print(Zeit.tm_sec); 
  Serial.println();
  Serial.print("Tage seit 1. Januar: ");
  Serial.print(Zeit.tm_yday);
  Serial.println();
  if (Zeit.tm_isdst > 0) Serial.println("Sommerzeit");
}

Letzte Aktualisierung: 4. Okt 2023 @ 10:18