가스·공기 · 난이도 어려움
MiCS-6814 3채널 가스 센서의 RED·OX·NH3 값을 따로 읽고 방향까지 해석하기
MiCS-6814는 환원성 기체(RED), 산화성 기체(OX), 암모니아(NH3)를 따로 감지하는 소자 세 개가 한 칩에 든 센서예요. 큰 센서 저항에 맞춘 분압, 피코 ADC 세 개를 모두 쓰는 배선, 채널마다 방향이 다른 변화를 읽는 법과 탐구를 정리했어요.
이 센서로 무엇을 잴 수 있나
MiCS-6814는 SGX Sensortech의 금속산화물 센서로, 서로 독립된 감지 소자 세 개가 5×7mm 칩 하나에 들어 있어요. 데이터시트는 자동차 배기가스와 농업·산업 냄새를 감지하는 용도로 소개해요. 감지 기체와 범위는 CO 1~1000ppm, NO₂ 0.05~10ppm, 에탄올 10~500ppm, 수소 1~1000ppm, 암모니아 1~500ppm, 메테인·프로판·아이소뷰테인 1000ppm 초과예요.
세 소자의 이름은 RED(환원성 기체), OX(산화성 기체), NH3(암모니아)예요. 한 기체가 세 소자를 서로 다르게 움직이니, 세 값을 함께 보면 MQ 센서 하나로는 못 하던 구별을 조금 할 수 있어요. 교실에서는 손 소독제, 창문 열기, 습도 변화, 도로 옆 공기에 세 채널이 각각 어떻게 반응하는지 비교해요. 농도(ppm)는 구하지 않아요.
원리
각 소자는 얇은 막(다이어프램)에 히터를 심고 그 위에 감지층을 올린 MEMS 구조예요. RED와 NH3 소자는 해당 기체가 닿으면 저항이 내려가요. OX 소자는 반대로 NO₂ 같은 산화성 기체가 늘면 저항이 커져요. 같은 순간에 RED는 내려가고 OX는 올라가는 일이 생기는 이유예요.
히터는 세 개가 따로 있어요. 데이터시트의 전형값은 RED 2.4V·32mA·76mW, OX 1.7V·26mA·43mW, NH3 2.2V·30mA·66mW이고, 직렬 저항을 붙여 5V(4.9~5.1V) 한 전원으로 구동해요. 세 전류를 더하면 약 88mA예요. 최대 정격을 넘는 히터 전압은 과열로 센서를 망가뜨린다고 경고해요.
맑은 공기 속 저항 R0는 RED 100~1500kΩ, OX 0.8~20kΩ, NH3 10~1500kΩ이에요. 같은 모델끼리도 RED는 15배, OX는 25배, NH3는 150배까지 차이 날 수 있고, 채널끼리는 자릿수부터 달라요. 데이터시트는 1kΩ~2MΩ를 읽는 측정 회로를 예로 들며, 부하 저항 하나를 56kΩ으로 두어도 될 수 있고, 감지층을 보호하려면 부하 저항이 820Ω보다 작으면 안 된다고 적어요.
준비물
- 라즈베리파이 피코와 USB 케이블
- 출력이 CO·NO2·NH3 세 핀으로 나온 아날로그 모듈(CJMCU-6814 등)
- 100kΩ 저항 3개, 200kΩ 저항 3개, 0.1µF 세라믹 콘덴서 3개
- 멀티미터, 브레드보드, 점퍼선
- (탐구) BME280 같은 습도 센서, 투명 상자, 젖은 수건, 들고 다닐 노트북
배선
브레드보드 따라 꽂기 순서 (16단계)
- 피코를 브레드보드 가운데 홈에 걸쳐 꽂아요. USB 단자가 왼쪽을 보게 하고, 1번 핀이 f2, 40번 핀이 e2에 들어가요. 다리가 홈 양쪽에 모두 들어갔는지 옆에서 봐요.
- 빨간 선: 피코 40번 핀(VBUS) 옆 칸 a2 → 아래쪽 + 줄(5V). 이제 이 줄 전체가 5V예요. 위쪽 + 줄(3.3V)과 아래쪽 + 줄(5V)은 절대 서로 잇지 않아요.
- 검은 선: 피코 3번 핀(GND) 옆 칸 j4 → 아래쪽 − 줄(GND). 이제 이 줄 전체가 GND예요.
- 공기질 3채널: CO·NO₂·NH₃ MiCS-6814 꽂기: 다리 VCC · GND · CO(RED) · NO2(OX) · NH3를 아래쪽 j24 · j25 · j26 · j27 · j28에 차례로 꽂아요. 다리가 브레드보드에 바로 안 들어가면 암-수 점퍼선으로 같은 칸에 이어요.
- 빨간 선(5V 전원): 공기질 3채널: CO·NO₂·NH₃ VCC 줄 i24 → 아래쪽 + 줄(5V)
- 검은 선(GND): 공기질 3채널: CO·NO₂·NH₃ GND 줄 i25 → 아래쪽 − 줄(GND)
- 저항 100kΩ: g26 ↔ g30 (CO(RED) 다리 칸 → 나눔 칸 30열)
- 저항 200kΩ: i30 ↔ 아래쪽 − 줄(GND)
- 초록 선: 나눔 칸 h30 → 피코 31번 핀(GP26) 옆 칸 a11. 5V 신호가 3.3V 아래로 줄어 피코가 안전해요.
- 저항 100kΩ: g27 ↔ g32 (NO2(OX) 다리 칸 → 나눔 칸 32열)
- 저항 200kΩ: i32 ↔ 아래쪽 − 줄(GND)
- 초록 선: 나눔 칸 h32 → 피코 32번 핀(GP27) 옆 칸 a10. 5V 신호가 3.3V 아래로 줄어 피코가 안전해요.
- 저항 100kΩ: g28 ↔ g34 (NH3 다리 칸 → 나눔 칸 34열)
- 저항 200kΩ: i34 ↔ 아래쪽 − 줄(GND)
- 초록 선: 나눔 칸 h34 → 피코 34번 핀(GP28) 옆 칸 a8. 5V 신호가 3.3V 아래로 줄어 피코가 안전해요.
- 마지막 확인: ① 위쪽 + 줄(3.3V)과 아래쪽 + 줄(5V)이 서로 이어지지 않았나요? ② 모든 부품의 GND가 − 줄에 이어졌나요? ③ 5V 신호 다리는 저항을 거쳐 피코에 이어졌나요? ④ 긴 브레드보드는 + − 줄이 가운데에서 끊긴 것도 있어요(빨간·파란 선이 끊겨 있으면 짧은 선으로 이어요). ⑤ 그림과 한 칸씩 비교한 뒤 USB를 꽂아요.
| 모듈 핀 | 피코 핀 | 비고 |
|---|---|---|
| VCC(5V) | VBUS (40번) | 히터 세 개 합 약 88mA |
| GND | GND (38번) | 공통 접지(히터 전류가 흘러요) |
| CO(RED) | GP26 (31번) | 100kΩ·200kΩ 분압, GP26–AGND(33번) 0.1µF |
| NO2(OX) | GP27 (32번) | 같은 방법 |
| NH3 | GP28 (34번) | 같은 방법 |
피코의 아날로그 입력 GP26·27·28 세 개를 모두 써요. 피코에 꽂기 전에 모듈만 켜고 멀티미터로 세 출력 전압을 먼저 재요. 모듈 회로에 따라 3.3V를 넘을 수 있어서 분압은 항상 해요. 모듈의 GND에는 히터 전류(약 88mA)가 함께 흘러요. 이 전류가 아날로그 기준 접지(AGND)로 흐르면 ADC 값이 흔들릴 수 있어서, 모듈 GND는 배선 그림처럼 일반 GND에 잇고 AGND(33번)에는 콘덴서만 이어요.
분압 저항 값이 MQ 글과 다른 이유가 있어요. RED와 NH3 소자는 저항이 수백 kΩ에서 MΩ까지 가요. 이런 출력에 합 30kΩ짜리 분압(10kΩ·20kΩ)을 걸면 분압 쪽으로 전류가 새어 출력 전압이 눌리고, 기체에 따른 변화도 함께 작아져요. 그래서 비율은 같은 2/3로 두고 저항만 10배 키운 100kΩ·200kΩ을 써요. 저항이 크면 ADC가 값을 읽는 짧은 순간에 전하가 모자라 값이 흔들릴 수 있어, 각 입력과 AGND 사이에 0.1µF를 달아 저장고 역할을 시켜요.
모듈에 부하 저항이 붙어 있는지도 확인해요. 출력 핀 근처에 저항이 없다면 데이터시트의 측정 회로 그림대로 부하 저항(820Ω 이상, 하나로 쓴다면 56kΩ부터)을 직접 달아야 해요.
코드
from machine import ADC, Pin
import time
red = ADC(Pin(26)) # CO(RED) → 100kΩ/200kΩ 분압 → GP26
ox = ADC(Pin(27)) # NO2(OX) → 100kΩ/200kΩ 분압 → GP27
nh3 = ADC(Pin(28)) # NH3 → 100kΩ/200kΩ 분압 → GP28
def volt(adc):
s = 0
for i in range(32):
s += adc.read_u16()
return s / 32 * 3.3 / 65535 * 1.5 # 분압(2/3)을 되돌린 출력 전압
def pct(v, b):
return (v - b) / b * 100 if b > 0.01 else 0
print("그래프가 평평해질 만큼 켜 둔 뒤, 깨끗한 공기에서 기준을 재요(20초)")
b_red = 0
b_ox = 0
b_nh3 = 0
for i in range(20):
b_red += volt(red)
b_ox += volt(ox)
b_nh3 += volt(nh3)
time.sleep(1)
b_red = b_red / 20
b_ox = b_ox / 20
b_nh3 = b_nh3 / 20
print(f"기준 RED {b_red:.3f} V, OX {b_ox:.3f} V, NH3 {b_nh3:.3f} V")
while True:
r = pct(volt(red), b_red)
o = pct(volt(ox), b_ox)
n = pct(volt(nh3), b_nh3)
print(f"DATA: red={r:.1f}, ox={o:.1f}, nh3={n:.1f}")
time.sleep(1)
volt(adc)는 채널 하나를 32번 읽어 평균한 뒤 1.5를 곱해 출력 전압으로 되돌려요.- 기준은 20초 평균이에요. 켠 직후에는 값이 움직이니 그래프가 평평해진 뒤에 시작해요.
pct(v, b)는 기준보다 몇 % 변했는지 돌려줘요. 기준이 0V 근처면 0을 돌려줘서 0으로 나누는 오류를 막아요.- 출력
red,ox,nh3는 전압의 변화율이에요. 저항의 변화율이 아니라는 점은 아래에서 설명해요.
값 해석과 보정
먼저 방향을 정해요. 모듈에서 부하 저항이 5V 쪽에 있으면 센서 저항이 내려갈 때 출력 전압도 내려가고, GND 쪽에 있으면 출력 전압이 올라가요. 손 소독제 면봉을 대어 RED 채널 전압이 어느 쪽으로 움직이는지 보면 내 모듈의 구조를 알 수 있어요. 데이터시트의 RED 감도 그래프에 에탄올 곡선이 있어서 시험용으로 알맞아요.
다음으로 채널끼리 크기를 견주지 않아요. R0가 채널마다 자릿수부터 달라서, 같은 10% 변화라도 뜻하는 저항 변화가 달라요. 채널마다 자기 기준과 비교하고, "어느 채널이 어느 방향으로 움직였나"를 기록해요.
데이터시트의 감도 계수는 "참고값일 뿐"이라고 적혀 있고, R0도 합성 공기와 정해진 온습도에서 잰 값이에요. 그래서 이 모듈로 ppm은 구하지 않아요. VBUS가 4.9~5.1V를 벗어나면 히터 온도가 달라지니 멀티미터로 한 번 확인해 두면 좋아요.
자주 하는 실수
- MQ 센서처럼 10kΩ·20kΩ으로 분압하기. 센서 저항이 커서 변화가 눌려 작게 보여요. 분압 저항을 10배 키워요.
- 세 채널이 같은 방향으로 움직인다고 생각하기. OX는 산화성 기체에 반대로 반응해요. 방향이 다르다고 고장이 아니에요.
- 다른 제품과 섞어 쓰기. Grove Multichannel Gas Sensor V1은 MiCS-6814를 쓰지만 I²C로 읽어서 이 코드와 달라요. V2는 GM-102B·302B·502B·702B라는 다른 센서 네 개를 쓰는 제품이에요.
- 센서 단품 히터에 5V를 바로 걸기. 데이터시트는 정격을 넘는 히터 전압이 과열로 센서를 망가뜨린다고 경고해요. 직렬 저항이 있는 모듈을 쓰세요.
- 센서 앞에서 유성 매직, 접착제를 열거나 담배 연기를 쐬기. 데이터시트는 진한 유기 용제, 실리콘 증기, 담배 연기가 감지층을 망가뜨린다고 적어요.
이 센서로 잴 수 있는 탐구
1. 세 채널은 같은 자극에 얼마나 다르게 반응할까 - 질문: 손 소독제와 창문 열기에 RED·OX·NH3가 각각 어느 방향으로 얼마나 움직일까? - 바꾸는 것: 자극(소독제 면봉 5cm 앞 20초, 창문 열기 3분) - 재는 것: 채널별 최대 변화율(%)과 방향(+, −) - 방법: 자극마다 3번 재고, 시도 사이에는 세 채널이 기준 ±2% 안으로 돌아올 때까지 기다려요.
2. 습도가 바뀌면 기준은 얼마나 움직일까 - 질문: 기체 없이 습도만 달라져도 세 채널이 움직일까? - 바꾸는 것: 상자 속 습도(마른 상자, 젖은 수건을 넣은 상자) - 재는 것: 채널별 변화율(%), 상자 속 습도(%RH) - 방법: 투명 상자에 센서와 습도 센서를 함께 넣고 20분 둬요. 마지막 5분 평균을 비교하고 조건마다 2번 해요.
3. 학교 정문 옆 공기와 교실 공기는 다를까
- 질문: 차가 지나가는 정문 옆 인도에서 세 채널은 교실과 다르게 움직일까?
- 바꾸는 것: 장소(교실 창가, 정문 옆 인도)
- 재는 것: 10분 평균 변화율(%), 그동안 지나간 차량 수(대)
- 방법: 노트북에 USB로 연결한 채 들고 나가 기록해요. 교실에서 출력된 기준 전압 세 개를 적어 두고, 기준을 계산한 줄 뒤에 b_red = 1.234처럼 그 값을 넣어 같은 기준을 써요. 같은 시간대에 3일 반복해요.
안전
- 기체를 만들지 않아요. 배기가스를 모으거나 센서를 배기구에 대지 않고, 닫힌 공간에서 엔진이나 불을 쓰지 않아요.
- 정문 옆 측정은 인도 안쪽에서 친구와 함께 하고, 차도로 내려가지 않아요.
- 센서가 켜져 있으면 칩 윗면이 뜨거울 수 있어요. 켠 채로 만지지 마세요.
- 이 장치는 인증받은 대기오염 측정기나 가스 경보기가 아니에요.