오늘은 지난 시간에 이어 라즈베리파이로 일산화탄소(CO) 센서(MQ-7) 와 리드스위치 센서를 다뤄보겠다.
지난 글에서는 스텝모터를 이용해 창문을 자동으로 개폐하는 예제를 만들어봤다.
이제는 환경 감지를 위해 일산화탄소 농도를 측정하고,
자석의 유무로 문(창문)의 상태를 확인하는 방법을 알아보자.
1. 실험 준비물
| 라즈베리파이 4B | 메인 제어 보드 |
| MCP3008 | 아날로그-디지털 변환기 (ADC) |
| MQ-7 일산화탄소 센서 | 아날로그 출력형 가스 센서 |
| 리드스위치 센서 | 자석 감지용 센서 (디지털 출력) |
2. MCP3008과 일산화탄소 센서 연결
MQ-7 센서는 아날로그 값을 출력하기 때문에
라즈베리파이처럼 디지털 입력만 가능한 보드에서는 직접 읽을 수 없다.
그래서 MCP3008이라는 8채널 10비트 ADC를 사용하여
아날로그 신호를 디지털 값으로 변환해준다.
MCP3008은 SPI 통신으로 동작하며,
라즈베리파이의 MOSI, MISO, SCLK, CE0 핀을 이용한다.


3. 일산화탄소 센서 코드
다음은 MCP3008을 이용해 MQ-7 센서 값을 읽는 코드이다.
라이터의 가스를 센서 근처에 가져다 대면 gasgas가 출력된다.
import spidev # SPI 통신용 라이브러리
import RPi.GPIO as GPIO
import time
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
spi = spidev.SpiDev()
spi.open(0, 0) # SPI 버스 0, CE0 사용
spi.max_speed_hz = 1000000 # 최대 속도 1MHz
def analogRead(ch):
# MCP3008에서 채널 ch의 아날로그 값을 읽는 함수
buf = [(1<<2)|(1<<1)|(ch&4)>>2, (ch&3)<<6, 0]
buf = spi.xfer(buf)
adcValue = ((buf[1] & 0x0F) << 8) | buf[2]
return adcValue
try:
while True:
gasValue = analogRead(0) # 0번 채널에서 읽기
print(gasValue)
if gasValue >= 50:
print("gasgas") # 일정 농도 이상이면 출력
else:
print("low gas")
time.sleep(1)
except KeyboardInterrupt:
pass
GPIO.cleanup()
spi.close()
5. 리드스위치 센서의 원리
리드스위치는 자기장에 반응하는 스위치 센서이다.
작은 유리관 안에 두 개의 금속 리드(리드 조각)가 들어 있고,
자석이 가까워지면 두 리드가 서로 붙어 전류가 흐르게 된다.
(a) 리드스위치의 구조
- 리드 조각: 얇은 자성 금속으로 구성되어 있다.
- 유리관: 내부를 진공 상태로 유지해 산화나 먼지의 영향을 받지 않게 한다.

(b) 동작 원리
자석의 N극과 S극이 리드스위치 근처에 오면 자기선이 리드를 자화시켜
두 금속이 서로 끌어당겨 붙게 된다.
자석이 멀어지면 자기장이 사라져 다시 떨어지며, 스위치가 열리게 된다.

6. 리드스위치 센서 모듈 설명
리드스위치 센서는 아래와 같은 모듈 형태로 많이 사용된다.
- Power LED indicator : 전원 표시 LED
- Positive 3.3~5V : 전원 입력
- Negative (GND) : 접지
- Switch signal output : 리드스위치의 상태 출력
- Sensitivity potentiometer : 감도 조절용 가변저항
- Switch LED indicator : 스위치가 닫히면 켜지는 LED 표시등
이 모듈은 3.3V~5V에서 안정적으로 동작하며,
자석이 근처에 오면 LED가 켜지고 출력 핀은 LOW(0V) 로 떨어진다.
7. 리드스위치 예제 코드
리드스위치의 출력 핀을 라즈베리파이의 GPIO에 연결하여
자석이 감지되면 LED가 켜지도록 만들 수 있다.
import RPi.GPIO as GPIO
import time
SWITCH_PIN = 17
LED_PIN = 27
GPIO.setmode(GPIO.BCM)
GPIO.setup(SWITCH_PIN, GPIO.IN)
GPIO.setup(LED_PIN, GPIO.OUT)
try:
while True:
val = GPIO.input(SWITCH_PIN)
if val == 0: # 자석이 감지됨 (스위치 닫힘)
GPIO.output(LED_PIN, True)
print("Magnet Detected!")
else:
GPIO.output(LED_PIN, False)
time.sleep(0.1)
except KeyboardInterrupt:
pass
GPIO.cleanup()
8. 리드스위치 동작 영상 설명
영상에서는 리드스위치 모듈 근처에 자석을 가까이 대면
LED가 켜지는 것을 볼 수 있다.
자석을 멀리하면 다시 꺼지는 것을 확인할 수 있다.
이렇게 일산화 탄소 센서와, 리드 스위치 사용법을 익혀봤다.
일산화 탄소 센서를 통해 실내의 공기질을 파악하여 창문을 개폐할 수 있고, 리드 스위치를 통해서 현재 창문이 열려있는지 닫혀있는지 개폐여부를 알 수 있을 것이다.
'졸업작품(스마트 창문)' 카테고리의 다른 글
| 리드스위치, 빗물감지 센서를 이용한 창문 개폐(스마트 창문) (0) | 2025.10.12 |
|---|---|
| 라즈베리파이 스텝모터 다루기(스마트창문) (6) | 2023.03.31 |
| 빗물감지 센서, DHT11 온습도 센서 사용하기(스마트창문) (0) | 2023.03.31 |
| 라즈베리파이(Raspberry Pi) 시작하기 (스마트창문) (0) | 2023.03.30 |