Relógio autoajustável com visor eletrônico



A idéia principal era criar um relógio autoajustável que funcionasse no fuso horário da CET, com suporte para o horário de verão. Como fonte de tempo, usei o sinal de GPS recebido do módulo NEO-7M, que possui uma porta serial. Como unidade de exibição, usei uma tela de papel eletrônico de 2,9 polegadas (tinta eletrônica). Todos esses módulos estão conectados ao Arduino Nano.

Diagrama de conexão do módulo


Abaixo está o diagrama de conexão dos módulos:



  • o módulo GPS usa uma porta serial para comunicação,
  • O visor do e-Paper usa SPI de 4 linhas para comunicação.

O programa




O programa foi escrito no IDE do Arduino. Eu usei as seguintes bibliotecas:

  • TinyGPS ++ - para decodificar o sinal GPS recebido e analisar hora e data,
  • U8g2lib - para controlar a exibição do e-Paper,
  • Fuso horário - para gerenciar a hora e a data em um determinado fuso horário e dar suporte ao horário de verão (isso está acontecendo na Europa Oriental, aprox. Tradutor).

Gráfico




1. O primeiro passo é inicializar a plataforma: o número de série do software para receber dados do módulo GPS, exibindo e-Paper, o valor inicial da data e hora.

2. No segundo estágio, recebemos dados da porta serial. O sinal GPS recebido é analisado.

3. Se os dados do GPS forem válidos, atualizamos a data e a hora.

4. Nesse momento, atualizamos a hora no visor do e-Paper.

Código fonte (também disponível como anexo no final do artigo)


/ *      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 ()); } 

Breve apresentação em vídeo



Componentes eletrônicos usados


Visor de papel eletrônico de 1 × 2,9 '(tinta eletrônica),
1 × Arduino Nano,
1 × NEO-7M

Código fonte


164955

Source: https://habr.com/ru/post/pt450102/


All Articles