
Основная идея заключалась в создании самонастраивающихся часов, которые должны работать в часовом поясе CET с поддержкой перехода на летнее время. В качестве источника времени я использовал сигнал GPS, полученный от модуля NEO-7M, который имеет последовательный порт. В качестве блока индикации я использовал 2,9-дюймовый дисплей e-Paper ( электронными чернилами). Все эти модули подключены к Arduino Nano.
Схема подключения модулей
Ниже представлена схема подключения модулей:

- модуль GPS использует последовательный порт для связи,
- дисплей e-Paper использует 4-строчный SPI для связи.
Программа

Программа была написана в Arduino IDE. Я использовал следующие библиотеки:
- TinyGPS ++ — для декодирования полученного сигнала GPS и разбора времени и даты,
- U8g2lib — для управления дисплея e-Paper,
- Часовой пояс — для управления временем и датой в заданном часовом поясе и поддержкой летнего времени (дело происходит в Восточной Европе, прим. переводчика).
Диаграмма

1. Первый шаг — инициализация платформы: серийный номер программного обеспечения для приема данных с модуля GPS, отображение e-Paper, начальное значение даты и времени.
2. На втором этапе мы получаем данные от последовательного порта. Полученный сигнал GPS анализируется.
3. Если данные GPS действительны, мы обновляем дату и время.
4. На этом этапе мы обновляем время на дисплее e-Paper.
Исходный код (также доступен во вложении к конце статьи)
/ *
Самонастраивающиеся часы для часового пояса 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 'дисплей e-Paper (электронные чернила),
1 × Arduino Nano,
1 × НЕО-7М
Исходный код
164955