라즈베리파이와 웹 대시보드로 만드는 자동 식물 급수 시스템
토양 수분을 모니터링하고 실내 식물에 자동으로 물을 주는 자가 급수 시스템을 웹 인터페이스에서 제어할 수 있도록 구축합니다.
개요
이 가이드는 구성 요소 선택부터 배선, 코딩, Flask 웹 대시보드 실행까지 모든 단계를 안내합니다. 결과적으로 라즈베리파이에서 실행되는 신뢰할 수 있고 유지보수가 적은 급수 솔루션을 얻게 됩니다.
준비물
- 라즈베리파이 3 (파이 2/4도 약간의 핀 변경으로 작동 가능)
- 토양 수분 센서 (아날로그 출력)
- 5V 릴레이 모듈 (단일 채널)
- 3~6V 미니 잠수펌프 (≤ 200 mL/min)
- 유연한 물 호스 (1인치 이하)
- 듀폰 점퍼 와이어 (다색 세트, 120개)
- 5V 전원 공급장치 (USB 케이블 + 벽면 충전기 또는 5V 어댑터)
- 선택 사항: 센서 보정용 소형 포텐셔미터
전원 설정
USB 케이블을 5V 소스로 사용합니다. 케이블을 벗겨 빨간색(+)과 검은색(-) 도선에 더 굵은 와이어를 납땜하고 5V 벽면 충전기에 연결합니다. 라즈베리파이 연결 전 멀티미터로 전압을 확인하세요.
GPIO 배선 (파이 3)
- 토양 센서: 양극 → 핀 2(5V), 음극 → 핀 6(GND), 신호(노랑) → 핀 8(GPIO 14)
- 릴레이: IN 핀 → 핀 7(GPIO 4), VCC → 핀 2, GND → 핀 5
- 펌프: 펌프 전원을 릴레이의 상시 개방(NO) 접점에 연결, 그라운드를 공통(COM) 접점에 연결. 라즈베리파이가 핀 1(GPIO 5)을 LOW로 당기면 릴레이가 닫혀 펌프 작동.
호스를 펌프 출구에 연결하고 다른 끝을 식물 흙 근처에 위치시킵니다. 호스 저수조에 물을 채우세요.
하드웨어 조립
전기 테이프로 호스를 펌프에 고정해 누수를 방지하세요. 모든 연결을 절연하고 라즈베리파이 전원을 펌프 전원과 분리해 전기적 노이즈를 피하세요.
소프트웨어 개요
프로젝트는 네 개의 파이썬 스크립트와 Flask 웹 인터페이스로 구성됩니다:
- water.py – 센서 읽기 및 펌프 제어를 위한 GPIO 추상화.
- auto_water.py – 예약 급수 로직.
- web_plants.py – 센서 상태와 수동 제어를 노출하는 Flask 앱.
- main.html – 심플한 대시보드 템플릿.
의존성 설치
라즈베리파이에서 다음 실행:
$ python3 -m pip install RPi.GPIO flask psutil
GPIO 제어 스크립트 (water.py)
스크립트는 두 가지 핵심 함수를 노출합니다: get_status()는 젖음/건조 문자열을 반환하고, pump_on()은 펌프를 1초간 작동시킵니다. 대화형 테스트:
$ python3
>>> import water
>>> water.get_status()
'Dry'
>>> water.pump_on()
Pump activated for 1 s.
센서가 잘못 보고하면 모듈의 소형 포텐셔미터를 조정해 흙이 젖었을 때 두 번째 LED가 켜지도록 하세요.
Flask 대시보드 실행
web_plants.py를 water.py와 같은 폴더에 두고 templates 서브디렉토리를 만들어 main.html을 넣으세요. 그런 다음 서버 시작:
$ sudo python3 web_plants.py
브라우저에서 라즈베리파이 IP 주소로 접속하면 실시간 수분 상태와 수동 "Water Now" 버튼이 있는 대시보드가 나타납니다. 이 페이지는 Flask로 구동되며 헬퍼 스크립트를 통해 GPIO 레이어와 통신합니다.
Cron으로 자동 시작 설정
재부팅 후 웹 서버가 자동 시작되도록 루트 crontab을 편집하세요:
$ sudo crontab -e
아래 줄을 추가하고 /home/pi/project를 실제 경로로 변경:
@reboot cd /home/pi/project && sudo python3 web_plants.py
라즈베리파이 재부팅 후 대시보드가 자동 로드되는지 확인하세요.
다음 단계
시스템이 작동하면 다음과 같이 확장할 수 있습니다:
- 여러 식물 모듈과 단일 대시보드.
- 수분 수준을 CSV나 데이터베이스에 로깅.
- 급수 발생 시 이메일 또는 푸시 알림.
더 깊은 학습을 위해 라즈베리파이 GPIO 튜토리얼과 Flask-GPIO 통합 가이드를 참조하세요.