#pragma once
#include <SD.h>
#include <FS.h>
#include "data.h"
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,
"% 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;
}
}
};