Arduinoでエアコンの1時間タイマーを自作する

[ちょっと改良]ArduinoでGPSロガーを自作する「タイムスタンプ対応版」

この記事は別ブログ(2021/04/21投稿)から移行したものです。 

前回はタイムスタンプに対応し少々長めのログを取ってみましたが、受信したセンテンスの一部が不良になったりと動作が不安定だったので少し改良をしてみました。

今回は改良した部分のみ記述します。
プログラム全体は前回の投稿にありますので。


改良したのはメインルーチンの一部です。

void loop() {
  newData = false;
  while (mySerial.available()) {
    GGA = mySerial.readStringUntil('\n');//改行まで読み込む
    RMC = mySerial.readStringUntil('\n');//同上
    newData = true;
  }

  if (GGA != "" && newData == true) {
    if (RMC.indexOf("V") == -1 && RMC.indexOf("A") != -1 && GGA.indexOf("GPRMC") == -1 && GGA.indexOf("GPGGA") != -1 && RMC.indexOf("GPGGA") == -1 && RMC.indexOf("GPRMC") != -1) {
      logFile = SD.open(fileName, FILE_WRITE);
      logFile.print(GGA.c_str());//String型はそのままでは書き込めないので".c_str()"でchar型に変換して書き込む
      logFile.print(RMC.c_str());
      logFile.close();//書き込み後は必ず閉じる
      newData = false;
    }
    else {
      newData = false;
      Clear_Buf(); //受信に失敗した場合バッファをクリア
    }
  }
}

前回までのプログラムだと、受信したセンテンスが正常かどうかの判定に”GPRMC”センテンスにVが無ければ全てOKとしていました。

しかしそれだけだとGPSモジュールが送信した無駄なデータ(GPSの設定情報とか)まで書き込んだり、欠けているデータをそのまま書き込んだりしてしまう。

ということで少々条件を厳しくすることにしました(プログラム10行目)
そしてこの条件が通らなかった場合はelse文にあるバッファクリア関数でバッファをクリアするようにしました。

本来はチェックサムが一緒に送られてきているのでそれを利用すれば完璧ですが、ちょっと分からないこと(XOR)があるのでそれはまた今度にします。