ArduinoUNOとCO2センサーモジュールMH-Z19CでCO2測定


x 配線には、自信がないので各自、仕様書を確認の事

目的
今、コロナで流行りのCO2測定器
非営利、教育、研究目的

説明
771_8bitさんのプログラムを非営利目的でArduinoUNOに移植
あくまで参照

変更点
ハードシリアルからソフトウェアシリアル
A6 -> 6
A7 -> 7

参考

秋月で買えるCO2センサーを使う(MH-Z19C)



//caa45040が追加 始まり
#include <SoftwareSerial.h>
SoftwareSerial mySerial(3, 2); // RX, TX
//caa45040が追加 終わり

uint16_t uartco2; 
unsigned long pwmco2;
bool reset = false;

byte ReadCO2[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};
byte SelfCalOn[9]  = {0xFF, 0x01, 0x79, 0xA0, 0x00, 0x00, 0x00, 0x00, 0xE6};
byte SelfCalOff[9] = {0xFF, 0x01, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86};
byte retval[9];

void setup() {
  pinMode(7 /*変更*/, INPUT);
  pinMode(6 /*変更*/, OUTPUT);
  Serial.begin(9600);
  Serial.print("400ppm");
  Serial.print(",");
  Serial.print("UART");
  Serial.print(",");
  Serial.println("PWM");
  delay(2000);
  mySerial.begin(9600);
  mySerial.write(SelfCalOn,sizeof SelfCalOn);
}


void loop() {
  //PWMでデータ取得
  pwmco2=pulseIn(7 /*変更*/,HIGH,2000000);

  //UARTでデータ取得
  mySerial.write(ReadCO2,sizeof ReadCO2);
  mySerial.readBytes((char *)retval, sizeof retval);
  uartco2 = retval[2]*256 + retval[3];

  //PCに送信
  Serial.print(2*(202000-2000)/1000);
  Serial.print(",");
  Serial.print(uartco2);
  Serial.print(",");   
  Serial.println(5*(pwmco2-1200)/1000);

  delay(100);

  //起動20分後手動キャリブレーション
  if(millis()>1200000 && !reset){
    digitalWrite(6 /*変更*/,LOW);
    delay(8000);
    digitalWrite(6 /*変更*/,HIGH);
    reset=true;
  }

}