GPSモジュールを使ったDigital Clockの製作



 LED-Matrix-Panelに時刻・日付・曜日を表示しました。

LED Matrix Panelで、GPSモジュールの時刻・日付を利用した Digital Clockを製作しました。



 このGPS Digital Clockは、GPSモジュールから時刻・日付のデータを受信して、LED-Matrix Panelに表示するように しました。
 その際、以下のサイトを参考にさせていただきました。
  Arduino GPS real time clock with NEO-6M module
 これは、Arduinoを使ったLCD表示ですが、私の方は、ESP-WROOM-32Dを使ったLED-Matrix Panel表示にしました。
以下にその概要を記します。



  完成動画


 GPSモジュールからデータを受信して、時間・日付・曜日を表示しています。






  使用した部品


1.ESP-WROOM-32D



2.LED-Matrix Panel
写真は、P4RGB-Matrix-Panel 64x32の表裏です。

表面

裏面



3.GPSモジュール
 GY-GPS 6M V2です。


4.電源
5V 2Aの電源を使用しました。

参考:P4Matrix-Panel 64x32とドライバーPxMatrixの扱いは、本ホームページの LED-MatrixPanel(1) を参照してください。




  配線図


1.配線図です。(画像をコピーしてペイント等で拡大表示してください。)



※ESP-WROOM-32DとLED-Matrix Panelの配線の詳細は、本ホームページの LED-MatrixPanel(1) を参照してください。




  Arduino IDEでのESP-WROOM-32Dの設定


Arduino IDEでのボード設定の詳細は、省略します。
本ホームページの LED-MatrixPanel(1) を参照してください。




  スケッチ


1.参考として以下に、スケッチプログラム「GPS_Clock_ESP32.ino」を掲載しておきます。

//GPS_Clock_ESP32
#include <PxMatrix.h>
#include <TinyGPS++.h>
#include <TimeLib.h> 

#define GPS_BAUDRATE 9600
TinyGPSPlus gps;
#define time_offset   32400

#define P_LAT 22
#define P_A 19
#define P_B 23
#define P_C 18
#define P_D 5
#define P_OE 2

hw_timer_t * timer = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;

PxMATRIX display(64,32,P_LAT, P_OE,P_A,P_B,P_C,P_D);

char Time[]  = "00:00:00";
char Date[]  = "2000/00/00";
byte last_second, Second, Minute, Hour, Day, Month;
int Year;

void IRAM_ATTR display_updater(){
  portENTER_CRITICAL_ISR(&timerMux);
  display.display(70);
  portEXIT_CRITICAL_ISR(&timerMux);
}

void setup() {
  Serial.begin(9600);
  Serial2.begin(GPS_BAUDRATE);
  display.begin(16);
  
  timer = timerBegin(0, 80, true);
  timerAttachInterrupt(timer, &display_updater, true);
  timerAlarmWrite(timer, 2000, true);
  timerAlarmEnable(timer);
  
  delay(1000);
}

void loop() 
{
  if (Serial2.available() > 0)
  {
    if (gps.encode(Serial2.read()))
    {
      // get time from GPS
      if (gps.time.isValid())
      {
        Minute = gps.time.minute();
        Second = gps.time.second();
        Hour   = gps.time.hour();
      }
      
      if (gps.date.isValid())
      {
        Day   = gps.date.day();
        Month = gps.date.month();
        Year  = gps.date.year();
      }
      
      if(last_second != gps.time.second())
      {
        last_second = gps.time.second();
        setTime(Hour, Minute, Second, Day, Month, Year);
        adjustTime(time_offset);
      	        
        Time[6] = second() / 10 + '0';
        Time[7] = second() % 10 + '0';
        Time[3]  = minute() / 10 + '0';
        Time[4] = minute() % 10 + '0';
        Time[0]  = hour()   / 10 + '0';
        Time[1]  = hour()   % 10 + '0';
      	        
        Date[2] = (year()  / 10) % 10 + '0';
        Date[3] =  year()  % 10 + '0';
        Date[5]  =  month() / 10 + '0';
        Date[6] =  month() % 10 + '0';
        Date[8]  =  day()   / 10 + '0';
        Date[9]  =  day()   % 10 + '0';
        
        display.clearDisplay();
        display.setTextSize(1);
        display.setTextColor(display.color565(0, 255, 255));
        display.setCursor(8,2);
        display.println(Time);
  
        display.setTextColor(display.color565(0,0,255));
        display.setCursor(2,14);
        display.print(Date);

        display.setCursor(32,25);
        switch(weekday())
        {
          case 1:  display.print("(SUN)");   break;
          case 2:  display.print("(MON)");   break;
          case 3:  display.print("(TUE)");   break;
          case 4:  display.print("(WED)");   break;
          case 5:  display.print("(THU)");   break;
          case 6:  display.print("(FRI)");   break;
          default: display.print("(SAT)");
        }
        delay(10);
      }
    }
  }
  if (millis() > 5000 && gps.charsProcessed() < 10)
  {
    display.setTextColor(display.color565(255,255,0));
    display.setCursor(2,2);
    display.print("No GPSdata");
    display.setCursor(6,12);
    display.print("  received");
  }
    
}