Arloji menyesuaikan diri dengan tampilan elektronik



Gagasan utamanya adalah membuat jam penyesuaian diri yang seharusnya bekerja di zona waktu CET dengan dukungan untuk waktu musim panas. Sebagai sumber waktu, saya menggunakan sinyal GPS yang diterima dari modul NEO-7M, yang memiliki port serial. Sebagai unit tampilan, saya menggunakan layar e-Paper (tinta elektronik) 2,9 inci. Semua modul ini terhubung ke Arduino Nano.

Diagram koneksi modul


Di bawah ini adalah diagram koneksi modul:



  • modul GPS menggunakan port serial untuk komunikasi,
  • Tampilan e-Paper menggunakan SPI 4-line untuk komunikasi.

Programnya




Program ini ditulis dalam IDE Arduino. Saya menggunakan perpustakaan berikut:

  • TinyGPS ++ - untuk mendekode sinyal GPS yang diterima dan waktu serta tanggal parsing,
  • U8g2lib - untuk mengontrol tampilan e-Paper,
  • Zona waktu - untuk mengatur waktu dan tanggal dalam zona waktu tertentu dan mendukung waktu musim panas (ini terjadi di Eropa Timur, kira-kira Penerjemah).

Bagan




1. Langkah pertama adalah menginisialisasi platform: nomor seri perangkat lunak untuk menerima data dari modul GPS, menampilkan e-Paper, nilai awal untuk tanggal dan waktu.

2. Pada tahap kedua, kami menerima data dari port serial. Sinyal GPS yang diterima dianalisis.

3. Jika data GPS valid, kami memperbarui tanggal dan waktu.

4. Pada titik ini, kami memperbarui waktu pada tampilan e-Paper.

Kode sumber (juga tersedia sebagai lampiran di akhir artikel)


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

Presentasi video singkat



Komponen elektronik bekas


Layar e-Paper 1 ร— 2,9 '(tinta elektronik),
1 ร— Arduino Nano,
1 ร— NEO-7M

Kode sumber


164955

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


All Articles