(2021.4.27追記)MHZ19というライブラリを使っていますがMHZ19B用に調整された処理が入っているのでCを使う場合は、MHZ19_uartというライブラリの方が良さそうです。
githubにソースあげておきました。(github)
とり急ぎ、MH-Z19CとM5Stackを直結で動かす。機能は表示のみ。電圧は満たしていないのでソフトがプログラムが動く確認までの目的。電源まわりはきちんと作り直さないと数値は大体。(それでも多分うちのかDM306以外の一万円未満のセンサーよりはよいきがする。これで5/1時点でCO2-miniかうちの以外の1万円未満センサーよりは性能良い)
MH-Z19Cは5Vプラマイ0.1Vを要求して守らないと値が不安定になる。「ゆうても大丈夫だろ」と雑にやるとずれます。
配線は、左がM5Stackで右がMH-Z19Cで以下のようにつなぐ。16,17はプログラムで指定しているので変更可能。
- 5V からVIN
- G から GND
- 16 から TX
- 17 から RX
プログラム。いつもどおりMITライセンスです(ライブラリはLGPL使っているので書き込んだらLGPL)
#include <M5Stack.h>
#include <MHZ19.h>
#define RX 16
#define TX 17
#define INTERVAL 6
MHZ19 myMHZ19;
HardwareSerial mySerial(1);
void setup(){
M5.begin();
M5.Power.begin();
M5.Lcd.setTextSize(5);
M5.Lcd.print("start");
mySerial.begin(9600,SERIAL_8N1,RX,TX);
delay(100);
myMHZ19.begin(mySerial);
myMHZ19.autoCalibration(false);
}
int count = 0;
int co2 = 0;
void loop()
{
if ((count % INTERVAL) == 0 ) {
co2 = myMHZ19.getCO2();
}
displayCo2(co2, (count % 2));
count++;
delay(1000);
}
int count = 0;
int co2 = 0;
void loop()
{
if ((count % INTERVAL) == 0 ) {
co2 = myMHZ19.getCO2();
displayCo2(co2 );
} else {
M5.Lcd.print(".");
}
count++;
delay(1000);
}
void displayCo2(int co2) {
M5.Lcd.clear();
M5.Lcd.setCursor(0, 0);
M5.Lcd.println("CO2 ppm");
M5.Lcd.print(co2);
}