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

가스·공기 · 난이도 보통

MQ-3 알코올 센서로 손 소독제 증기의 반응 시간과 회복 시간 재기

MQ-3은 에탄올 증기에 민감한 반도체식 가스 센서예요. 분압 배선, 기준보다 20% 오르면 반응 시작으로 보고 최고점과 회복까지의 시간을 자동으로 재는 피코 코드, 판마다 다른 데이터시트 숫자를 읽는 법, 손 소독제 탐구 세 가지를 담았어요.

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

이 센서로 무엇을 잴 수 있나

MQ-3은 알코올(에탄올) 증기에 잘 반응하도록 만든 산화주석 가스 센서예요. 한웨이 데이터시트는 "알코올에 감도가 높고 벤진(석유계 용제)에는 감도가 낮다"고 소개하고, 감지 범위를 공기 1L 속 알코올 0.05~10mg으로 적어요. 다른 MQ 센서는 감지 범위를 ppm으로 적는데, MQ-3은 mg/L로 적어요.

교실에서 쓰기 좋은 대상은 에탄올이 주성분인 손 소독제예요. 이 글은 값의 크기보다 시간에 집중해요. 증기가 닿고 나서 몇 초 만에 최고점에 이르는지, 증기가 사라진 뒤 원래 값으로 돌아오기까지 얼마나 걸리는지를 코드가 자동으로 재요. 센서가 얼마나 빨리 따라오는지 알아야 "이 센서로 어떤 빠르기의 변화까지 볼 수 있나"를 판단할 수 있어요.

원리

히터가 산화주석 막을 데우면, 깨끗한 공기에서는 막의 저항(Rs)이 크고 알코올 분자가 닿으면 저항이 내려가요. 모듈 안에서 Rs는 부하 저항(RL)과 직렬로 5V에 연결되어 있고, AO에는 RL 양 끝 전압이 나와요. 그래서 알코올이 많을수록 AO 전압이 올라가요.

조심할 점은 데이터시트 판마다 숫자가 크게 다르다는 거예요. 한웨이 판은 RL 200kΩ을 표준으로 쓰고, 0.4mg/L 알코올 속 Rs를 1~8MΩ으로 적어요. 제목이 "MQ-3 Semiconductor Sensor for Alcohol"인 새 형식 판은 같은 조건의 Rs를 2~20kΩ, 감지 범위를 0.04~4mg/L, 예열을 48시간 이상으로 적어요(한웨이 판은 24시간). 새 형식 판은 휘발유·연기·수증기의 방해에 강하다고 소개하지만, 온도·습도에 따라 Rs가 달라지는 그래프는 두 판 모두에 실려 있어요. 내 모듈이 어느 쪽에 가까운지는 깨끗한 공기에서 AO 전압을 재 보면 짐작할 수 있어요. AO가 0V에 붙어 거의 안 움직이면, 센서 저항에 비해 모듈의 RL이 너무 작은 경우일 수 있어요.

히터 저항은 판에 따라 33Ω 또는 31Ω이라 5V에서 약 0.15~0.16A가 흘러요.

준비물

  • 라즈베리파이 피코와 USB 케이블
  • MQ-3 모듈(VCC·GND·DO·AO)
  • 10kΩ, 20kΩ 저항 1개씩
  • 브레드보드, 점퍼선
  • 에탄올 함량 표시가 다른 손 소독제 두 가지, 면봉, 휴지, 스포이트
  • (탐구 3) 습도를 잴 수 있는 센서(BME280 등)

배선

MQ-3 알코올 센서로 손 소독제 증기의 반응 시간과 회복 시간 재기: 브레드보드에 피코와 센서를 꽂은 배선 그림
시나브로 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. 알코올 MQ-3 꽂기: 다리 VCC · GND · AO를 아래쪽 j24 · j25 · j26에 차례로 꽂아요. 다리가 브레드보드에 바로 안 들어가면 암-수 점퍼선으로 같은 칸에 이어요.
  5. 빨간 선(5V 전원): 알코올 VCC 줄 i24 → 아래쪽 + 줄(5V)
  6. 검은 선(GND): 알코올 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
GND GND (38번) 공통 접지
AO GP26 (31번) 10kΩ·20kΩ 분압 뒤 연결
DO 연결 안 함 이 글은 AO만 써요

피코 ADC는 3.3V까지만 받는데 MQ-3의 AO는 이론상 5V까지 올라가요. 그래서 AO에 10kΩ을, GND 쪽에 20kΩ을 두고 둘 사이 점을 GP26에 이어 전압을 2/3로 줄여요. 저항 순서를 바꾸면 1/3이 되어 값이 작게 나오고, 코드의 ×1.5 환산도 틀려져요. 꽂기 전에 어느 저항이 GND 쪽인지 확인하세요.

코드

from machine import ADC, Pin
import time

mq3 = ADC(Pin(26))             # AO → 10kΩ/20kΩ 분압 → GP26
START = 20                     # 기준보다 20% 넘게 오르면 '반응 시작'
BACK = 10                      # 기준 +10% 아래로 내려오면 '회복'

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

print("깨끗한 공기에서 기준을 재요(30초)")
base = 0
for i in range(30):
    base += volt()
    time.sleep(1)
base = base / 30

state = 0                      # 0: 기다림, 1: 반응 중
t_start = 0
t_peak = 0
peak = 0
while True:
    v = volt()
    rise = (v - base) / base * 100 if base > 0 else 0
    now = time.ticks_ms()
    if state == 0 and rise > START:
        state = 1
        t_start = now
        t_peak = now
        peak = rise
    elif state == 1:
        if rise > peak:
            peak = rise
            t_peak = now
        if rise < BACK:
            up = time.ticks_diff(t_peak, t_start) / 1000
            down = time.ticks_diff(now, t_peak) / 1000
            print(f"한 번 끝: 최고 {peak:.0f}%, 최고까지 {up:.1f}초, 회복 {down:.1f}초")
            state = 0
    print(f"DATA: mq3_v={v:.3f}, rise={rise:.0f}")
    time.sleep(0.5)
  • 처음 30초 동안 깨끗한 공기의 평균 전압을 기준(base)으로 잡아요.
  • rise가 START(20%)를 넘으면 반응이 시작된 것으로 보고, 그때부터 가장 높았던 값과 그 시각을 기억해요.
  • rise가 BACK(10%) 아래로 내려오면 한 번의 반응이 끝난 거예요. "최고까지"는 20%를 넘은 순간부터 최고점까지, "회복"은 최고점부터 10% 아래로 내려오기까지 걸린 시간이에요.
  • 문턱을 두 개(20%, 10%)로 둔 이유는 값이 20% 근처에서 오르내릴 때 시작과 끝이 여러 번 찍히지 않게 하려는 거예요.
  • 0.5초마다 읽으므로 시간은 0.5초 단위로만 믿을 수 있어요. time.ticks_diff()를 쓰면 내부 시계 숫자가 한 바퀴 돌아도 차이를 바르게 계산해요.

값 해석과 보정

rise는 기준 전압보다 몇 % 높은지를 뜻할 뿐, 알코올 mg/L가 아니에요. 한웨이 판의 감도 곡선은 기준 Ro를 "깨끗한 공기 속 0.4mg/L 알코올에서의 저항"으로 정했고 RL 200kΩ 조건에서 그렸어요. 기준도 회로도 다르니 곡선에 대입해 농도를 구하지 마세요.

반응 시간과 회복 시간은 센서만의 성질이 아니에요. 증기가 퍼지는 속도, 교실 공기의 흐름, 소독제의 양이 함께 들어가요. 그래서 비교할 때는 양(스포이트 1방울), 거리, 창문 상태를 고정하고 문턱 값(20%, 10%)도 기록에 같이 적어요.

한웨이 판에는 33%RH와 85%RH에서 온도에 따라 Rs/Ro가 어떻게 바뀌는지 보여 주는 그래프가 있어요. 습기만으로도 값이 움직일 수 있다는 뜻이라, 탐구 3에서 직접 확인해 봐요.

잰 반응 시간은 기록 간격을 정하는 근거도 돼요. 최고까지 걸린 시간이 기록 간격(0.5초)의 몇 배밖에 안 된다면 간격을 줄이거나, 결과를 "0.5초 단위로 잼"이라고 밝혀 적어요.

자주 하는 실수

  1. 분압 저항 순서를 바꾸기. 20kΩ이 AO 쪽에 오면 피코에 들어가는 전압이 1/3로 줄어 변화가 작게 보여요.
  2. 기준으로 돌아오기 전에 다음 시도를 시작하기. 이전 증기가 남아 있으면 최고값이 부풀고 회복 시간이 짧게 나와요. 한 번 끝 메시지를 보고 1분 더 기다려요.
  3. 소독제 통을 센서 바로 위에서 열기. 값이 위쪽 끝에 붙어 버리고 회복도 오래 걸릴 수 있어요. 데이터시트도 진한 기체에 오래 두면 특성이 바뀐다고 경고해요.
  4. 입김으로 알코올 반응을 확인하기. 입김의 습기와 온기만으로도 값이 변할 수 있어요. 알코올 때문이라고 단정하지 마세요.
  5. 인터넷에서 본 남의 센서 숫자를 그대로 쓰기. 판에 따라 Rs가 자릿수부터 다르니 내 센서로 기준을 잡아요.

이 센서로 잴 수 있는 탐구

1. 소독제 제품에 따라 반응이 다를까 - 질문: 에탄올 함량 표시가 다른 두 소독제는 최고 상승률과 반응 빠르기가 다를까? - 바꾸는 것: 소독제 종류(라벨의 에탄올 함량이 다른 두 제품) - 재는 것: 최고 상승률(%), 최고까지 걸린 시간(초) - 방법: 스포이트로 1방울을 면봉에 떨어뜨리고 센서에서 5cm 떨어진 곳에 20초 두었다가 치워요. 제품마다 5번 재서 평균과 범위를 비교해요.

2. 증발하면서 신호는 얼마나 빨리 줄어들까 - 질문: 같은 양을 면봉과 휴지에 묻히면, 넓게 퍼진 쪽이 더 빨리 사라질까? - 바꾸는 것: 소독제를 묻힌 재료(면봉, 펼친 휴지 한 장) - 재는 것: 최고값의 절반으로 내려오기까지 걸린 시간(초) - 방법: 1방울을 묻혀 센서 5cm 앞에 놓고 치우지 않은 채 기록해요. 저장한 표에서 최고값과 그 절반이 된 시각을 찾아 빼요. 재료마다 3번씩 해요.

3. 입김만으로도 값이 오를까 - 질문: 알코올이 없는 입김에도 MQ-3이 반응할까? - 바꾸는 것: 자극의 종류(입김, 소독제 면봉, 아무것도 없음) - 재는 것: 최고 상승률(%), 옆에 둔 습도 센서의 최고 습도(%RH) - 방법: 센서에서 10cm 떨어져 3초 동안 숨을 내쉬어요. 같은 거리에서 소독제 면봉도 재고, 각각 3번씩 비교해요.

안전

  • 술이나 술이 든 음료는 쓰지 않아요. 술을 마시고 측정하는 실험은 하지 않아요. 이 장치는 음주 측정기가 아니에요.
  • 히터 때문에 센서가 뜨거워요. 켠 채로 만지지 말고, 입김 실험도 10cm 넘게 떨어져서 해요.
  • 손 소독제는 불이 붙는 액체예요. 1방울만 쓰고 불 가까이 두지 말고, 센서에 액체가 닿지 않게 해요.
  • 증기를 일부러 들이마시지 말고, 실험 뒤에는 창문을 열어 환기해요.

더 알아보기

  • 데이터시트: Hanwei Electronics "MQ-3 Technical Data"(RL 200kΩ, Rs 1~8MΩ, 0.05~10mg/L, 예열 24시간), 새 형식 판 "MQ-3 Semiconductor Sensor for Alcohol"(Rs 2~20kΩ, 0.04~4mg/L, 예열 48시간)
  • 라이브러리: 따로 없어요. machine.ADC와 time.ticks_ms(), time.ticks_diff()를 써요.
  • 기초 글: 분압 회로, 센서 값의 신뢰도, 잴 수 있는 탐구 주제 고르기
글쓴이

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