2014/07/07

GPS redio clock Act.6

スケッチを改良しました。
/*
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;
    }
}

0 件のコメント:

コメントを投稿