Developing for Arduino
DIY
30 April 2019

Самонастраивающиеся часы с электронным дисплеем

Original author: Иван Квасневский
Translation


Основная идея заключалась в создании самонастраивающихся часов, которые должны работать в часовом поясе 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

+13
7.1k 46
Comments 131
Top of the day