
Die Hauptidee bestand darin, eine selbsteinstellende Uhr zu erstellen, die in der MEZ-Zeitzone mit Unterstützung der Sommerzeit arbeiten sollte. Als Zeitquelle habe ich das GPS-Signal verwendet, das vom NEO-7M-Modul empfangen wurde, das über eine serielle Schnittstelle verfügt. Als Anzeigeeinheit habe ich ein 2,9-Zoll-E-Paper-Display (elektronische Tinte) verwendet. Alle diese Module sind mit dem Arduino Nano verbunden.
Modulanschlussplan
Unten ist das Anschlussdiagramm der Module:

- Das GPS-Modul verwendet eine serielle Schnittstelle für die Kommunikation.
- Das E-Paper-Display verwendet 4-zeiliges SPI für die Kommunikation.
Das Programm

Das Programm wurde in der Arduino IDE geschrieben. Ich habe die folgenden Bibliotheken verwendet:
- TinyGPS ++ - zum Decodieren des empfangenen GPS-Signals sowie zum Analysieren von Uhrzeit und Datum,
- U8g2lib - zur Steuerung der Anzeige von E-Paper,
- Zeitzone - zum Verwalten von Uhrzeit und Datum in einer bestimmten Zeitzone und zur Unterstützung der Sommerzeit (dies geschieht in Osteuropa, ca. Übersetzer).
Diagramm

1. Der erste Schritt besteht darin, die Plattform zu initialisieren: die Seriennummer der Software zum Empfangen von Daten vom GPS-Modul, die Anzeige von E-Paper, den Anfangswert für Datum und Uhrzeit.
2. In der zweiten Stufe erhalten wir Daten von der seriellen Schnittstelle. Das empfangene GPS-Signal wird analysiert.
3. Wenn die GPS-Daten gültig sind, aktualisieren wir Datum und Uhrzeit.
4. Zu diesem Zeitpunkt aktualisieren wir die Uhrzeit auf dem E-Paper-Display.
Quellcode (auch als Anhang am Ende des Artikels erhältlich)
/ * CET DST kk99 2018 * / # include <SoftwareSerial.h> # include <TinyGPS ++. h> # include <SPI.h> # include <U8g2lib.h> # include <Timezone.h> # include <Arduino.h> // GPS TinyGPSPlus gps; // EDP U8G2_IL3820_V2_296X128_1_4W_HW_SPI u8g2 (U8G2_R0, / * cs = * / 10 , / * dc = * / 9 , / * reset = * / 8 ) ; // TimeChangeRule CEST = { "CEST" , Last, Sun, Mar, 2 , 120 }; // TimeChangeRule CET = { "CET" , Last, Sun, Oct, 3 , 60 }; // - CE (CEST, CET) ; TimeChangeRule * tcr; // SoftwareSerial softSerial ( 3 , 2 ) ; void setup () { // , : u8g2.begin (); softSerial.begin ( 9600 ); setTime ( 00 , 00 , 00 , 01 , 01 , 1970 ); } void loop () { // : readGPSData ( 1000 ); (); displayTime (); ( 59000 ); } static void readGPSData ( unsigned long timeoutMs) { unsigned long start = millis (); { while (softSerial.available ()) gps.encode (softSerial.read ()); } while (millis () - start <timeoutMs); } static void updateTime ( void ) { if (gps.time.isValid () && gps.date.isValid ()) { setTime (gps.time.hour (), gps.time.minute (), gps.time.second (), gps.date.day (), gps.date.month (), gps.date.year ()) ; } } static void displayTime ( void ) { const unsigned timeLength = 6 ; char timeValue [timeLength]; time_t utc = now (); time_t local = CE.toLocal (utc, & tcr); snprintf (timeValue, timeLength, "% 02d:% 02d" , (), ()); u8g2.firstPage (); { u8g2.setFont (u8g2_font_logisoso78_tn); u8g2.drawStr ( 26 , 103 , timeValue); } while (u8g2.nextPage ()); }
Kurze Videopräsentation
Gebrauchte elektronische Komponenten
1 × 2,9 'E-Paper-Display (elektronische Tinte),
1 × Arduino Nano,
1 × NEO-7M
Quellcode
164955