この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.次の動画は、パネルとして P4RGB-LED-MatrixPanel64x32(256mmx128mm)を使用しました。
2.次の写真は、パネルとして P3RGB-LED-MatrixPanel64x32(192mmx96mm)を使用し、輝度、表示位置を少し変更しました。
上記P4の場合のプログラムを少し変更しています。

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)
を参照してください。
1.参考として以下に、スケッチプログラム「GPS_Clock_ESP32.ino」を掲載しておきます。
使用しているパネルは、P4RGB-LED-MatrixPanel64x32 です。
//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");
}
}