
主要思想是创建一个自调整时钟,该时钟应在CET时区工作,并支持夏时制。 作为时间源,我使用了从NEO-7M模块接收的GPS信号,该模块具有一个串行端口。 作为显示单元,我使用了2.9英寸的电子纸(电子墨水)显示器。 所有这些模块都连接到Arduino Nano。
模块连接图
以下是模块的连接图:

- GPS模块使用串行端口进行通信,
- 电子纸显示屏使用4行SPI进行通信。
程序

该程序是用Arduino IDE编写的。 我使用了以下库:
- TinyGPS ++-用于解码接收到的GPS信号并解析时间和日期,
- U8g2lib-控制电子纸的显示,
- 时区-用于管理给定时区中的时间和日期并支持夏时制(这在东欧发生,大约是翻译器)。
图表

1.第一步是初始化平台:用于从GPS模块接收数据,显示电子纸,日期和时间的初始值的软件的序列号。
2.在第二阶段,我们从串行端口接收数据。 分析接收到的GPS信号。
3.如果GPS数据有效,我们将更新日期和时间。
4.此时,我们更新电子纸显示屏上的时间。
源代码(也可作为本文结尾的附件提供)
/ * 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 ()); }
简短的视频演示
二手电子零件
1×2.9'电子纸显示屏(电子墨水),
1个Arduino Nano,
1×NEO-7M
源代码
164955