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

가스·공기 · 난이도 보통

MQ-8 수소 센서의 예열이 끝났는지 데이터로 판단하기

MQ-8은 수소에 민감한 반도체식 가스 센서이고, 데이터시트는 48시간 넘는 예열을 요구해요. 30초 평균과 변화율로 기준이 자리 잡았는지 판단하는 피코 코드, 깨끗한 공기 기준 R0의 의미, 교사 시연으로만 하는 물 전기분해의 안전 수칙을 담았어요.

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

이 센서로 무엇을 잴 수 있나

MQ-8은 수소(H₂)에 감도가 높도록 만든 산화주석 센서예요. 윈센(Winsen) 설명서 1.3판은 감지 범위를 수소 100~1000ppm으로 적고, 다른 기체의 방해에 강하다고 소개해요. 한웨이의 예전 판도 알코올, 요리 연기, LPG, CO의 방해를 피하도록 만들었다고 밝혀요.

수소는 학생이 만들어 쓰기에 위험한 기체라서, 이 글은 먼저 센서 자체를 재요. 데이터시트는 예열을 48시간 넘게 하라고 적어 두었어요. 그런데 "다 데워졌다"는 것을 무엇으로 알 수 있을까요? 이 글의 코드는 30초마다 평균을 내고, 앞의 평균과 얼마나 달라졌는지를 계산해서 기준이 멈췄는지를 데이터로 판단해요. 그 밖에 예열 시간에 따라 알코올 반응이 달라지는지, 교사가 시연하는 물 전기분해에서 나온 수소에 얼마나 반응하는지도 잴 수 있어요.

원리

데운 산화주석 막은 깨끗한 공기에서 전기가 잘 통하지 않다가 수소가 닿으면 전도도가 커져요. 모듈의 AO에는 막과 직렬로 연결된 부하 저항(RL)의 전압이 나와서, 수소가 많을수록 AO가 올라가요.

설명서의 주요 숫자는 이래요. 히터는 5.0V(±0.1V), 히터 저항은 29Ω(±3Ω)이라 5V에서 약 0.17A가 흘러요. 다른 MQ 센서(31~33Ω)보다 조금 많아요. 감도는 "깨끗한 공기 속 Rs ÷ 1000ppm 수소 속 Rs"가 5 이상이고, 1000ppm 수소에서 RL 전압 Vs가 2.5~4.0V예요. 표준 시험 조건은 20℃, 55%RH예요.

눈여겨볼 점은 R0의 정의예요. 이 설명서의 감도 곡선은 R0를 "깨끗한 공기 속 센서 저항"으로 정했어요. MQ-2처럼 1000ppm 수소 속 저항을 기준으로 삼는 데이터시트와 달라요. 그래서 우리가 교실에서 잡는 깨끗한 공기 기준이 곡선의 기준과 뜻이 같아요. 다만 시험 조건(20℃, 55%RH)과 우리 교실 조건이 다르니 곡선 숫자를 그대로 쓰지는 않아요.

예열이 필요한 까닭도 설명서에 있어요. 전원 없이 오래 보관한 센서는 저항이 되돌릴 수 있는 방향으로 떠돌고(드리프트), 다시 쓰기 전에 오래 켜 두어야 안정된다고 적혀 있어요.

준비물

  • 라즈베리파이 피코와 USB 케이블
  • MQ-8 모듈(VCC·GND·DO·AO)
  • 10kΩ, 20kΩ 저항 1개씩, 브레드보드, 점퍼선
  • 손 소독제, 면봉(탐구 2)
  • 교사 시연용(탐구 3): 9V 건전지, 집게 전선, 연필심 전극 2개, 탄산수소나트륨(베이킹소다), 투명 컵

배선

MQ-8 수소 센서의 예열이 끝났는지 데이터로 판단하기: 브레드보드에 피코와 센서를 꽂은 배선 그림
시나브로 PICO 브레드보드 작업대와 같은 계산으로 그린 배선이에요. 위 + 줄은 3.3V, 아래 + 줄은 5V예요.
브레드보드 따라 꽂기 순서 (10단계)
  1. 피코를 브레드보드 가운데 홈에 걸쳐 꽂아요. USB 단자가 왼쪽을 보게 하고, 1번 핀이 f2, 40번 핀이 e2에 들어가요. 다리가 홈 양쪽에 모두 들어갔는지 옆에서 봐요.
  2. 빨간 선: 피코 40번 핀(VBUS) 옆 칸 a2 → 아래쪽 + 줄(5V). 이제 이 줄 전체가 5V예요. 위쪽 + 줄(3.3V)과 아래쪽 + 줄(5V)은 절대 서로 잇지 않아요.
  3. 검은 선: 피코 3번 핀(GND) 옆 칸 j4 → 아래쪽 − 줄(GND). 이제 이 줄 전체가 GND예요.
  4. 수소 H₂ MQ-8 꽂기: 다리 VCC · GND · AO를 아래쪽 j24 · j25 · j26에 차례로 꽂아요. 다리가 브레드보드에 바로 안 들어가면 암-수 점퍼선으로 같은 칸에 이어요.
  5. 빨간 선(5V 전원): 수소 H₂ VCC 줄 i24 → 아래쪽 + 줄(5V)
  6. 검은 선(GND): 수소 H₂ GND 줄 i25 → 아래쪽 − 줄(GND)
  7. 저항 10kΩ(색띠 갈색·검정·주황): g26 ↔ g28 (AO 다리 칸 → 나눔 칸 28열)
  8. 저항 20kΩ(색띠 빨강·검정·주황): i28 ↔ 아래쪽 − 줄(GND)
  9. 초록 선: 나눔 칸 h28 → 피코 31번 핀(GP26) 옆 칸 a11. 5V 신호가 3.3V 아래로 줄어 피코가 안전해요.
  10. 마지막 확인: ① 위쪽 + 줄(3.3V)과 아래쪽 + 줄(5V)이 서로 이어지지 않았나요? ② 모든 부품의 GND가 − 줄에 이어졌나요? ③ 5V 신호 다리는 저항을 거쳐 피코에 이어졌나요? ④ 긴 브레드보드는 + − 줄이 가운데에서 끊긴 것도 있어요(빨간·파란 선이 끊겨 있으면 짧은 선으로 이어요). ⑤ 그림과 한 칸씩 비교한 뒤 USB를 꽂아요.
모듈 핀 피코 핀 비고
VCC VBUS (40번) 히터 5V, 약 0.17A
GND GND (38번) 공통 접지
AO GP26 (31번) 10kΩ·20kΩ 분압 뒤 연결
DO 연결 안 함

설명서의 시험 회로에서는 1000ppm 수소일 때 출력이 2.5~4.0V예요. 모듈의 부하 저항에 따라 달라지지만, 피코 ADC의 3.3V를 넘을 수 있다는 뜻이라 그대로 꽂으면 안 돼요. AO 쪽 10kΩ, GND 쪽 20kΩ으로 2/3를 만들면 4.0V는 약 2.67V, 5V는 약 3.33V가 되어 피코가 안전하게 읽어요.

코드

from machine import ADC, Pin
import time

mq8 = ADC(Pin(26))             # AO → 10kΩ/20kΩ 분압 → GP26
start = time.ticks_ms()

def volt():
    s = 0
    for i in range(32):
        s += mq8.read_u16()
    return s / 32 * 3.3 / 65535 * 1.5

print("30초마다 평균을 내요. 켠 순간부터 시간을 세요")
last = volt()
calm = 0                       # '거의 안 변함'이 몇 번 이어졌나
while True:
    total = 0
    for i in range(30):
        total += volt()
        time.sleep(1)
    v = total / 30
    change = (v - last) / last * 100 if last > 0 else 0
    calm = calm + 1 if abs(change) < 0.3 else 0
    minutes = time.ticks_diff(time.ticks_ms(), start) / 60000
    print(f"DATA: mq8_v={v:.4f}, change={change:.2f}, minutes={minutes:.1f}, calm={calm}")
    if calm == 20:
        print("10분 동안 30초 변화가 0.3%보다 작았어요. 지금 값을 기준으로 써도 돼요")
    last = v
  • 30초 동안 1초마다 32번씩 읽어 평균을 내요. 한 번 읽은 값보다 덜 흔들려요.
  • change는 앞선 30초 평균보다 몇 % 달라졌는지예요.
  • calm은 변화가 0.3%보다 작았던 구간이 몇 번 이어졌는지 세요. 20번(10분) 이어지면 "기준으로 써도 된다"고 알려요. 0.3%와 10분은 이 글이 정한 기준이에요. 더 엄격하게 하고 싶으면 숫자를 줄이세요.
  • minutes는 코드를 시작한 뒤 흐른 시간이에요. 피코를 켜자마자 코드를 돌려야 "켠 뒤 몇 분"과 같아져요.
  • 빠른 반응을 보는 탐구 2·3에서는 range(30)을 range(2)로 바꿔 2초 평균으로 기록해요. 이때 calm 판정은 쓰지 않아요.

값 해석과 보정

기록을 minutes에 따라 그래프로 그리면 처음에는 크게 움직이다가 점점 평평해지는 모양을 기대할 수 있어요. 평평해진 시점이 그날의 "준비된 시각"이에요. 새 센서는 설명서대로 48시간 넘게 예열한 뒤에 기준을 잡고, 그 뒤로는 날마다 이 코드로 "오늘 준비됐나"를 확인하면 돼요.

기준 전압으로 Rs/R0를 구하려면 Rs ÷ R0 = ((Vc − V) ÷ V) ÷ ((Vc − V0) ÷ V0)를 쓰면 돼요. V0는 안정된 깨끗한 공기의 전압, Vc는 VBUS 전압이에요. 부하 저항 값은 약분되어 몰라도 돼요. 1000ppm 수소에서 이 비율이 0.2 이하로 내려가는 것이 설명서가 정한 최소 감도지만, 우리는 1000ppm을 만들 수 없으니 확인할 수 없어요.

설명서에는 온도·습도에 따라 1000ppm 수소 속 저항이 달라지는 그래프도 있어요. 기준은 날마다 새로 잡아요.

자주 하는 실수

  1. 켜고 몇 분 만에 실험을 시작하기. 기준이 계속 움직이는 동안 잰 반응은 크기를 믿을 수 없어요. calm 메시지를 기다려요.
  2. 소금물로 전기분해하기. 소금(염화나트륨)을 넣으면 양극에서 유독한 염소가 나와요. 시연은 탄산수소나트륨 수용액으로만 해요.
  3. 수소에만 반응한다고 믿기. 설명서 감도 곡선에는 알코올, CO, 메테인 곡선도 있어요. 값이 올랐다고 수소라고 단정하지 마세요.
  4. 다른 MQ 센서의 R0 정의를 섞어 쓰기. 기준 저항의 정의가 데이터시트마다 달라요. 어떤 정의로 계산했는지 기록에 적어요.

이 센서로 잴 수 있는 탐구

1. 꺼 두었던 시간이 길수록 안정되기까지 오래 걸릴까 - 질문: 직전에 꺼져 있던 시간에 따라 calm이 20에 이르는 시간이 달라질까? - 바꾸는 것: 직전에 꺼 둔 시간(1시간, 1일, 1주) - 재는 것: calm이 20이 될 때의 minutes(분), 그때의 전압(V) - 방법: 같은 책상, 같은 시간대에 코드를 그대로 돌려 기록해요. 조건마다 2번씩 해요.

2. 예열 정도에 따라 알코올 반응이 달라질까 - 질문: 켠 지 10분, 1시간, 3시간일 때 같은 소독제에 대한 반응 크기가 같을까? - 바꾸는 것: 켠 뒤 지난 시간(10분, 1시간, 3시간) - 재는 것: 면봉을 대기 직전 값보다 오른 최고 비율(%) - 방법: 소독제 1방울을 묻힌 면봉을 4cm 앞에 30초 두었다가 치워요. 시점마다 3번 재고, 시도 사이에는 값이 돌아올 때까지 기다려요.

3. (교사 시연) 전기분해를 오래 할수록 반응이 커질까 - 질문: 전기분해한 시간에 따라 컵 위에서 잰 반응이 커질까? - 바꾸는 것: 전기분해 시간(30초, 60초, 120초) - 재는 것: 최고 상승률(%), 원래 값으로 돌아오기까지 걸린 시간(초) - 방법: 교사가 탄산수소나트륨 수용액에 연필심 전극 두 개를 넣고 9V 건전지로 전기분해해요. 정한 시간이 지나면 건전지를 떼고, 센서를 컵 위 10cm에 20초 둬요. 학생은 기록된 데이터를 분석해요.

안전

  • 수소는 불이 아주 잘 붙는 기체예요. 학생이 수소를 만들지 않아요. 전기분해는 교사 시연으로만, 작은 건전지로, 불씨와 정전기가 없는 환기된 곳에서 해요. 모은 기체에 불을 붙이는 시연은 하지 않아요.
  • 전기분해에는 소금을 쓰지 않아요. 염소가 생겨요.
  • 히터가 뜨거워요. 켠 채로 만지지 마세요. 오래 예열할 때 사람이 없는 시간에도 켜 둘지는 학교 규칙과 선생님 판단에 따라요.
  • 이 장치는 인증받은 수소 검지기나 가스 경보기가 아니에요.

더 알아보기

글쓴이

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