Uhr mit großer Anzeige - Teil 2 - AZ-Delivery

Im ersten Teil des Blogs hatte ich das Projekt unseres Kunden Hans-Ulrich Küster mit seiner großformatigen Anzeige der Uhrzeit nachgebaut und beschrieben. Um eine möglichst große Anzeige zu erhalten, hatte er zwei MAX7219 8x32 4 in 1 Dot Matrix LED übereinandergesetzt. Als Uhr diente eine Real Time Clock RTC DS3231 I2C.

In diesem Teil möchte ich zeigen, wie ich den Micro Controller mit ATMEGA 328P durch die WLAN-fähigen Micro Controller von Espressif ersetzt habe. Dazu habe ich zunächst den Sketch weitestgehend unverändert gelassen, jedoch liegen die beiden Schnittstellen SPI und I2C jeweils an anderen Pins als bei dem Micro Controller Board mit ATMEGA. Also musste ich die Schaltung und den Sketch leicht anpassen.

Verwendete Hardware

1

NodeMCU Lua Amica Modul V2 ESP8266 ESP-12F WIFI Wifi Development Board mit CP2102

oder

ESP32 NodeMCU Module WLAN WiFi Development Board mit CP2102

2

MAX7219 8x32 4 in 1 Dot Matrix LED Anzeigemodul

1

Real Time Clock RTC DS3231 I2C 

 

Steckbrett (Breadboard) und Kabel (Jumper Wire)

Bei dem ESP8266 stand ich mehrere Tage lang vor einem scheinbar unlösbaren Problem, denn die im Pinout-Diagramm angezeigte SPI-Schnittstelle mit MOSI an SD1, CS an CMD und SCLK an CLK haute einfach nicht hin. Dazu später mehr.

ESP32

Umso schneller ging es beim ESP32. Hier die Pinbelegung für die SPI-Schnittstelle:

 #define CLK_PIN 18  // or SCK
 #define DATA_PIN 23 // or MOSI
 #define CS_PIN 2   // or SS

Und die Anschlüsse für die RTC an der I2C-Schnittstelle:

// SDA an D21
// SCL an D22

Aus früheren Versuchen wusste ich, dass der ESP32 die Variable LED_BUILTIN nicht kennt, also habe ich nach der entsprechenden Fehlermeldung am Anfang des Sketches die Zeile

 int LED_BUILTIN = 2;

ergänzt.

Die Uhrzeit kannte die (Batterie-gepufferte) Real Time Clock noch von den vorherigen Versuchen, also habe ich gleich den Sketch mit
 bool syncOnFirstStart = false; // true mit Pc synchronisieren, ansonsten false
hochgeladen. Nur für die Synchronisation mit der Uhrzeit des PCs muss die Variable kurzzeitig auf syncOnFirstStart = true  gesetzt werden.

Aufbau mit ESP32

Heureka. Das ging fix.

Hier der Sketch für den ESP32 zum Download

ESP8266

Und nun? Wieder an dem Problem mit dem ESP8266 festbeißen? Oder erst einmal die Zeit von einem NTP-Server im Internet direkt herunterladen?

Ich habe mich für die schnelle Lösung mit einem Beispiel-Sketch der Bibliothek TimeLib.h entschieden. Bei dem Beispiel-Sketch TimeNTP_ESP8266WiFi.ino brauchte ich nur meine WLAN SSID und Passwort einfügen und schon wurde die aktuelle Zeit im Seriellen Monitor angezeigt.

Beispielsketch

Das andere Problem hatte sich immer noch nicht von selbst gelöst. Selbst zum Hochladen des Sketches musste ich die Steckverbindung CS an CMD lösen, ansonsten gab es eine Fehlermeldung beim Verbindungsaufbau. Also Internet-Recherche zur SPI-Schnittstelle am ESP8266. Zu meiner Verwunderung sah ich einen Versuchsaufbau mit dem Analog-Digital-Wandler MCP3008, den ich vom Raspberry Pi gut kannte. Der war allerdings an den Pins angeschlossen, bei denen im Pinout-Diagramm vor den bekannten Abkürzungen jeweils ein H stand, also HSCLK=D5=GPIO14, HMISO=D6=GPIO12, HMOSI=D7=GPIO13 und HCS=D8=GPIO15. Also kurzerhand DIN, CS und CLK der Matrix-LED-Anzeige dort angeschlossen, den Sketch angepasst, und siehe da: es funktionierte.

ESP8266 Pinout

Aufbau mit ESP8266

Hier die Änderungen am Sketch von Herrn Küster:

 #define CS_PIN 15
 #define CLOCK_PIN 14
 #define MOSI_PIN 13
 #define MISO_PIN 12    //bei Display nicht benötigt
 
 // SCL an D1=GPIO5
 // SDA an D2=GPIO4

Und hier der ganze Sketch zum Download.

Synchronisation mit NTP Server

Die Idee zur Verwendung der WLAN-fähigen Micro Controller kam mir, weil ich das zweimalige Hochladen des Sketches zur Synchronisation der Real Time Clock mit der Systemzeit des Rechners, einmal mit bool syncOnFirstStart = true; einmal mit bool syncOnFirstStart = false; für verbesserungswürdig hielt und selbst die deutlich bessere Real Time Clock DS3231 nach mehreren Wochen nicht mehr die genaue Uhrzeit anzeigt. Also wollte ich den Sketch von Herrn Küster mit der großen Anzeige mit dem Beispiel-Sketch für die NTP-Zeit kombinieren.

Im Wesentlichen wird der Sketch für die Internet-Zeit nur um die Ausgabe im Seriellen Monitor „entschlackt“ und dann in den Sketch von Herrn Küster eingefügt. Und dann muss selbstverständlich die Quelle für die Synchronisation geändert werden. Dies geschieht in Zeile 159:

 rtc.adjust(DateTime(uint16_t(year()), uint8_t(month()), uint8_t(day()), uint8_t(hour()), uint8_t(minute()), uint8_t(second())));
 
 // old: rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

Hier der Download des Sketches für den ESP8266 mit Zeit-Synchronisation vom NTP-Server. Bitte beachten Sie, dass Sie in den Zeilen 35 und 36 Ihre „WLAN-Credentials“, also SSID (Name) und Passwort, eingeben müssen. Und die Umschaltung zwischen Sommerzeit und Winterzeit erfolgt durch Auskommentieren in den Zeilen 40 bzw. 41.

Viel Spaß beim Nachbauen. Wenn Sie eine stabile Internetverbindung haben und guten WLAN-Empfang im Schlafzimmer, dann können Sie ggf. die RTC weglassen und die Zeit häufiger mit dem NTP-Server synchronisieren.

DisplaysEsp-32Esp-8266Projekte für fortgeschritteneSmart home

8 Kommentare

Rolf Müller

Rolf Müller

Hat es jemand geschafft, da noch eine Sommerzeit-Regel einzufügen. Das Projekt ist ja sehr gut, aber das umstellen zwischen Sommer und Winterzeit ist ja echt nervig. Der NTP liefert doch auch das Datum.

Andreas Wolter

Andreas Wolter

Die Projekte in diesem Blog dienen auch zur Inspiration für Erweiterungen. Wie man lesen kann, hat Bernd Albrecht Sie inspiriert. Versuchen Sie es selbst einmal und lassen Sie uns wissen, ob es funktioniert hat. Die Idee klingt interessant.

Grüße,
Andreas Wolter

AZ-Delivery Blog

Steffen Mutter

Steffen Mutter

Das ist ja ein tolles Projekt, insbesondere NTP sync ist wirklich eine tolle Idee.
Um die ‘ultimative’ Uhr zu bauen, so Bernd Albrecht Zeit und Muße verspürt, wäre die Digitale Anzeige in der Mitte, aber der Doppelpunkt als extra LEDs, die im Sekundentakt blinken. (Module sind m.E. trennbar)
Rund um die digitale Anzeige einen Ring mit 3×60 LEDs, um die Stunden (ist nur eine LED an, die alle 12 Minuten um eine LED weiter springt), Minuten und Sekunden anzuzeigen.
Wäre sicher ziemlich aufwändig zu realisieren, würde sich aber als Uhr in (m)einer Firma sicher sehr gut machen, zumal die dank NTP (sync jede Stunde) und RTC (wenn jemand das WLAN getötet hat) sehr genau geht…

Ruediger Ebert

Ruediger Ebert

Da mir die Anzeige zu hell war, habe ich ein Potentiometer zur Helligkeitsregelung angeschlossen.
Wer dies auch realisieren möchte, nachfolgende eine kurze Anleitung:

Potentiometer Anschluss zwischen 3.3V und 0V. Abgriff an Analog-Input des ESP8266 anschliessen.
Wert des Potis: 10K

Im Definitionsteil des Sketches folgende Zeilen hinzufügen:
const int analogInPin = A0; // ESP8266 Analog Pin ADC0 = A0
int brightnessPotValue = 0;

Zum Loop folgende Zeilen hinzufügen:
brightnessPotValue = analogRead(analogInPin);
int c = map(brightnessPotValue, 0, 1023, 0, 15);
uhr.control(MD_MAX72XX::INTENSITY, c);

Rüdiger

Ruediger Ebert

Ruediger Ebert

@ Bernd Albrecht: Danke :-)

Bernd Albrecht

Bernd Albrecht

@ Ruediger Ebert: Grundsätzlich ist die Internetzeit in Universal Time Coordinated (UTC) angegeben. Deshalb ist bei dem Sketch „Uhr_2_X_Anzeige_ESP8266_WLAN_NTP.ino“
in den Zeilen 38-41 die Korrektur für die jeweilige Zeitzone angegeben, zurzeit 2 Stunden für MESZ. Der Wert wird in der Variablen timeZone gespeichert. Die Korrektur wird in Zeile 98 addiert.
Schnellste Möglichkeit für die Anzeige in UTC:
Zeile 40 auskommentieren und eine weitere Zeile einfügen:
//const int timeZone = 2; // Central European Summer Time (MESZ)
const int timeZone = 0; // Universal Time Coordinated (UTC)

Nils Sappok

Nils Sappok

Vielen Dank für diesen – wie immer – exzellenten Beitrag!
Da möchte ich es gleich mal nach bauen….
Wie wäre es noch mit einer WS2812B 5050 RGB LED Matrix? Ich habe noch die 8×8 von Euch und zusätzlich gerade eines der flexiblen 8×32 Panels erhalten. Mit dem Uno läuft es problemlos, aber mit dem ESP32 NodeMCU habe ich es noch nicht geschafft. Obwohl es Beispiele im Netz ohne gibt, muss ich wohl einen Pegelwandler einsetzen.
Bleibt gesund! :)

Ruediger Ebert

Ruediger Ebert

Für ein Projekt benötige ich die Anzeige der Uhrzeit in UTC. Dies dies mit dem vorgestellten Projekt möglich?

Rüdiger

Kommentar hinterlassen

Alle Kommentare werden von einem Moderator vor der Veröffentlichung überprüft

Empfohlene Blogbeiträge

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery