본문 바로가기
졸업작품(스마트 창문)

일산화탄소 센서(MQ7 + MCP3008), 리드스위치 센서 다루기(스마트창문)

by 바위폭주 2025. 10. 11.
728x90
반응형

오늘은 지난 시간에 이어 라즈베리파이로 일산화탄소(CO) 센서(MQ-7)리드스위치 센서를 다뤄보겠다.

지난 글에서는 스텝모터를 이용해 창문을 자동으로 개폐하는 예제를 만들어봤다.
이제는 환경 감지를 위해 일산화탄소 농도를 측정하고,
자석의 유무로 문(창문)의 상태를 확인하는 방법을 알아보자.

 

1. 실험 준비물

구성품설명
라즈베리파이 4B 메인 제어 보드
MCP3008 아날로그-디지털 변환기 (ADC)
MQ-7 일산화탄소 센서 아날로그 출력형 가스 센서
리드스위치 센서 자석 감지용 센서 (디지털 출력)

2. MCP3008과 일산화탄소 센서 연결

MQ-7 센서는 아날로그 값을 출력하기 때문에
라즈베리파이처럼 디지털 입력만 가능한 보드에서는 직접 읽을 수 없다.
그래서 MCP3008이라는 8채널 10비트 ADC를 사용하여
아날로그 신호를 디지털 값으로 변환해준다.

MCP3008은 SPI 통신으로 동작하며,
라즈베리파이의 MOSI, MISO, SCLK, CE0 핀을 이용한다.

MCP3008, MQ7

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가 켜지는 것을 볼 수 있다.
자석을 멀리하면 다시 꺼지는 것을 확인할 수 있다.

 

 

이렇게 일산화 탄소 센서와, 리드 스위치 사용법을 익혀봤다.

일산화 탄소 센서를 통해 실내의 공기질을 파악하여 창문을 개폐할 수 있고, 리드 스위치를 통해서 현재 창문이 열려있는지 닫혀있는지 개폐여부를 알 수 있을 것이다.

728x90
반응형