지난 시간에는 스텝모터를 이용해서 창문을 개폐하는 예제를 만들어봤다.
리드스위치로 창문이 닫혀 있는지 열려 있는지를 감지하고,
비가 오면 닫혀 있지 않은 경우에만 자동으로 닫히도록 만드는 것이다.

이렇게 창문에 자석과 리드스위치를 부착하면 창문의 개폐여부를 알 수 있다!
회로 구성
아래 사진처럼 라즈베리파이, 모터 드라이버(L298), 스텝모터, 리드스위치, 그리고 빗물감지 센서를 브레드보드에 연결했다.

- 스텝모터 → GPIO 27, 17, 22, 18번
- 리드스위치 → GPIO 19번
- 빗물감지 센서 → GPIO 21번
- LED (상태 표시용) → GPIO 26번
- 모터 드라이버 L298 → 외부전원(12V 2A 어댑터)으로 구동
동작 원리
- 리드스위치가 자석에 닿아 있으면 → 창문이 닫혀 있는 상태
- 리드스위치가 자석에 닿지 않으면 → 창문이 열려 있는 상태
- 빗물감지 센서가 비를 감지하면
- 창문이 열려 있을 때만 스텝모터가 회전하여 창문을 닫는다.
- 만약 이미 닫혀 있다면 모터는 움직이지 않는다.
import RPi.GPIO as GPIO
import time
from gpiozero import InputDevice
a = 27 # stepper motor
b = 17 # stepper motor
c = 22 # stepper motor
d = 18 # stepper motor
open1 = 26 # blue led
reed = 19 # reed switch
no_rain = InputDevice(21)
delay = 0.005
pos = ""
def get_pos(): # 창문 개폐 상태
is_window_opened = GPIO.input(reed)
if is_window_opened: # 리드스위치에 자석이 닿지 않음 → open
pos = "open"
else: # 리드스위치에 자석이 닿음 → close
pos = "close"
return pos
def setup():
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(a, GPIO.OUT)
GPIO.setup(b, GPIO.OUT)
GPIO.setup(c, GPIO.OUT)
GPIO.setup(d, GPIO.OUT)
GPIO.setup(open1, GPIO.OUT)
GPIO.setup(reed, GPIO.IN)
def setStepper(in1, in2, in3, in4):
GPIO.output(a, in1)
GPIO.output(b, in2)
GPIO.output(c, in3)
GPIO.output(d, in4)
time.sleep(delay)
def open_window(pos):
if pos == "close":
for i in range(100): # 2바퀴 회전
setStepper(1,0,0,0)
setStepper(0,1,0,0)
setStepper(0,0,1,0)
setStepper(0,0,0,1)
time.sleep(0.03)
def close_window(pos):
if pos == "open":
for i in range(100):
setStepper(0,0,0,1)
setStepper(0,0,1,0)
setStepper(0,1,0,0)
setStepper(1,0,0,0)
time.sleep(0.03)
setup()
try:
while True:
pos = get_pos()
if not no_rain.is_active: # 비가 오면
close_window(pos)
GPIO.output(open1, GPIO.HIGH) # LED ON
else:
GPIO.output(open1, GPIO.LOW)
except KeyboardInterrupt:
pass
GPIO.cleanup()
아! 그리고 이전 글과 앞으로의 글에서 나오는 코드는.. 형편 없을 것이다. 아무것도 모르던 시절.. 그리고 GPT도 없던 시절에 작성한 코드라.. 그냥 느낌만 보면 될 듯 하다.
실험 영상
리드스위치에 자석이 닿아 있는 상태 (창문 닫힘)
→ 비가 와도 모터가 움직이지 않음
리드스위치에 자석이 닿지 않은 상태 (창문 열림)
→ 비가 오면 스텝모터가 작동하여 창문이 닫힘
💡 영상에서는 LED가 켜지며 창문이 자동으로 닫히는 걸 확인할 수 있다.
창문 제작 과정
스텝모터를 창문 위에 고정하고, 브라켓과 타이밍 벨트를 이용해 창문을 움직이게 만들었다.
전면부
창문 위쪽에 모터가 고정된 브라켓을 설치하고,
브라켓과 창문 프레임을 단단히 피스로 고정했다.

브라켓 내부
안쪽에는 풀리와 벨트를 피스로 결합해서 헐거움 없이 고정했다.

상단부
모터 축과 반대편 풀리를 타이밍 벨트로 연결해서
모터가 돌면 벨트가 당겨지며 창문이 자동으로 닫히도록 만들었다.

이렇게 창문과 스텝모터, 브라켓, 풀리, 타이밍 벨트를 연결해서 창문을 개폐할 수 있는 것을 실험하였다.
지금와서 다시 보니... 너무 허접하고 너무.. 대충 만든 느낌이다. 하지만 이 사진과 영상들은 작품 초기에 찍은 것이니.. 뒤로 갈 수록 아주 조금 괜찮아질 예정이다!
자 지금까지 빗물감지, 온습도, 일산화탄소 센서 사용법을 실험해봤고, 스텝모터, 리드스위치 사용법을 익혔다. 또 하드웨어를 연결해서 창문을 개폐할 수 있는 실험까지 진행하였다.
이제 위 내용을 기반으로 스마트 창문 프로젝트를 계속 진행할 예정이다.
'졸업작품(스마트 창문)' 카테고리의 다른 글
| 일산화탄소 센서(MQ7 + MCP3008), 리드스위치 센서 다루기(스마트창문) (0) | 2025.10.11 |
|---|---|
| 라즈베리파이 스텝모터 다루기(스마트창문) (6) | 2023.03.31 |
| 빗물감지 센서, DHT11 온습도 센서 사용하기(스마트창문) (0) | 2023.03.31 |
| 라즈베리파이(Raspberry Pi) 시작하기 (스마트창문) (0) | 2023.03.30 |