홍창민정보·인공지능 교사

가스·공기 · 난이도 어려움

MiCS-6814 3채널 가스 센서의 RED·OX·NH3 값을 따로 읽고 방향까지 해석하기

MiCS-6814는 환원성 기체(RED), 산화성 기체(OX), 암모니아(NH3)를 따로 감지하는 소자 세 개가 한 칩에 든 센서예요. 큰 센서 저항에 맞춘 분압, 피코 ADC 세 개를 모두 쓰는 배선, 채널마다 방향이 다른 변화를 읽는 법과 탐구를 정리했어요.

글 홍창민 · 갱신 2026-10-31 · 읽는 데 약 9분 · 가상 실행 확인 (실물 미확인)

이 센서로 무엇을 잴 수 있나

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 같은 습도 센서, 투명 상자, 젖은 수건, 들고 다닐 노트북

배선

MiCS-6814 3채널 가스 센서의 RED·OX·NH3 값을 따로 읽고 방향까지 해석하기: 브레드보드에 피코와 센서를 꽂은 배선 그림
시나브로 PICO 브레드보드 작업대와 같은 계산으로 그린 배선이에요. 위 + 줄은 3.3V, 아래 + 줄은 5V예요.
브레드보드 따라 꽂기 순서 (16단계)
  1. 피코를 브레드보드 가운데 홈에 걸쳐 꽂아요. USB 단자가 왼쪽을 보게 하고, 1번 핀이 f2, 40번 핀이 e2에 들어가요. 다리가 홈 양쪽에 모두 들어갔는지 옆에서 봐요.
  2. 빨간 선: 피코 40번 핀(VBUS) 옆 칸 a2 → 아래쪽 + 줄(5V). 이제 이 줄 전체가 5V예요. 위쪽 + 줄(3.3V)과 아래쪽 + 줄(5V)은 절대 서로 잇지 않아요.
  3. 검은 선: 피코 3번 핀(GND) 옆 칸 j4 → 아래쪽 − 줄(GND). 이제 이 줄 전체가 GND예요.
  4. 공기질 3채널: CO·NO₂·NH₃ MiCS-6814 꽂기: 다리 VCC · GND · CO(RED) · NO2(OX) · NH3를 아래쪽 j24 · j25 · j26 · j27 · j28에 차례로 꽂아요. 다리가 브레드보드에 바로 안 들어가면 암-수 점퍼선으로 같은 칸에 이어요.
  5. 빨간 선(5V 전원): 공기질 3채널: CO·NO₂·NH₃ VCC 줄 i24 → 아래쪽 + 줄(5V)
  6. 검은 선(GND): 공기질 3채널: CO·NO₂·NH₃ GND 줄 i25 → 아래쪽 − 줄(GND)
  7. 저항 100kΩ: g26 ↔ g30 (CO(RED) 다리 칸 → 나눔 칸 30열)
  8. 저항 200kΩ: i30 ↔ 아래쪽 − 줄(GND)
  9. 초록 선: 나눔 칸 h30 → 피코 31번 핀(GP26) 옆 칸 a11. 5V 신호가 3.3V 아래로 줄어 피코가 안전해요.
  10. 저항 100kΩ: g27 ↔ g32 (NO2(OX) 다리 칸 → 나눔 칸 32열)
  11. 저항 200kΩ: i32 ↔ 아래쪽 − 줄(GND)
  12. 초록 선: 나눔 칸 h32 → 피코 32번 핀(GP27) 옆 칸 a10. 5V 신호가 3.3V 아래로 줄어 피코가 안전해요.
  13. 저항 100kΩ: g28 ↔ g34 (NH3 다리 칸 → 나눔 칸 34열)
  14. 저항 200kΩ: i34 ↔ 아래쪽 − 줄(GND)
  15. 초록 선: 나눔 칸 h34 → 피코 34번 핀(GP28) 옆 칸 a8. 5V 신호가 3.3V 아래로 줄어 피코가 안전해요.
  16. 마지막 확인: ① 위쪽 + 줄(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를 벗어나면 히터 온도가 달라지니 멀티미터로 한 번 확인해 두면 좋아요.

자주 하는 실수

  1. MQ 센서처럼 10kΩ·20kΩ으로 분압하기. 센서 저항이 커서 변화가 눌려 작게 보여요. 분압 저항을 10배 키워요.
  2. 세 채널이 같은 방향으로 움직인다고 생각하기. OX는 산화성 기체에 반대로 반응해요. 방향이 다르다고 고장이 아니에요.
  3. 다른 제품과 섞어 쓰기. Grove Multichannel Gas Sensor V1은 MiCS-6814를 쓰지만 I²C로 읽어서 이 코드와 달라요. V2는 GM-102B·302B·502B·702B라는 다른 센서 네 개를 쓰는 제품이에요.
  4. 센서 단품 히터에 5V를 바로 걸기. 데이터시트는 정격을 넘는 히터 전압이 과열로 센서를 망가뜨린다고 경고해요. 직렬 저항이 있는 모듈을 쓰세요.
  5. 센서 앞에서 유성 매직, 접착제를 열거나 담배 연기를 쐬기. 데이터시트는 진한 유기 용제, 실리콘 증기, 담배 연기가 감지층을 망가뜨린다고 적어요.

이 센서로 잴 수 있는 탐구

1. 세 채널은 같은 자극에 얼마나 다르게 반응할까 - 질문: 손 소독제와 창문 열기에 RED·OX·NH3가 각각 어느 방향으로 얼마나 움직일까? - 바꾸는 것: 자극(소독제 면봉 5cm 앞 20초, 창문 열기 3분) - 재는 것: 채널별 최대 변화율(%)과 방향(+, −) - 방법: 자극마다 3번 재고, 시도 사이에는 세 채널이 기준 ±2% 안으로 돌아올 때까지 기다려요.

2. 습도가 바뀌면 기준은 얼마나 움직일까 - 질문: 기체 없이 습도만 달라져도 세 채널이 움직일까? - 바꾸는 것: 상자 속 습도(마른 상자, 젖은 수건을 넣은 상자) - 재는 것: 채널별 변화율(%), 상자 속 습도(%RH) - 방법: 투명 상자에 센서와 습도 센서를 함께 넣고 20분 둬요. 마지막 5분 평균을 비교하고 조건마다 2번 해요.

3. 학교 정문 옆 공기와 교실 공기는 다를까 - 질문: 차가 지나가는 정문 옆 인도에서 세 채널은 교실과 다르게 움직일까? - 바꾸는 것: 장소(교실 창가, 정문 옆 인도) - 재는 것: 10분 평균 변화율(%), 그동안 지나간 차량 수(대) - 방법: 노트북에 USB로 연결한 채 들고 나가 기록해요. 교실에서 출력된 기준 전압 세 개를 적어 두고, 기준을 계산한 줄 뒤에 b_red = 1.234처럼 그 값을 넣어 같은 기준을 써요. 같은 시간대에 3일 반복해요.

안전

  • 기체를 만들지 않아요. 배기가스를 모으거나 센서를 배기구에 대지 않고, 닫힌 공간에서 엔진이나 불을 쓰지 않아요.
  • 정문 옆 측정은 인도 안쪽에서 친구와 함께 하고, 차도로 내려가지 않아요.
  • 센서가 켜져 있으면 칩 윗면이 뜨거울 수 있어요. 켠 채로 만지지 마세요.
  • 이 장치는 인증받은 대기오염 측정기나 가스 경보기가 아니에요.

더 알아보기

  • 데이터시트: SGX Sensortech "MiCS-6814 Data Sheet" 1143 rev 8(감지 기체·범위, 히터 전력, R0 범위, 측정 회로, 주의 사항)
  • 비교 자료: Seeed Studio "Grove - Multichannel Gas Sensor V2" 위키(다른 센서를 쓰는 제품)
  • 라이브러리: 아날로그 모듈은 따로 없어요. machine.ADC 세 채널을 써요.
  • 기초 글: 분압 회로, 피코 핀 지도, 전원 계산, 센서 값의 신뢰도
글쓴이

홍창민 · 울산 학성고등학교 정보·인공지능 교사. 수업에 쓰는 도구(시나브로 PICO 웹 IDE, 학교 AI 서버 등)를 직접 만들어 운영해요. 소개 보기 · 고칠 곳 알려 주기