この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"); } }