#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); SD.begin(SDCARD_CS, SDSPI); logfile = SD.open("air-quality.csv",FILE_APPEND,true); 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 ); logfile.write((uint8_t *)line,65); Serial.write(line); if (++linesSinceLastFlush > flushThreshold) { logfile.flush(); linesSinceLastFlush=0; } } };