Hobby Science&Experiment

愛と工作の日々

趣味でやっている工作や勉強したことのメモ書きです。

CO2センサー(MH-Z19B)をESP32のPWMで使用する

#define pwmPin 22 // Change this to the appropriate pin connected to the MH-Z19 PWM output

int prevVal = LOW;

long th, tl, h, l, ppm;

void setup() {
  Serial.begin(115200);
  pinMode(pwmPin, INPUT);
  Serial.println("MH-Z19 is warming up now.");
}

void loop() {
  int co2value = co2read();
  Serial.println("out:"+String(co2value));
  //delay(1000);

}

int co2read() {
  int maxAttempts = 5000;
  int attempts = 0;

  while (attempts < maxAttempts) {
    long tt = millis();
    int myVal = digitalRead(pwmPin);

    // Measure pulse width
    if (myVal == HIGH) {
      if (myVal != prevVal) {
        h = tt;
        tl = h - l;
        prevVal = myVal;
      }
    } else {
      if (myVal != prevVal) {
        l = tt;
        th = l - h;
        prevVal = myVal;
        ppm = 5000 * (th - 2) / (th + tl - 4);
        //Serial.println("CO2 PPM = " + String(ppm));
        return ppm;
      }
    }
    delay(10);
    attempts++;
  }

  // If maximum attempts reached, return an error code, e.g., -1
  return -1;
}

loop内のdelayを取ると挙動がおかしくなります。