スケッチを改良しました。
/*
GPS radio clock 2.02
2014/07/07 daikunomokichi
*/
#include <Wire.h>
#include <wI2cLcdACM1602.h>
wI2cLcdACM1602 lcd;
int dHour = 0; //JST「時」
int dHour0 = 0;
int dHour1 = 0;
int dHour2 = 0;
int dMin = 0; //内部「分」
int dMin0 = 0;
int dMin1 = 0;
int dSec = 0; //内部「秒」
int dSec0 = 0;
int dSec1 = 0;
int dSec2 = 0;
int dSec3 = 0;
int dIntpin = 2; //割込D2
char buf[256];
int count = 0;
char* gpsTime; //個別データ用の文字列用ポインタ
char* gpsCnt; //個別データ用の文字列用ポインタ
char dRun = 0; //補足完了
void setup()
{
Serial.begin(9600);
Serial.println("$PMTK220,500*2B"); //データ更新レート 2Hz
Wire.begin(); //I2C初期化
lcd.begin(); //LCD初期化
lcd.clear(); //全クリア
lcd.noBlink(); //カーソル点滅なし
lcd.noCursor(); //カーソル表示なし
lcd.setCursor(0, 0);
lcd.print("Preliminary GPS"); //最初のメッセージ表示
lcd.setCursor(0, 1);
lcd.print("2.02 by mokichi"); //最初のメッセージ表示
pinMode(dIntpin, INPUT);
attachInterrupt(0, yCnt, RISING);
//attachInterrupt(0,yCnt, FALLING); //HIGHからLOW
delay(1000);
lcd.clear();
}
void loop()
{
count = 0;
do {
if (Serial.available()) {
buf[count] = Serial.read();
count++;
}
if (count > 250) {
break;
}
} while (buf[count - 1] != 0x0A);
buf[count] = '\0';
if (0 == strncmp("$GPGGA", buf, 6)) {
strtok(buf, ",");
gpsTime = strtok(NULL, ","); //m1>UTC時刻の抽出
strtok(NULL, ","); //m2
strtok(NULL, ","); //c1
strtok(NULL, ","); //m3
strtok(NULL, ","); //c2
strtok(NULL, ","); //d1
gpsCnt = strtok(NULL, ","); //d2>測位に使用した人工衛星の個数
lcd.setCursor(14, 1);
lcd.print(gpsCnt);
lcd.print(" ");
dMin0 = gpsTime[2];
dMin1 = gpsTime[3];
dMin = ((dMin0 - 48) * 10) + dMin1 - 48;
dSec0 = gpsTime[4];
dSec1 = gpsTime[5];
dSec2 = ((dSec0 - 48) * 10) + dSec1 - 48;
dHour0 = gpsTime[0];
dHour1 = gpsTime[1];
dHour2 = ((dHour0 - 48) * 10) + dHour1 - 39;
switch (dHour2) {
case 24:
case 25:
case 26:
case 27:
case 28:
case 29:
case 30:
case 31:
case 32:
dHour = dHour2 - 24;
break;
default:
dHour = dHour2;
break;
}
}
dSec3 = dSec - dSec2;
switch (dSec3) {
case -1:
dRun = -1;
break;
case 0:
dRun = -1;
break;
case 1:
dRun = -1;
break;
default:
dRun = 0;
break;
}
if (dRun != 0) {
lcd.setCursor(0, 0);
lcd.print("GPS radio clock");
} else {
lcd.setCursor(0, 0);
lcd.print("Preliminary ");
lcd.print(dSec3) ;
lcd.print(" ");
}
lcd.setCursor(6, 1);
lcd.print(dSec / 10);
lcd.print(dSec % 10);
lcd.setCursor(0, 1);
lcd.print(dHour / 10);
lcd.print(dHour % 10);
lcd.print(":");
lcd.print(dMin / 10);
lcd.print(dMin % 10);
lcd.print(":");
lcd.setCursor(8, 1);
lcd.print("(JST)");
lcd.print(char(222));
}
void yCnt()
{
dSec++;
if (dSec > 59) {
dSec = 0;
}
if (59 == dSec2) {
dRun = -1;
dSec = 0;
}
}