山行記録のための行動ログを取りたい③ 取得した数値をSDカードに保存

スポンサーリンク
スポンサーリンク

ログを保存

MicroSDにログを保存する。保存したログを後でPCで加工していきたいのである程度形になってるといいなーと思ったが、あまり欲張らずできることをやろう。SDカードは

こちらを購入した。ドンキで。これを

拡張ボードには裏にスロットがあるのでぶっ刺す。

スポンサーリンク

コード

ArduinoにはSDカード用のライブラリがもとからある。

https://www.arduino.cc/reference/en/libraries/sd/

これを使ってまず動作確認。

#include <SPI.h>
#include <SD.h>

const int chipSelect = 2;
File myFile;

void setup() {
  if (!SD.begin(chipSelect)) {
    while (1)
      ;
  }

  myFile = SD.open("test.txt", FILE_WRITE);

  if (myFile) {
    myFile.println("testing 1, 2, 3.");
    myFile.close();
  }
}

void loop() {
}

サンプルを簡略化して流用。

できておりますね。そしたら全部合体させてしまおう。紆余曲折あったが最終的に動いたのが

#include <SoftwareSerial.h>
#include "TinyGPS++.h"
#include <Dps310.h>
#include <SPI.h>
#include <SD.h>

TinyGPSPlus gps;
SoftwareSerial mySerial(7, 6);

Dps310 Dps310PressureSensor = Dps310();

const int chipSelect = 2;
String fileName;
File root;

String dataString;

void setup() {
  Serial.begin(57600);
  while (!Serial) {
    ;
  }

  mySerial.begin(9600);

  Dps310PressureSensor.begin(Wire);

  if (!SD.begin(chipSelect)) {
    while (1)
      ;
  }
  root = SD.open("/");
  checkDupFile(root, 0);

  Serial.println("init finish");
}

void loop() {
  float temperature;
  float pressure;
  uint8_t oversampling = 7;
  int16_t ret;

  while (mySerial.available() > 0) {
    char c = mySerial.read();
    gps.encode(c);
    if (gps.time.isUpdated() || gps.date.isUpdated() || gps.location.isUpdated()) { //if (gps.location.isUpdated() && gps.time.isValid()) {// 
      dataString += gps.date.year();
      dataString += "/";
      dataString += gps.date.month();
      dataString += "/";
      dataString += gps.date.day();
      dataString += ",";

      if (gps.time.hour() < 10) dataString += "0";
      dataString += gps.time.hour();
      dataString += ":";
      if (gps.time.minute() < 10) dataString += "0";
      dataString += gps.time.minute();
      dataString += ":";
      if (gps.time.second() < 10) dataString += "0";
      dataString += gps.time.second();
      dataString += ",";

      dataString += String(gps.location.lat(), 7);
      dataString += ",";
      dataString += String(gps.location.lng(), 7);
      dataString += ",";
      dataString += String(gps.altitude.meters());
      dataString += ",";

      ret = Dps310PressureSensor.measureTempOnce(temperature, oversampling);

      if (ret != 0) {
        Serial.print("FAIL! ret = ");
        Serial.println(ret);
      } else {
        dataString += String(temperature);
      }

      dataString += ",";

      ret = Dps310PressureSensor.measurePressureOnce(pressure, oversampling);
      if (ret != 0) {
        Serial.print("FAIL! ret = ");
        Serial.println(ret);
      } else {
        dataString += String(pressure);
      }

      File dataFile = SD.open(fileName, FILE_WRITE);
      if (dataFile) {
        dataFile.println(dataString.c_str());
        dataFile.close();
      }

      dataString = "";
    }
  }
}

void checkDupFile(File dir, int num) {
  bool existFile = false;
  while (true) {
    File entry = dir.openNextFile();
    if (!entry) {
      if (num == 0) {
        fileName = "LOG0.CSV";
      }
      break;
    }

    num++;
    fileName = "LOG" + String(num) + ".CSV";
  }
}

こう。何故か日付が取れたり取れなかったりする。ということで基本はできた。これを山に持っていって動作確認してみよう!

スポンサーリンク

このコードはPC接続だとログが保存されるが、バッテリー接続だとログが保存されない

なんでか考えてみてくれ。自分のアホさ加減よ。やっぱコピペに頼るとだめだな。

コメント

タイトルとURLをコピーしました