가스 센서 MQ-135를 사용한 CO2 농도 측정(M5 StickC Plus 편)

요즘은 텔레파시 작업을 할 때 두뇌가 팽팽해지는 것을 자주 느낀다.
겨울이 되면 방이 자주 꺼지는데 실내의 CO2 농도를 측정하기 위해 CO2 센서를 찾다가 아테네도에서 MQ-135에 탑재된 모듈 기판이 199엔에 판매되는 것을 발견하고 구매한 뒤 수중에 있는 M5 StickC Plus와 조립하여 가동했다.
ESP 32학과에 활동할 정보가 많지 않기 때문에 향후 발전을 위해서도 잘 정리할 계획이다.
# 가스 센서 MQ-135
### 사용 모듈
센서 모듈은 aitendo에서 특가 상품(수량 한정, 2021년 2월까지) 199엔(세금 제외) 판매 MQ135P2 1개를 사용했다.
https://www.aitendo.com/product/19187

##MQ-135 데이터 시트
aitendo 제품 페이지의 데이터 테이블 링크가 끊겼지만 같은 센서를 사용하는 다른 상품에서 데이터 테이블을 얻을 수 있습니다.
http://aitendo3.sakura.ne.jp/aitendo_data/product_img/sensor/MQ-135/MQ-135_e.pdf
Specification에 따르면 전원 전압은 5V로, 내부의 히터를 통해 가열한 뒤 검출된 가스 농도에 따라 저항치 Rs(Sensing Resistance)가 달라져 검출된다.

데이터 테이블에도 각종 기체에 대한 민감도 특성 곡선이 있다.기체 농도는 기준 농도인 저항치(Ro)와 측정치(Rs)의 비율을 기준으로 계산할 수 있다.

또한 제조업체로 알려진 중국**정저우위성전자과학기술유한공사(Zhengzhou Winsen Electronics Technology Co., Ltd.)의 홈페이지에서 상세한 데이터표를 얻을 수 있다.그러나 CO2 커브는 기록되지 않습니다.
https://www.winsen-sensor.com/d/files/PDF/Semiconductor%20Gas%20Sensor/MQ135%20(Ver1.4)%20-%20Manual.pdf
###MQ135P2 모듈의 회로 다이어그램
실제 모듈을 확인한 후,aitendo 제품 페이지에 기재된 회로도가 틀린 것을 발견하여 회로도를 다시 제작하였다.

기체 농도에 따라 MQ-135의 내부 저항치와 RL로 분할된 전압은 AO로 출력된다.이산화탄소 농도 측정은 이걸 사용해.
OPMP(LM393)는 비교기로 사용하는데 AO의 전압이 가변 저항인 RP가 설정한 전압을 초과하면 출력이 H→L로 변하기 때문에 기준농도를 초과했는지 판단하는 데만 사용된다.
또한 구매한 모듈 중 MQ-135의 부하저항 R2(데이터표의 RL)는 1kΩ이며, 상기 민감도 특성의 측정조건(RL=20kΩ) 및 후술고의 조건에 따라 22kΩ로 교체한다.(실제 측정은 RL=1kΩ이지만 신호 레벨이 작아 값을 정상적으로 사용할 수 없으니 개조를 권장한다.)

#M5와 StickC Plus 연결
MQ135P2와 M5 StickC Plus의 연결은 다음과 같습니다.
MQ132P2
M5StickC Plus
VCC
5V
GND
GND
DO
NC
AO
G36
AO는 아날로그 출력이므로 M5 StickC Plus의 상부 잭에 연결된 [G36/G25]를 XG36(ESP 32의 ADC1 CH0)**로 가져옵니다.
ESP32의 입력은 3.3V Trant이며, AO는 저항 분할 출력에서 실제 출력 전압 범위로서 문제가 없기 때문에 직접 사용한다.
DO 단자와 OPMP의 출력 연결은 보통 H(약 5V)이기 때문에 NC(연결되지 않음)이다.

#아두노의 스케치
이번에 제작된 스케치는github에 공개됐다.
https://github.com/tomorrow56/M5Stack_CO2Monitor
###사용된 라이브러리
Georg Krocker가 공개한 Arduino library for the MQ 135를 사용했다.
https://github.com/GeorgK/MQ135
M5 StickC Plus(ESP32)의 ADC 입력 범위(3.3V/12비트)와 MQ-135의 개인 편차를 수정하기 위해서는 라이브러리 자체를 수정해야 하기 때문에 초도와 같은 폴더에 놓아 사용한다.
##ADC 입력 범위 지원(3.3V/12비트)
원래 프로그램 라이브러리는 5V/10비트의 ADC로 가정하기 때문에 3.3V/12비트에 따라 ADC 입력 값을 사용하는 **getResistance()* 함수를 수정합니다.
###ADC 데이터에서 센서 저항값 계산 공식 가져오기
Vout  =3.3*(readVal/4095)
Iload =Vout/RLOAD
Rsense=(5-Vout)/Iload
      =(5-Vout)/(Vout/RLOAD)
      =(5/Vout-1)*RLOAD
      =(5/(3.3*(readVal/4095))-1)*RLOAD
      =((4095/readVal)*(5/3.3)-1)*RLOAD
이 계산과 결합하여 MQ 135.cpp의 **getResistance()는 다음과 같이 ** 함수를 수정합니다.
MQ135.cpp
/**************************************************************************/
/*!
@brief  Get the resistance of the sensor, ie. the measurement value

@return The sensor resistance in kOhm
*/
/**************************************************************************/
float MQ135::getResistance() {
  int val = analogRead(_pin);
  //return ((1023./(float)val) * 5. - 1.)*RLOAD;
  return ((4095./(float)val) * (5. / 3.3) - 1.)*RLOAD;
}
##MQ-135의 개인 편차 수정
사용된 환경의 CO2 농도와 센서의 저항을 MQ135로 측정합니다.h의 매개 변수를 수정합니다.
최초로 충분히 통풍된 환경Rzero 측정용 스케치에서 센서의 저항치를 얻어 기록한다.
M5StickCPlus_MQ135_Rzero.ino
#include <M5StickCPlus.h>
#include "MQ135.h"

// MQ135 Pin config
#define AO_IN        36
#define DO_IN        26

MQ135 gasSensor = MQ135(AO_IN); // Attach sensor to pin AO_IN

void setup (){
  // void begin(bool LCDEnable=true, bool PowerEnable=true, bool SerialEnable=true);
  M5.begin();
  // Wire.begin(32,33);
  M5.Lcd.setRotation(3);

  // SET INPUT PINS
  pinMode(AO_IN, INPUT);
  pinMode(DO_IN, INPUT);
}
void loop() {
  float rzero = gasSensor.getRZero();
  Serial.println (rzero);
  M5.Lcd.fillScreen(TFT_BLACK);
  M5.Lcd.setTextColor(GREEN);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.print("RZERO: ");
  M5.Lcd.println(rzero);

  delay(1000);
}
또 CO2 농도계가 있다면 그때의 CO2 농도도 기록해야 한다.
내 환경에서 센서의 저항 실측치는 126.17kΩ이고 CO2 농도에는 CO2 농도계가 없기 때문에 참고기상청의 이산화탄소 농도의 월평균치를 420ppm로 측정한다.
위에서 측정한 값은 각각 MQ135이다.h의 RZERO, ATMOCO2에 반영됩니다.RLOAD는 MQ-135의 부하 저항에 따라 22kΩ로 수정됩니다.
MQ135.h
/// The load resistance on the board
//#define RLOAD 10.0
#define RLOAD 22.0
/// Calibration resistance at atmospheric CO2 level
//#define RZERO 76.63
#define RZERO 126.17
/// Parameters for calculating ppm of CO2 from sensor resistance
#define PARA 116.6020682
#define PARB 2.769034857

/// Parameters to model temperature and humidity dependence
#define CORA 0.00035
#define CORB 0.02718
#define CORC 1.39538
#define CORD 0.0018

/// Atmospheric CO2 level for calibration purposes
//#define ATMOCO2 397.13
#define ATMOCO2 420
##CO2 농도 측정
프로그램 라이브러리를 수정하여 만들었습니다CO2 농도 측정용 스케치.다음은 스케치 측정 부분의 발췌문이다.
1초마다 CO2 농도를 측정하고 5분ambient마다 데이터를 보내 도표화한다.방의 환경을 쉽게 이해하기 위해 측정값에 따라 데이터의 문자 색깔을 바꾼다.
M5StickCPlus_MQ135_CO2.ino
#include <M5StickCPlus.h>
#include "MQ135.h"
〜省略〜
uint32_t interval = 1000;
uint32_t interval_ambient = 1000 * 60 * 5;

// MQ135 Pin config
#define AO_IN        36
float ppm = 0;

MQ135 gasSensor = MQ135(AO_IN);

void setup(void) {
  〜省略〜
  // SET INPUT PINS
  pinMode(AO_IN, INPUT);
  〜省略〜
  //1回目のデータは空読みして捨てる
  ppm = gasSensor.getPPM();
  delay(1000);
}

void loop() {
  〜省略〜
  if(millis() > update_time){
    update_time = millis() + interval;

    ppm = gasSensor.getPPM();
    Serial.print ("ppm: ");
    Serial.println (ppm);

    if(ppm <= 1000){
      M5.Lcd.setTextColor(GREEN);
    }else if(ppm <= 1500){
      M5.Lcd.setTextColor(YELLOW);
    }else{
      M5.Lcd.setTextColor(RED);
    }
    printData(ppm);
  }

  if(millis() > update_time_ambient){
    update_time_ambient = millis() + interval_ambient;
    // 二酸化炭素濃度をAmbientに送信する
    ambient.set(1, String(ppm).c_str());
    ambient.send();
 
    Serial.printf("ambient: %.2f\r\n", ppm);
  }
}
이 스케치법으로 자신의 작업 공간의 CO2 농도를 측정한 결과는 다음과 같다.CO2 농도는 상당히 높지만 그에 상응하는 숫자를 측정할 수 있다.

ambient에서 CO2 농도의 변화가 도표에 표시되는 것을 확인했습니다.

### 콜드 부팅 시 예외 데이터 정보
MQ-135는 내장 히터가 충분히 가열되기 전 기간(대략적인 목표는 1분 이상)에 이상 데이터(매우 큰 값)를 출력한다.
실제 사용 시 최초 몇 초 측정에서 일정치 이상의 데이터(목표는 3천ppm 정도)가 나왔다면 1분 정도의 노화 시간을 추가로 처리하는 것이 좋다.(현재 샘플 프로그램에 노화 처리가 포함되지 않음)
# 요약
199엔에 구매한 센서 모듈로 CO2 농도의 변화를 측정할 수 있다.절대치의 측정 정밀도는 기대할 수 없지만, 자기 집의 전기 전송 작업 환경에서 환기 목표를 곧 사용할 수 있을 것이다.
#참고문헌·사이트
MQ135 Arduino Library(github)
Measuring CO2 Concentration in Air using Arduino and MQ-135 Sensor

좋은 웹페이지 즐겨찾기