#pragma once #include #include #include "data.h" /* most of this comes from https://github.com/Xinyuan-LilyGO/LilyGo-T5-Epaper-Series/blob/master/examples/GxEPD_SD_1.02_Example/SD_Example.ino */ class DataLog { private: SPIClass SDSPI; File logfile; char line[100]; uint8_t linesSinceLastFlush; uint8_t flushThreshold; public: DataLog(uint8_t ft=4) : SDSPI(VSPI), flushThreshold(ft) {} void start() { SDSPI.begin(SDCARD_SCLK, SDCARD_MISO, SDCARD_MOSI); bool sdok=SD.begin(SDCARD_CS, SDSPI); Serial.print("sdok: ");Serial.println(sdok); Serial.println(SD.cardSize()); logfile = SD.open("air-quality.csv",FILE_APPEND,true); Serial.print("file: ");Serial.println(logfile.path()); linesSinceLastFlush=0; } void show(const SensorData *data) { sprintf( line, //milli co2 temp humid pm1 pm2.5 pm4 pm10 battery "% 5lu, % 5u, % 5.1f, % 5.1f, % 6.1f, % 6.1f, % 6.1f, % 6.1f, % 5.2f\n", millis()/1000, data->co2, data->temperature, data->humidity, data->pm.mc_1p0, max(0.0f,data->pm.mc_2p5 - data->pm.mc_1p0), max(0.0f,data->pm.mc_4p0 - data->pm.mc_2p5), max(0.0f,data->pm.mc_10p0 - data->pm.mc_4p0), data->batteryVoltage ); size_t written=logfile.write((uint8_t *)line,65); Serial.write(line); Serial.print("written: ");Serial.println(written); if (++linesSinceLastFlush > flushThreshold) { logfile.flush(); linesSinceLastFlush=0; Serial.println("flushed"); } } };