aboutsummaryrefslogtreecommitdiff
path: root/pm.h
blob: 634c1b47c1ed81bbd75bbed0fe2fa1137dff2f6e (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
61
62
63
#pragma once
 
#include <sps30.h>
 
#include "data.h"
 
class PM {
private:
  uint8_t auto_clean_days;
public:
  PM(uint8_t acd=4) :auto_clean_days(acd) {}
 
  void start() {
    // this will try to re-init Wire, emit a warning, and carry on 
    sensirion_i2c_init();
 
    while (sps30_probe() != 0{
      Serial.print("PM sensor probing failed\n");
      delay(500);
    }
 
    int16_t ret;
 
    ret = sps30_set_fan_auto_cleaning_interval_days(auto_clean_days);
    if (ret) {
      Serial.print("PM setting the auto-clean interval error: ");
      Serial.println(ret);
    }
 
    ret = sps30_start_measurement();
    if (ret < 0{
      Serial.print("PM starting measurement error\n");
    }
  }
 
  bool dataReady() {
    uint16_t data_ready;
    int16_t ret;
 
    ret = sps30_read_data_ready(&data_ready);
    if (ret < 0{
      Serial.print("PM reading data-ready flag error: ");
      Serial.println(ret);
      return false;
    } else if (!data_ready) {
      return false;
    }
 
    return true;
  }
 
  void read(SensorData *data) {
    char serial[SPS30_MAX_SERIAL_LEN];
    int16_t ret;
 
    ret = sps30_read_measurement(&(data->pm));
 
    if (ret <0{
      Serial.print("PM reading measurement error: ");
      Serial.println(ret);
    }
  }
};