ESP8266 Arduino で CO2 センサー MH-Z19 を読む
寝室に置いてみたいので 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;
}
}
}
関連エントリー
- Arduino で一定時間ごとに何かをする interval クラス 一定時間で何かをする、といえばタイマーの割込みを使うことでしょうが、タイマーを使いたくないないし使えないということもあると思います。 そうい...
- ESP8266 (ESP-WROOM-02) の Deep Sleep でデータを引き継ぐ ESP8266 の deep sleep モードは CPU などの電源を全て落として、RTC (時刻を持ってるわけではないっぽいけど内蔵RT...
- MH-Z19 という格安 CO2 センサを読んでみた 郑州炜盛电子科技 という会社の MH-Z19 という CO2 センサを買ってみました。Aliexpress で $22 ぐらいでした。 非分...
- JSでシステム時計の変化(時刻変更、NTP同期)を検知する performance.now() が monotonic (単調増加) なことを利用すると、システム時計の変化を比較的高精度に得られるなと...
- ESP8266 から GrowthForecast へセンサーデータをPOST こんな感じで遊べる。 HttpClient (portformio だと id=66) の使いかたで微妙にハマった。 こんな感じの Grow...