728x90
이산화탄소의 농도를 측정할 수 있는 센서
MG811를 사용해 보는 포스팅이다.
이 센서는 30~60초 정도 예열을 통해 센서를 약간 뜨겁게 만들고
이후 화학반응을 통해 CO2의 농도를 AOUT(혹은 Vout)으로 전압으로 출력한다.
센서 뒷편에는 2개의 가변저항으로 신호 증폭도와 TTL 신호 출력 감도를 조정할 수 있다.
아두이노와 MG811의 연결도이다.
/*Hardware Related Macros*/
#define MG_PIN (0) // AOUT 핀
#define BOOL_PIN (9) // DOUT 핀
#define DC_GAIN (8.5)
/*Software Related Macros*/
#define READ_SAMPLE_INTERVAL (50) // 샘플 간격
#define READ_SAMPLE_TIMES (5) // 샘플 갯수
/*Application Related Macros*/
#define ZERO_POINT_VOLTAGE (0.15) // 증폭되기 이전의 전압값
#define REACTION_VOLTGAE (0.020) // 전압하강 수치 1000ppm – 0.13V
/*Globals*/
float CO2Curve[3] = {2.602,ZERO_POINT_VOLTAGE,(REACTION_VOLTGAE/(2.602-3))};
void setup()
{
Serial.begin(9600); // 시리얼 통신속도 설정
pinMode(BOOL_PIN, INPUT);
digitalWrite(BOOL_PIN, HIGH);
Serial.print("MG-811 Demostration\n"); // 데모(시범)
}
void loop()
{
int percentage;
float volts;
volts = MGRead(MG_PIN); // AOUT 핀 값 읽어옴
Serial.print( "SEN-00007:" );
Serial.print(volts); // 센서의 출력전압(증폭 후)
Serial.print( " V / before_amp : " );
Serial.print(volts/DC_GAIN); // 출력전압(증폭 전)
Serial.print( " V " );
percentage = MGGetPercentage(volts,CO2Curve);
Serial.print("CO2:");
if (percentage == -1) {
Serial.print( "<400" );
}
else{
Serial.print(percentage);
}
Serial.print( "ppm\n" );
if (digitalRead(BOOL_PIN) ){
Serial.print( "=====BOOL is HIGH======" );
}
else {
Serial.print( "=====BOOL is LOW======" );
}
Serial.print("\n");
delay(200);
}
float MGRead(int mg_pin) // 센서 출력전압 값
{
int i;
float v=0;
for (i=0;i<READ_SAMPLE_TIMES;i++) {
v += analogRead(mg_pin);
delay(READ_SAMPLE_INTERVAL);
}
v = (v/READ_SAMPLE_TIMES) *5/1024 ;
//샘플의 평균값을 아날로그로 구하기
return v;
}
int MGGetPercentage(float volts, float *pcurve)
// ppm값 계산함수
{
if ((volts/DC_GAIN )>=ZERO_POINT_VOLTAGE) {
return -1;
} else {
return pow(10, ((volts/DC_GAIN)-pcurve[1])/pcurve[2]+pcurve[0]);
}
}
MG811 CO2 센서 테스트 결과
728x90
'IoT > 아두이노' 카테고리의 다른 글
아두이노와 서버 소켓통신 (1) | 2023.05.16 |
---|---|
GP2Y1010AU0F 미세먼지 센서 테스트 (0) | 2023.05.15 |
아두이노 Wifi 모듈 사용하기(온습도 센서) (0) | 2023.02.27 |