serin99
serin 개발 일기
serin99
전체 방문자
오늘
어제
  • 분류 전체보기 (76)
    • FE (25)
      • JavaScript (14)
      • React (6)
      • Web (5)
    • IT (22)
      • [FE] 위클리 페이퍼 (19)
      • CS (2)
    • Project (4)
    • Python (8)
    • DB (2)
    • IoT (14)
      • 라즈베리파이 (9)
      • 아두이노 (4)

태그

  • 부트캠프
  • 프로그래밍
  • 자바스크립트
  • 라즈베리파이
  • Python

인기 글

최근 글

최근 댓글

티스토리

hELLO · Designed By 정상우.
serin99

serin 개발 일기

IoT/아두이노

CO2 센서

2023. 3. 2. 23:00
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
    'IoT/아두이노' 카테고리의 다른 글
    • 아두이노와 서버 소켓통신
    • GP2Y1010AU0F 미세먼지 센서 테스트
    • 아두이노 Wifi 모듈 사용하기(온습도 센서)
    serin99
    serin99
    FE 개발자가 되기 위해 공부하는 사람

    티스토리툴바