目的:ESP32を使ってセンサー値をSDカードに保存したい
問題:データの取得およびSDカードへ保存はできるが、SDカードに一定以上のデータが保存されなくなってしまう(例:5時間起動しても、2時間分のデータしか保存されない等)
上記の問題は「一つのファイルに保存する上限容量が決まっている」ということなのでしょうか?
一つのファイルに一定以上の容量が溜まったら新しいファイルを作成するなどで対応できるでしょうか?
一般的な対策があれば教えていただきたいと思います。
8月8日追記
多くの方からご意見を頂きましてありがとうございます。
情報不足との指摘をいただき、追記をさせていただきます。
また前回質問した問題点を「問題1」とし、「問題2」を新たに追加しました。
文末にプログラムを記載します。
使用部材
・ESP32-DevKitC http://akizukidenshi.com/catalog/g/gM-11819/
・BME280 http://akizukidenshi.com/catalog/g/gK-09421/
・MicroSDcard Adapter https://www.amazon.co.jp/HiLetgo-3%E5%80%8B%E3%82%BB%E3%83%83%E3%83%88-TF%E3%82%AB%E3%83%BC%E3%83%89%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%B7%E3%83%BC%E3%83%AB%E3%83%89%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB-Arduino%E3%81%AB%E5%AF%BE%E5%BF%9C-SPI%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%ADSD%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF/dp/B010GXAFFU
・MicroSDcard 4GB https://www.amazon.co.jp/ADATA-microSDHC%E3%82%AB%E3%83%BC%E3%83%89-4GB-Class4-AUSDH4GCL4-RA1/dp/B002XVX6LY
目的
1秒ごとにBME280で温度湿度気圧を取得し、NTPで取得した時刻と取得データをSDカードへCSVファイルとして保存したい。
問題1
2時間起動したが、1時間半分のデータしか保存されていない(14:55から17:00まで起動したが、14:55から16:32までしか保存されていない。また最後のみ17:00のレコードが保存されている)。なおCSVファイルは65kBであった。
問題2
1秒間隔でデータを取得しているので理屈の上では1分間に60レコードであるはず(プログラム起動のため実際にはその限りではないはずであるが)。
しかし14:56は55レコードであるが、16:31では8レコードであった。
期待する解決
・起動中は常にデータを保存したい
・時間経過によるレコード数の低下を防ぎたい
以上です。
可能な限り情報を追加したつもりですが、不足があった場合ご教示頂けますと幸いです。
よろしくお願いします。
以下プログラム
#include "secrets.h" #include <WiFi.h> #include <Wire.h> #include "SparkFunBME280.h" #include <SD.h> #include <SPI.h> #define FILE_NAME "/log.csv" //SPI_setting #define SCK 5 #define MISO 16 #define MOSI 17 #define SS 18 //データ取得間隔 int delay_time = 1000 * 1; //1秒間隔 //SD_setting const uint8_t SD_CS = SS; // GPIO5=CS static File myFile; //WIFI_setting char ssid[] = SECRET_SSID; // your network SSID (name) char pass[] = SECRET_PASS; // your network password int keyIndex = 0; // your network key Index number (needed only for WEP) WiFiClient client; // BME280_setting BME280 mySensorA; //Uses default I2C address 0x77 BME280 mySensorB; //Uses I2C address 0x76 (jumper closed) float Temp; float Hum; float hPa; //SD void SD_init() { Serial.print("Initializing SD card..."); if (!SD.begin(SD_CS)) { Serial.println("initialization failed!"); return; } Serial.println("initialization done."); } //SD_read String SD_read() { String str; File file = SD.open(FILE_NAME, FILE_READ); if (file) { //---1byteずつ読み込んだ文字を結合 while (file.available()) { str += char(file.read()); } } else { Serial.println(" error..."); } //---ファイルを閉じる file.close(); return str; } void setup() { delay(1000); SPI.begin(SCK, MISO, MOSI, SS); Serial.begin(115200); //Initialize serial //NTP_setup if (WiFi.begin(SECRET_SSID, SECRET_PASS) != WL_DISCONNECTED) { ESP.restart(); } while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("wifi_disconnected..."); } configTime(9 * 3600L, 0, "ntp.nict.jp", "time.google.com", "ntp.jst.mfeed.ad.jp"); //wifi_setup Wire.begin(); WiFi.mode(WIFI_STA); while (!Serial); Serial.println(); //SD_setup SD_init(); Serial.println(SD_read()); //BME280_setup mySensorA.setI2CAddress(0x76); //The default for the SparkFun Environmental Combo board is 0x77 (jumper open). if (mySensorA.beginI2C() == false) Serial.println("Sensor A connect failed"); mySensorB.setI2CAddress(0x76); //Connect to a second sensor if (mySensorB.beginI2C() == false) Serial.println("Sensor B connect failed"); } struct tm timeInfo;//時刻を格納するオブジェクト char s[20];//文字格納用 void loop() { //BME280 Temp = mySensorA.readTempC(); Hum = mySensorA.readFloatHumidity(); hPa = mySensorA.readFloatPressure() / 100; //NTP getLocalTime(&timeInfo);//tmオブジェクトのtimeInfoに現在時刻を入れ込む sprintf(s, "%04d/%02d/%02d %02d:%02d:%02d", timeInfo.tm_year + 1900, timeInfo.tm_mon + 1, timeInfo.tm_mday, timeInfo.tm_hour, timeInfo.tm_min, timeInfo.tm_sec);//人間が読める形式に変換 //Serial.print Serial.println(s); Serial.print("Temp: "); Serial.print(Temp); Serial.println(" ℃"); Serial.print("Hum: "); Serial.print(Hum); Serial.println(" %"); Serial.print("Press: "); Serial.print(hPa); Serial.println(" hPa"); //SD_writting String backLog = SD_read(); myFile = SD.open(FILE_NAME, FILE_WRITE); if (myFile) { Serial.print("Writing to "); Serial.println(FILE_NAME); myFile.print(backLog); myFile.print(s); myFile.print(","); myFile.print(Temp); myFile.print(","); myFile.print(Hum); myFile.print(","); myFile.print(hPa); myFile.println(); myFile.close(); Serial.println("done."); } else { Serial.print("error opening "); Serial.println(FILE_NAME); } delay(delay_time); // Wait time }
回答1件
あなたの回答
tips
プレビュー