aboutsummaryrefslogtreecommitdiff
path: root/datalog.h
blob: 029ec6168f01a89b367fe12d84017d7147abeb88 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#pragma once
 
#include <SD.h>
#include <FS.h>
 
#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");
    }
  }
};