센서값 비교를 통한 값보정 (MH-Z19 & SH-300-DS)

by 조혜인 | 2016-07-05 14:44
mh-z19 sh-300-ds 공기 농도 실내 아두이노 이산화탄소 이산화탄소농도 측정기 환기




실내 이산화탄소 측정기 만들기






1. CO2 센서 MH-Z19


지난 시간 소하테크의 SH-300-DS를 이용해 실내 이산화탄소를 측정해 보았습니다.

하지만 이 센서는 10만원 이상의 고가입니다.

게다가 10000ppm까지 pwm값으로 반환해주기 때문에 일상생활에서 이용하기에 너무나 과잉스펙의 센서라고 볼 수 있습니다.

                                        




그래서 오늘은 MH-Z19를 이용해 보고자 합니다.

이 센서는 해외사이트에서 검색하면 최상위에 뜨는 CO2센서로, 가격은 24달러로 저렴합니다.

또한 pwm으로 2000ppm까지 반환해주기 때문에,  실내 권장 이산화탄소 농도 기준치인 1000ppm을 포함하면서도 훨씬 웃도는 범위로 일상생활에서 이용하기에 좋은 스펙을 가졌습니다.














2. 센서값 비교 & 보정


2-1. ppm값 설정


5V 전압을 주었을 때 나오는 ppm값입니다.


- MH-Z19

0~2000ppm


- 소하테크

0~10000ppm




다음의 조건에 따라 LED 색깔이 변하도록 코딩했습니다.


- 구간

Green : 1000ppm 이하

Blue : 1000~1500ppm

Red : 1500~2000ppm







2-2. 소스코드


그렇다면 얼마나 정확한지, 소하테크 센서와 비교해서 확인해 볼까요?

코드는 다음과 같습니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// case 1 : MH-Z19
// case 2: Soha
 
int rgbPin[] = {3, 5, 6, 9, 10, 11};
int sensorPin[] = {A0, A1};
int val[] = {0, 0};
int co2ppm[] = {0, 0};
 
void setup() {
  // put your setup code here, to run once:
  for (int i = 0; i < 6; i++) {
    pinMode(rgbPin[i], OUTPUT);
  }
  for (int i = 0; i < 2; i++) {
    pinMode(sensorPin[i], INPUT);
  }
  Serial.begin(9600);
}
 
void loop() {
  // put your main code here, to run repeatedly:
  sensorInput(1);
  sensorInput(2);
 
}
 
void sensorInput(int sensorCase) {
  if (sensorCase == 1) {
    val[0] = analogRead(sensorPin[0]);
    co2ppm[0] = map(val[0], 0, 1023, 0, 2000);
 
    if (co2ppm[0] != 0) {
      Serial.print("MH-Z19 ");
      Serial.println(co2ppm[0]);
    }
    
    if (co2ppm[0] < 1000 && co2ppm[0] > 0) {
      ledColor_MH(0, 255, 0);
    } else if (co2ppm[0] >= 1000 && co2ppm[0] < 1500) {
      ledColor_MH(0, 0, 255);
    } else if (co2ppm[0] >= 1500) {
      ledColor_MH(255, 0, 0);
    }
    ledColor_MH(0, 0, 0);
    delay(600);
  } else if (sensorCase == 2) {
    val[1] = analogRead(sensorPin[1]);
    co2ppm[1] = map(val[1], 0, 1023, 0, 10000);
 
    Serial.print("Soha ");
    Serial.println(co2ppm[1]);
 
    if (co2ppm[1] < 1000 && co2ppm[1] > 0) {
      ledColor_Soha(0, 255, 0);
    } else if (co2ppm[1] >= 1000 && co2ppm[1] < 1500) {
      ledColor_Soha(0, 0, 255);
    } else if (co2ppm[1] >= 1500) {
      ledColor_Soha(255, 0, 0);
    }
    ledColor_Soha(0, 0, 0);
  }
  delay(600);
}
 
 
void ledColor_MH(int val1, int val2, int val3) {
  analogWrite(rgbPin[0], val1);
  analogWrite(rgbPin[1], val2);
  analogWrite(rgbPin[2], val3);
}
 
void ledColor_Soha(int val1, int val2, int val3) {
  analogWrite(rgbPin[3], val1);
  analogWrite(rgbPin[4], val2);
  analogWrite(rgbPin[5], val3);
}
 
 
 
cs





2-3. 결과값 확인


시리얼 코드 창에 뜬 값입니다.


아무래도 MH-Z19 raw값에 노이즈값으로 0이 자주 출몰하여 Soha가 프린트되는 비율이 높습니다.

관찰을 해보니, 처음에 막 전원을 켰을때는 값이 들쑥날쑥하다가

제 값을 찾아갑니다. 그리고 공간의 이동이 없는 한 값들 사이에 편차가 크지 않습니다.




MH-Z19 1425
Soha 1476
Soha 1427
Soha 1417
Soha 1407
Soha 1407
MH-Z19 1446
Soha 1397
Soha 1397
Soha 1397
Soha 1436
Soha 1427
MH-Z19 1452
Soha 1427
Soha 1397
Soha 1388
Soha 1388
Soha 1388
MH-Z19 1452
Soha 1388
Soha 1397
Soha 1388
Soha 1388
Soha 1485
MH-Z19 1450
Soha 1436
Soha 1417
Soha 1466
Soha 1436
Soha 1446
MH-Z19 1448
Soha 1446
Soha 1446
Soha 1446
Soha 1446
Soha 1485
Soha 1485












































다음 스토리에서는 소형화를 위해 아두이노 프로미니를 이용하여 설계힌 후 외관디자인을 해보겠습니다. 작고 귀여운 결과물이 나올 것 같습니다.






댓글 2

차량용 이산화탄소 측정기

센서값 비교를 통한 값보정 (MH-Z19 & SH-300-DS)

by 조혜인

MADE BY

조혜인

arduino, processing, rhino, sketchup, 아두이노, 에프터이펙트, 포토샵, 프리미어