寝室に置いてみたいので ESP8266 (ESP-WROOM-02) で動かして GrowthForecast にポストするようにしてみた。
MH-Z19 を PWM 経由で読んでいる loop 関数だけ抜きだすと以下のような感じ。とりあえず割込みは使ってない。
void loop() {
ArduinoOTA.handle();
static uint32_t prevTime = 0;
static uint8_t lastState = 0;
static uint32_t th;
static uint32_t tl;
int state = digitalRead(PWM_INPUT);
if (lastState == state) {
// nothing to do
} else {
lastState = state;
uint32_t now = millis();
if (!prevTime) {
prevTime = now;
return;
}
uint32_t interval = 0;
if (prevTime <= now) {
interval = now - prevTime;
} else {
interval = 0xffffffff - prevTime + now + 1;
}
prevTime = now;
if (state == 1) {
tl = interval;
if (tl && th) {
uint32_t cycle = tl + th;
if ((uint16_t)(1004 * 0.95) < cycle && cycle < (uint16_t)(1004 + 1.05)) {
uint16_t ppm = 5000.0 * ((float)(th - 2) / (float)(cycle - 4));
Serial.printf("%d ppm (cycle %d / th: %d, tl: %d)\n", ppm, cycle, th, tl);
gf.post("/home/sensor/co2_1", ppm);
// reset count
th = 0; tl = 0;
prevTime = 0;
} else {
// error
Serial.println("error");
}
}
} else
if (state == 0) {
th = interval;
}
}
}