{"id":6227,"date":"2026-07-05T23:34:00","date_gmt":"2026-07-05T23:34:00","guid":{"rendered":"https:\/\/technodidact.de\/?p=6227"},"modified":"2026-07-05T12:39:00","modified_gmt":"2026-07-05T12:39:00","slug":"die-eigene-internet-uhr-ein-esp8266-projekt-fuer-einsteiger","status":"publish","type":"post","link":"https:\/\/technodidact.de\/en\/die-eigene-internet-uhr-ein-esp8266-projekt-fuer-einsteiger\/","title":{"rendered":"Die eigene Internet-Uhr: Ein ESP8266-Projekt f\u00fcr Einsteiger"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>Von DerSchneider<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Einleitung<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Uhren gehen vor oder nach. Bei jeder Zeitumstellung muss nachjustiert werden. Computer hingegen beziehen ihre Zeit seit Jahrzehnten automatisch von NTP-Servern \u2013 sie sind per Definition immer auf die Sekunde genau. Warum sollte man diese Pr\u00e4zision nicht auch f\u00fcr eine eigene Wanduhr nutzen?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Antwort lautet: ESP8266. Dieses winzige, preiswerte Modul kann sich per WLAN mit einem Zeitserver verbinden, die aktuelle UTC-Zeit abrufen und auf einem kleinen OLED-Display anzeigen. Was auf den ersten Blick nach einem fortgeschrittenen Projekt klingt, ist mit der richtigen Anleitung auch f\u00fcr Einsteiger machbar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dieser Artikel f\u00fchrt Schritt f\u00fcr Schritt durch die Entwicklung einer voll funktionsf\u00e4higen Internet-Uhr auf Basis des ESP8266 NodeMCU. Das Besondere: Die Uhr ber\u00fccksichtigt automatisch Sommer- und Winterzeit und zeigt nicht nur die Uhrzeit, sondern auch Datum, Wochentag und Kalenderwoche an. Ein Anf\u00e4ngerprojekt mit \u00fcberraschendem Tiefgang.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Was ist eine Internet-Uhr und wie funktioniert sie?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Das Herzst\u00fcck ist das Network Time Protocol (NTP). Dieses seit 1985 existierende Protokoll<a href=\"https:\/\/funduino.de\/analoge-uhr-mit-wemos-d1\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>&nbsp;erm\u00f6glicht die hochpr\u00e4zise Synchronisation von Uhren in Computernetzen. Weltweit existieren \u00f6ffentlich zug\u00e4ngliche NTP-Server \u2013 darunter der bekannte&nbsp;<code>pool.ntp.org<\/code>&nbsp;\u2013, die von jedem internetf\u00e4higen Ger\u00e4t angefragt werden k\u00f6nnen<a href=\"https:\/\/www.az-delivery.de\/blogs\/azdelivery-blog-fur-arduino-und-raspberry-pi\/ntp-utc-uhr-mit-esp8266-01s-0-96-oled-display?srsltid=AfmBOopW2O7CSZgs0o2ZICvHJUoyJf77jy203R3POlDErxwSp-sBFgmk\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der ESP8266 fragt in regelm\u00e4\u00dfigen Abst\u00e4nden einen solchen Server ab und erh\u00e4lt die aktuelle UTC-Zeit (koordinierte Weltzeit). Da der ESP8266 selbst keine interne Echtzeituhr besitzt, wird die Zeit bei jedem Abruf neu synchronisiert \u2013 ein einfacher, aber effektiver Ansatz, der auf eine externe Batterie verzichtet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die eigentliche Herausforderung besteht nicht im Zeitabruf, sondern in der korrekten Umrechnung der UTC-Zeit in die lokale Zeit unter Ber\u00fccksichtigung der Sommerzeit. Die europ\u00e4ische Regelung \u2013 letzter Sonntag im M\u00e4rz bis letzter Sonntag im Oktober \u2013 muss im Code abgebildet werden.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Ben\u00f6tigte Komponenten<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Komponente<\/th><th class=\"has-text-align-left\" data-align=\"left\">Typ<\/th><th class=\"has-text-align-left\" data-align=\"left\">Anmerkung<\/th><\/tr><\/thead><tbody><tr><td>Mikrocontroller<\/td><td>ESP8266 NodeMCU (ESP-12E)<\/td><td>Alternativ Wemos D1 Mini<a href=\"https:\/\/funduino.de\/analoge-uhr-mit-wemos-d1\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><\/td><\/tr><tr><td>Display<\/td><td>0,96\u2033 OLED SSD1306, 128\u00d764 Pixel, I\u00b2C<\/td><td>4-polige Variante<a href=\"https:\/\/www.esp8266.com\/viewtopic.php?f=11&amp;t=24401\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><\/td><\/tr><tr><td>Verbindungskabel<\/td><td>Jumper-Kabel (female\u2013female)<\/td><td>4 St\u00fcck<a href=\"https:\/\/www.az-delivery.de\/blogs\/azdelivery-blog-fur-arduino-und-raspberry-pi\/ntp-utc-uhr-mit-esp8266-01s-0-96-oled-display?srsltid=AfmBOopW2O7CSZgs0o2ZICvHJUoyJf77jy203R3POlDErxwSp-sBFgmk\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><\/td><\/tr><tr><td>Stromversorgung<\/td><td>Micro-USB-Kabel + Netzteil<\/td><td>Oder USB-Port des Computers<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Das SSD1306-OLED-Display ben\u00f6tigt keine Hintergrundbeleuchtung und verbraucht nur dann Energie, wenn einzelne Pixel leuchten \u2013 ideal f\u00fcr den Dauerbetrieb<a href=\"https:\/\/www.esp8266.com\/viewtopic.php?f=11&amp;t=24401\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>. Die I\u00b2C-Variante ben\u00f6tigt nur vier Anschl\u00fcsse: VCC, GND, SCL und SDA.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Schritt 1: Die Entwicklungsumgebung einrichten<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die Programmierung erfolgt \u00fcber die kostenlose Arduino IDE. Folgende Schritte sind notwendig:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Arduino IDE installieren<\/strong>\u00a0(Version 1.8.19 oder neuer) von\u00a0<a href=\"https:\/\/www.arduino.cc\/\" target=\"_blank\" rel=\"noreferrer noopener\">arduino.cc<\/a>.<\/li>\n\n\n\n<li><strong>ESP8266-Unterst\u00fctzung nachinstallieren<\/strong>: Unter\u00a0<em>Datei \u2192 Voreinstellungen<\/em>\u00a0wird bei\u00a0<em>Zus\u00e4tzliche Boardverwalter-URLs<\/em>\u00a0folgende Adresse eingef\u00fcgt<a href=\"https:\/\/funduino.de\/analoge-uhr-mit-wemos-d1\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>:texthttps:\/\/arduino.esp8266.com\/stable\/package_esp8266com_index.json<\/li>\n\n\n\n<li><strong>Board-Paket installieren<\/strong>:\u00a0<em>Werkzeuge \u2192 Board \u2192 Boardverwalter<\/em>, nach\u00a0<code>esp8266<\/code>\u00a0suchen und die aktuellste Version installieren<a href=\"https:\/\/funduino.de\/analoge-uhr-mit-wemos-d1\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>.<\/li>\n\n\n\n<li><strong>Board ausw\u00e4hlen<\/strong>:\u00a0<em>Werkzeuge \u2192 Board \u2192 ESP8266 Boards \u2192 NodeMCU 1.0 (ESP-12E Module)<\/em>.<\/li>\n\n\n\n<li><strong>Bibliotheken installieren<\/strong>:\n<ul class=\"wp-block-list\">\n<li><strong>U8g2<\/strong>:\u00a0<em>Sketch \u2192 Bibliothek einbinden \u2192 Bibliotheken verwalten<\/em>, nach\u00a0<code>U8g2<\/code>\u00a0suchen und installieren. Diese Bibliothek steuert das OLED-Display.<\/li>\n\n\n\n<li><strong>NTPClient<\/strong>: Ebenfalls \u00fcber den Bibliotheksverwalter installieren.<\/li>\n\n\n\n<li><strong>TimeLib<\/strong>: Wird f\u00fcr die Zeitberechnung ben\u00f6tigt.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Schritt 2: Der Schaltplan \u2013 Verdrahtung der Hardware<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die I\u00b2C-Verbindung zwischen ESP8266 und OLED-Display ist denkbar einfach<a href=\"https:\/\/www.esp8266.com\/viewtopic.php?f=11&amp;t=24401\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">OLED-Pin<\/th><th class=\"has-text-align-left\" data-align=\"left\">ESP8266 NodeMCU<\/th><th class=\"has-text-align-left\" data-align=\"left\">Bemerkung<\/th><\/tr><\/thead><tbody><tr><td>VCC<\/td><td>3.3V<\/td><td>Betriebsspannung<\/td><\/tr><tr><td>GND<\/td><td>GND<\/td><td>Masse<\/td><\/tr><tr><td>SCL<\/td><td>D1 (GPIO5)<\/td><td>I\u00b2C-Takt<\/td><\/tr><tr><td>SDA<\/td><td>D2 (GPIO4)<\/td><td>I\u00b2C-Daten<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Wichtig<\/strong>: Der ESP8266 arbeitet mit 3,3V-Logik. Das OLED-Display ist damit kompatibel. Ein Spannungswandler ist nicht erforderlich.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein h\u00e4ufiger Fehler: Die Pins D1 und D2 werden f\u00e4lschlicherweise mit anderen GPIOs vertauscht. F\u00fcr I\u00b2C sind GPIO5 (SCL) und GPIO4 (SDA) die empfohlenen Pins.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Schritt 3: Das Programm \u2013 Zeile f\u00fcr Zeile erkl\u00e4rt<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Der vollst\u00e4ndige Quellcode ist umfangreich, l\u00e4sst sich aber in \u00fcberschaubare Abschnitte gliedern.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.1 Bibliotheken einbinden und Konfiguration<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">cpp<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#include &lt;U8g2lib.h&gt;\n#include &lt;Wire.h&gt;\n#include &lt;TimeLib.h&gt;\n#include &lt;ESP8266WiFi.h&gt;\n#include &lt;NTPClient.h&gt;\n#include &lt;WiFiUdp.h&gt;<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>U8g2lib.h<\/code>: Steuerung des OLED-Displays<\/li>\n\n\n\n<li><code>Wire.h<\/code>: I\u00b2C-Kommunikation<\/li>\n\n\n\n<li><code>TimeLib.h<\/code>: Zeitberechnungen (Schaltjahr, Wochentag)<\/li>\n\n\n\n<li><code>ESP8266WiFi.h<\/code>: WLAN-Funktionalit\u00e4t<\/li>\n\n\n\n<li><code>NTPClient.h<\/code>\u00a0\/\u00a0<code>WiFiUdp.h<\/code>: NTP-Zeitabruf \u00fcber UDP<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Die WLAN-Zugangsdaten werden als Konstanten definiert:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">cpp<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">const char* ssid = \"DEIN_WLAN_NAME\";\nconst char* password = \"DEIN_WLAN_PASSWORT\";<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Der NTP-Client wird mit dem Zeitserver&nbsp;<code>pool.ntp.org<\/code>&nbsp;initialisiert. Der&nbsp;<code>gmtOffset_sec<\/code>&nbsp;wird auf&nbsp;<code>0<\/code>&nbsp;gesetzt, da die Zeitzonenumrechnung im Code selbst erfolgt \u2013 dies ist der sauberste Weg, um Sommer- und Winterzeit korrekt abzubilden.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.2 Display-Initialisierung<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">cpp<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(\n    U8G2_R0, \n    <em>\/* clock=*\/<\/em> 14,   <em>\/\/ SCL an GPIO14 (D5) \u2013 Achtung: Anpassung!<\/em>\n    <em>\/* data=*\/<\/em> 12,    <em>\/\/ SDA an GPIO12 (D6) \u2013 Achtung: Anpassung!<\/em>\n    <em>\/* reset=*\/<\/em> U8X8_PIN_NONE\n);<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Achtung<\/strong>: In dieser Initialisierung werden die Pins 14 (SCL) und 12 (SDA) verwendet. Wer die empfohlenen Pins D1 (GPIO5) und D2 (GPIO4) nutzen m\u00f6chte, muss die Werte entsprechend anpassen:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">cpp<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(\n    U8G2_R0, \n    <em>\/* clock=*\/<\/em> 5,    <em>\/\/ GPIO5 = D1<\/em>\n    <em>\/* data=*\/<\/em> 4,     <em>\/\/ GPIO4 = D2<\/em>\n    <em>\/* reset=*\/<\/em> U8X8_PIN_NONE\n);<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3.3 Sommerzeit-Erkennung<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Die Funktion&nbsp;<code>isSummerTimeSimple()<\/code>&nbsp;pr\u00fcft, ob das aktuelle Datum in der europ\u00e4ischen Sommerzeit liegt:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">cpp<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">bool isSummerTimeSimple(tmElements_t tm) {\n    int year = tmYearToCalendar(tm.Year);\n    int month = tm.Month;\n    int day = tm.Day;\n    int hour = tm.Hour;\n    \n    if (month &lt; 3 || month &gt; 10) return false;\n    if (month &gt; 3 &amp;&amp; month &lt; 10) return true;\n    \n    <em>\/\/ M\u00e4rz: Letzter Sonntag, 2:00 Uhr<\/em>\n    if (month == 3) {\n        int lastSunday = 31 - ((5 * year \/ 4 + 4) % 7);\n        if (day &gt; lastSunday) return true;\n        if (day == lastSunday &amp;&amp; hour &gt;= 2) return true;\n        return false;\n    }\n    \n    <em>\/\/ Oktober: Letzter Sonntag, 3:00 Uhr<\/em>\n    if (month == 10) {\n        int lastSunday = 31 - ((5 * year \/ 4 + 1) % 7);\n        if (day &gt; lastSunday) return false;\n        if (day == lastSunday &amp;&amp; hour &gt;= 3) return false;\n        return true;\n    }\n    \n    return false;\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dieser Algorithmus berechnet den letzten Sonntag im M\u00e4rz und Oktober \u2013 die beiden Schalttage der europ\u00e4ischen Sommerzeit<a href=\"https:\/\/funduino.de\/analoge-uhr-mit-wemos-d1\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.4 Zeitumrechnung auf lokale Zeit<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">cpp<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">void adjustForLocalTime(tmElements_t &amp;tm) {\n    int hourOffset = 1;  <em>\/\/ Winterzeit: MEZ = UTC+1<\/em>\n    if (isSummerTime(tm)) {\n        hourOffset = 2;   <em>\/\/ Sommerzeit: MESZ = UTC+2<\/em>\n    }\n    tm.Hour += hourOffset;\n    <em>\/\/ Korrektur bei Stunden\u00fcberlauf<\/em>\n    if (tm.Hour &gt;= 24) {\n        tm.Hour -= 24;\n        tm.Day++;\n        <em>\/\/ Monats- und Jahreskorrektur (vereinfacht)<\/em>\n        if (tm.Day &gt; 31) {\n            tm.Day = 1;\n            tm.Month++;\n            if (tm.Month &gt; 12) {\n                tm.Month = 1;\n                tm.Year++;\n            }\n        }\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die Funktion addiert je nach Jahreszeit eine oder zwei Stunden zur UTC-Zeit. Die vereinfachte Monatskorrektur ist f\u00fcr dieses Projekt ausreichend \u2013 f\u00fcr den 31. eines Monats wird auf den 1. des Folgemonats gesprungen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.5 Kalenderwoche berechnen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Die Kalenderwoche nach ISO 8601 (Wochenbeginn Montag) zu berechnen, ist eine der anspruchsvolleren Aufgaben. Der Algorithmus basiert auf dem Wochentag des 4. Januars \u2013 der Tag, der definiert, ob eine Woche zur ersten Kalenderwoche geh\u00f6rt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">cpp<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">int calculateWeekNumberSimple(tmElements_t tm) {\n    int year = tmYearToCalendar(tm.Year);\n    int month = tm.Month;\n    int day = tm.Day;\n    \n    <em>\/\/ Tage seit Jahresbeginn<\/em>\n    int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};\n    bool isLeapYear = (year % 4 == 0 &amp;&amp; year % 100 != 0) || (year % 400 == 0);\n    if (isLeapYear) daysInMonth[1] = 29;\n    \n    int dayOfYear = day;\n    for (int i = 0; i &lt; month - 1; i++) {\n        dayOfYear += daysInMonth[i];\n    }\n    \n    <em>\/\/ Wochentag des 4. Januars (Zeller's Kongruenz)<\/em>\n    int y = year;\n    int K = y % 100;\n    int J = y \/ 100;\n    int h = (4 + (13*14)\/5 + K + K\/4 + J\/4 + 5*J) % 7;\n    int jan4Weekday = (h + 5) % 7; <em>\/\/ 0=Sonntag, 1=Montag, ...<\/em>\n    \n    int weekday = tm.Wday - 1; <em>\/\/ 0=Sonntag, 1=Montag, ...<\/em>\n    \n    int correction = 0;\n    if (weekday &lt; jan4Weekday) correction = 1;\n    \n    int weekNumber = (dayOfYear - jan4Weekday + 10) \/ 7 - correction;\n    \n    <em>\/\/ Grenzf\u00e4lle behandeln<\/em>\n    if (weekNumber &lt; 1) return 52;\n    if (weekNumber &gt; 52) {\n        <em>\/\/ Pr\u00fcfen, ob das Jahr 53 Wochen hat<\/em>\n        int h2 = (1 + (13*14)\/5 + K + K\/4 + J\/4 + 5*J) % 7;\n        int jan1Weekday = (h2 + 5) % 7;\n        if (jan1Weekday == 3 || (isLeapYear &amp;&amp; jan1Weekday == 2)) {\n            return 53;\n        }\n        return 1;\n    }\n    return weekNumber;\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3.6 Die Hauptschleife \u2013 Anzeige aktualisieren<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Die&nbsp;<code>loop()<\/code>-Funktion aktualisiert die Anzeige einmal pro Sekunde:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">cpp<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">void loop() {\n    static unsigned long lastUpdate = 0;\n    \n    if (millis() - lastUpdate &gt;= 1000) {\n        lastUpdate = millis();\n        \n        timeClient.update();\n        time_t currentTime = timeClient.getEpochTime();\n        \n        tmElements_t tm;\n        breakTime(currentTime, tm);\n        \n        tmElements_t localTm = tm;\n        bool isSummer = isSummerTimeSimple(localTm);\n        adjustForLocalTime(localTm);\n        int weekNumber = calculateWeekNumberSimple(localTm);\n        \n        <em>\/\/ Formatieren und anzeigen<\/em>\n        char timeStr[20];\n        snprintf(timeStr, sizeof(timeStr), \"%02d:%02d\", \n                 localTm.Hour, localTm.Minute);\n        <em>\/\/ ... Display-Ausgabe<\/em>\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die statische Variable&nbsp;<code>lastUpdate<\/code>&nbsp;speichert den Zeitpunkt der letzten Aktualisierung.&nbsp;<code>millis()<\/code>&nbsp;liefert die seit dem Start vergangenen Millisekunden \u2013 ein einfacher, aber effektiver Timer.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Schritt 4: Programm hochladen und testen<\/h2>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>ESP8266 per USB mit dem Computer verbinden<\/strong>.<\/li>\n\n\n\n<li>In der Arduino IDE den richtigen\u00a0<strong>Port<\/strong>\u00a0ausw\u00e4hlen (<em>Werkzeuge \u2192 Port<\/em>).<\/li>\n\n\n\n<li>Auf\u00a0<strong>Hochladen<\/strong>\u00a0(Pfeil-Symbol) klicken.<\/li>\n\n\n\n<li>Die\u00a0<strong>Ausgabe im Seriellen Monitor<\/strong>\u00a0verfolgen (<em>Werkzeuge \u2192 Serieller Monitor<\/em>, 115200 Baud).<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Nach erfolgreichem Upload verbindet sich der ESP8266 mit dem WLAN und synchronisiert die Zeit. Das Display zeigt Datum, Uhrzeit und Kalenderwoche an.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Fehlersuche<\/strong>: Zeigt das Display nichts an, kann die I\u00b2C-Adresse des OLED-Displays abweichen. Der I\u00b2C-Scanner-Sketch (in der Arduino IDE unter&nbsp;<em>Beispiele \u2192 Wire \u2192 i2c_scanner<\/em>) hilft, die korrekte Adresse zu ermitteln \u2013 \u00fcblich sind&nbsp;<code>0x3C<\/code>&nbsp;oder&nbsp;<code>0x3D<\/code><a href=\"https:\/\/www.az-delivery.de\/blogs\/azdelivery-blog-fur-arduino-und-raspberry-pi\/ntp-utc-uhr-mit-esp8266-01s-0-96-oled-display?srsltid=AfmBOopW2O7CSZgs0o2ZICvHJUoyJf77jy203R3POlDErxwSp-sBFgmk\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">M\u00f6gliche Erweiterungen und Variationen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Das Grundger\u00fcst l\u00e4sst sich auf vielf\u00e4ltige Weise erweitern:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Wetterdaten<\/strong>: Abruf von Temperatur und Luftfeuchtigkeit \u00fcber eine Wetter-API<a href=\"https:\/\/forum.bastelgarage.ch\/d\/62-heltec-wifi-kit8-board-esp8266-projekt-uhr-mit-wetterdatenanzeige\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><\/li>\n\n\n\n<li><strong>Raumtemperatur<\/strong>: Anschluss eines DHT22-Sensors<\/li>\n\n\n\n<li><strong>Geh\u00e4use<\/strong>: 3D-gedrucktes Geh\u00e4use f\u00fcr einen stabilen Stand<a href=\"https:\/\/www.az-delivery.de\/blogs\/azdelivery-blog-fur-arduino-und-raspberry-pi\/ntp-utc-uhr-mit-esp8266-01s-0-96-oled-display?srsltid=AfmBOopW2O7CSZgs0o2ZICvHJUoyJf77jy203R3POlDErxwSp-sBFgmk\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><\/li>\n\n\n\n<li><strong>Deep Sleep<\/strong>: Stromsparmodus f\u00fcr batteriebetriebenen Betrieb<a href=\"https:\/\/draeger-it.blog\/esp8266-programmierung-mit-096-oled-display-von-ideaspark-eine-schritt-fuer-schritt-anleitung\/\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><\/li>\n\n\n\n<li><strong>OTA-Updates<\/strong>: Programmaktualisierung \u00fcber WLAN, ohne USB-Kabel<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die Entwicklung einer Internet-Uhr mit ESP8266 ist ein ideales Einsteigerprojekt: Die Hardware ist preiswert und einfach zu verdrahten, die Software baut auf etablierten Bibliotheken auf und das Ergebnis \u2013 eine pr\u00e4zise, automatisch sommerzeitumstellende Uhr \u2013 ist im Alltag tats\u00e4chlich n\u00fctzlich.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die besondere Herausforderung liegt in der korrekten Zeitumrechnung und der Berechnung der Kalenderwoche \u2013 beides Themen, die weit \u00fcber das reine \u201eLicht-an-Licht-aus\u201c-Programmieren hinausgehen. Wer dieses Projekt verstanden hat, beherrscht die Grundlagen der Netzwerkprogrammierung, der Zeitsynchronisation und der grafischen Anzeige auf OLED-Displays.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die n\u00e4chste Zeitumstellung kommt bestimmt \u2013 mit dieser Uhr ist sie kein Problem mehr.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Quellen<\/h2>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>ESP8266 Community Forum<\/strong>:\u00a0<em>How to Wire an OLED Display with ESP8266 NodeMCU<\/em>.\u00a0<a href=\"https:\/\/www.esp8266.com\/viewtopic.php?f=11&amp;t=24401\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.esp8266.com\/viewtopic.php?f=11&amp;t=24401<\/a>\u00a0<a href=\"https:\/\/www.esp8266.com\/viewtopic.php?f=11&amp;t=24401\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><\/li>\n\n\n\n<li><strong><a href=\"https:\/\/funduino.de\/\" target=\"_blank\" rel=\"noreferrer noopener\">funduino.de<\/a><\/strong>:\u00a0<em>Analoge Uhr mit Wemos D1 Mini<\/em>.\u00a0<a href=\"https:\/\/funduino.de\/analoge-uhr-mit-wemos-d1\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/funduino.de\/analoge-uhr-mit-wemos-d1<\/a>\u00a0<a href=\"https:\/\/funduino.de\/analoge-uhr-mit-wemos-d1\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><\/li>\n\n\n\n<li><strong>AZ-Delivery Blog<\/strong>:\u00a0<em>NTP-UTC-UHR mit ESP8266-01S + 0,96&#8243; OLED-Display<\/em>.\u00a0<a href=\"https:\/\/www.az-delivery.de\/blogs\/azdelivery-blog-fur-arduino-und-raspberry-pi\/ntp-utc-uhr-mit-esp8266-01s-0-96-oled-display\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.az-delivery.de\/blogs\/azdelivery-blog-fur-arduino-und-raspberry-pi\/ntp-utc-uhr-mit-esp8266-01s-0-96-oled-display<\/a>\u00a0<a href=\"https:\/\/www.az-delivery.de\/blogs\/azdelivery-blog-fur-arduino-und-raspberry-pi\/ntp-utc-uhr-mit-esp8266-01s-0-96-oled-display?srsltid=AfmBOopW2O7CSZgs0o2ZICvHJUoyJf77jy203R3POlDErxwSp-sBFgmk\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><\/li>\n\n\n\n<li><strong><a href=\"https:\/\/draeger-it.blog\/\" target=\"_blank\" rel=\"noreferrer noopener\">draeger-it.blog<\/a><\/strong>:\u00a0<em>ESP8266 Programmierung mit 0,96&#8243; OLED Display von Ideaspark<\/em>.\u00a0<a href=\"https:\/\/draeger-it.blog\/esp8266-programmierung-mit-096-oled-display-von-ideaspark-eine-schritt-fuer-schritt-anleitung\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/draeger-it.blog\/esp8266-programmierung-mit-096-oled-display-von-ideaspark-eine-schritt-fuer-schritt-anleitung\/<\/a>\u00a0<a href=\"https:\/\/draeger-it.blog\/esp8266-programmierung-mit-096-oled-display-von-ideaspark-eine-schritt-fuer-schritt-anleitung\/\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><\/li>\n\n\n\n<li><strong>Arduino Forum<\/strong>:\u00a0<em>Heltec WIFI Kit8 Board ESP8266 \u2013 Projekt &#8222;Uhr mit Wetterdatenanzeige&#8220;<\/em>.\u00a0<a href=\"https:\/\/forum.bastelgarage.ch\/d\/62-heltec-wifi-kit8-board-esp8266-projekt-uhr-mit-wetterdatenanzeige\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/forum.bastelgarage.ch\/d\/62-heltec-wifi-kit8-board-esp8266-projekt-uhr-mit-wetterdatenanzeige<\/a>\u00a0<a href=\"https:\/\/forum.bastelgarage.ch\/d\/62-heltec-wifi-kit8-board-esp8266-projekt-uhr-mit-wetterdatenanzeige\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><\/li>\n\n\n\n<li><strong>GitHub \u2013 NTPClient Library<\/strong>:\u00a0<em>NTP Client library for ESP8266 with full timezone support<\/em>.\u00a0<a href=\"https:\/\/github.com\/brunnels\/NTPClient\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/brunnels\/NTPClient<\/a>\u00a0<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Von DerSchneider Einleitung Uhren gehen vor oder nach. Bei jeder Zeitumstellung muss nachjustiert werden. Computer hingegen beziehen ihre Zeit seit Jahrzehnten automatisch von NTP-Servern \u2013 sie sind per Definition immer auf die Sekunde genau. Warum sollte man diese Pr\u00e4zision nicht auch f\u00fcr eine eigene Wanduhr nutzen? Die Antwort lautet: ESP8266. Dieses winzige, preiswerte Modul kann [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[42,26],"tags":[8948,2237,3205,8949,8946,5078,8947],"class_list":["post-6227","post","type-post","status-publish","format-standard","hentry","category-elektrotechnik","category-mit-den-handen","tag-arduino-ide","tag-esp8266","tag-ic","tag-kalenderwoche","tag-ntp-uhr","tag-oled-display","tag-sommerzeit"],"_links":{"self":[{"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/posts\/6227","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/comments?post=6227"}],"version-history":[{"count":1,"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/posts\/6227\/revisions"}],"predecessor-version":[{"id":6228,"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/posts\/6227\/revisions\/6228"}],"wp:attachment":[{"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/media?parent=6227"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/categories?post=6227"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/tags?post=6227"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}