// なぜかGPSのデータが取得できないスケッチ
// 1ppsの信号が取れてない?
// スケッチ5
#include <M5Stack.h>
#include <TimeLib.h>
#include <TinyGPSPlus.h>
static const uint32_t GPSBaud = 115200;
TinyGPSPlus gps;
HardwareSerial ss(2);
#define LGFX_M5STACK
#include <LovyanGFX.hpp>
static LGFX lcd;
static LGFX_Sprite sprite(&lcd);
const int offset = 9;
int now_year, now_mon, now_day, now_hour, now_minute, now_second;
static const char *wday[] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
const char *now_weekday;
boolean ap_view = true;
unsigned long clock_start_time;
int preview_second = 0;
boolean colon_view = true;
void setup(void) {
M5.begin();
delay(1000);
ss.begin(GPSBaud);
pinMode(35, INPUT); // 1ppsの入力
pinMode(2, OUTPUT); // 1ppsの確認用のLED
dacWrite(25, 0); // スピーカーは使わないからオフにする
lcd.init();
lcd.setBrightness(4);
delay(1000);
sprite.setColorDepth(16);
}
void loop() {
while(digitalRead(35) == LOW) { // LOWの間は待つ (=HIGHになったら通過)
}
while (ss.available()) {
if (gps.encode(ss.read())) {
if (gps.date.age() < 500) {
setTime((gps.time.hour()), (gps.time.minute()), (gps.time.second()), (gps.date.day()), (gps.date.month()), (gps.date.year()));
adjustTime(offset * SECS_PER_HOUR);
// adjustTime(offset * SECS_PER_HOUR + 1); // なぜか1秒遅れてるから+1足した
}
}
}
now_year = year();
now_mon = month();
now_day = day();
now_hour = hour();
now_minute = minute();
now_second = second();
now_weekday = wday[weekday() - 1];
// 時刻とコロンの表示
if (now_second != preview_second && colon_view == true) {
clock_start_time = millis();
sprite.createSprite(320, 98);
sprite.clear(TFT_BLACK);
sprite.setFont(&fonts::Font7);
sprite.setTextDatum(top_left);
char clock_hh_mm[6];
// 12-24時間表記の切り替え
if (ap_view == true) { // 12時間表記
now_hour = hourFormat12();
sprite.setFont(&fonts::Font0);
sprite.setTextSize(2.5);
sprite.setTextColor(TFT_WHITE);
sprite.setTextDatum(top_left);
if (isPM()) { // 午後
sprite.drawString("PM", 3, 12); // PM
}
if (isAM()) { // 午前
sprite.drawString("AM", 3, 12); // AM
}
sprite.setFont(&fonts::Font7);
sprite.setTextColor(TFT_WHITE);
sprite.setTextDatum(top_left);
sprite.setTextSize(1.9);
if (now_hour == 12) {
now_hour = 0;
}
if (now_hour < 10) {
sprintf(clock_hh_mm, "%01d:%02d", now_hour, now_minute);
sprite.drawString(String(clock_hh_mm), 63, 6); // 時:分
} else {
sprintf(clock_hh_mm, "%02d:%02d", now_hour, now_minute);
sprite.drawString(String(clock_hh_mm), 3, 6); // 時:分
}
} else { // 24時間表記
sprintf(clock_hh_mm, "%02d:%02d", now_hour, now_minute);
sprite.setTextColor(TFT_WHITE);
sprite.setTextSize(1.9);
sprite.drawString(String(clock_hh_mm), 3, 6); // 時:分
}
char clock_ss[3];
sprintf(clock_ss, "%02d", now_second);
sprite.setTextSize(0.8);
sprite.drawString(String(clock_ss), 268, 52); // 秒
sprite.pushSprite(0, 22);
preview_second = now_second;
colon_view = false;
Serial.println(gps.satellites.value()); // GPSの数の確認
delay(1);
}
// コロンを消す (0.5秒後)
if ((millis() >= (clock_start_time + 500)) && colon_view == false) {
sprite.createSprite(15, 90);
sprite.clear(TFT_BLACK);
sprite.pushSprite(123, 30);
colon_view = true;
delay(1);
}
}