워터파이(WaterPi): 화분 원격 급수·모니터링 지능형 시스템
필요한 부품 및 소모품
| 부품 |
수량 |
| 라즈베리 파이 1 모델 B |
1 |
| 아두이노 우노 |
1 |
| DHT11 온습도 센서 (4핀) |
1 |
| YL-69 토양 수분 센서 |
1 |
| 수위 센서 |
1 |
| 캐릭터 LCD 16x2 |
1 |
| 워터 펌프 모터 |
1 |
| 5V 릴레이 |
1 |
| AA 배터리 홀더 4구 |
1 |
앱 및 온라인 서비스
- AWS IoT Core
- AWS DynamoDB
- Johnny-Five (Node.js 로봇/IO 라이브러리)
프로젝트 소개
소개
집에서 식물을 키우고 싶지만 바쁜 일상 탓에 관리가 어려운 사람들을 위한 시스템입니다. 식물 키우기는 매일 물 주기 등 정기적인 관리가 필요한데, 깜빡하거나 출장이 잦으면 식물을 포기하게 됩니다. WaterPi은 이런 정기 작업을 자동화하고, 원격 제어도 가능하게 해줍니다.
시스템은 온도, 습도, 토양 수분을 모니터링하고, 원격으로 급수하며, 모든 데이터를 AWS IoT → DynamoDB로 저장합니다. 수집된 데이터는 다양한 차트로 시각화해 식물이 잘 자라는 조건을 이해하는 데 도움을 줍니다.
라즈베리 파이에서 Node.js 애플리케이션(Johnny-Five 라이브러리 사용)으로 센서와 펌프를 제어하고, AWS IoT SDK로 클라우드와 통신합니다.
1단계: DynamoDB 테이블 생성
- 테이블명: waterpi_sensor_data
- 파티션 키: key (String)
- 정렬 키 추가: timestamp (String)
2단계: AWS IoT 설정
- Thing 생성: 이름 raspi-water-pump
- 정책 생성: 이름 pump-policy, Action iot:*, Resource *, Allow
- 인증서 생성 (1-Click): 퍼블릭 키, 프라이빗 키, 인증서 다운로드
- 인증서 활성화 → 정책 연결(pump-policy) → Thing 연결(raspi-water-pump)
- 규칙 생성:
- 이름: saveToDynamoDB
- 속성: *
- 토픽 필터: sensor/data
- 액션: 'DynamoDB 테이블에 메시지 삽입'
- 테이블: waterpi_sensor_data
- 해시 키: ${topic()}, 레인지 키: ${timestamp()}
- 역할: 새 역할 생성 후 허용
3단계: 아두이노 준비 (아날로그 센서 중계용)
토양 수분 센서와 수위 센서는 아날로그 출력이라 라즈베리 파이 GPIO에 직접 연결할 수 없습니다. 아두이노가 아날로그 값을 읽어 디지털(펌웨어 표준 Firmata)로 파이에 전송하는 중계 역할을 합니다.
- 아두이노 IDE에서 File > Examples > Firmata > StandardFirmata 열기 → 업로드.
- 배선:
- 토양 수분 센서: VCC→핀 7, GND→GND, AO→A1
- 수위 센서: +→핀 4, -→GND, S→A0
- 아두이노를 USB로 라즈베리 파이에 연결. 센서들을 화분과 물탱크에 설치.
4단계: 라즈베리 파이 배선
- DHT11: S→GPIO4(핀 7), +→3V3(핀 1), -→GND(핀 25)
- LCD 16x2 (I2C): VCC→5V(핀 2), GND→GND(핀 6), SDA→GPIO2(핀 3), SCL→GPIO3(핀 5)
- 릴레이(펌프 제어): S→GPIO18(핀 12), +→5V(핀 4), -→GND(핀 20)
- 펌프+배터리+릴레이: 펌프 한 선은 릴레이, 다른 선은 배터리 팩과 직렬 연결. 배터리 팩 다른 선도 릴레이에 연결 (회로도 참조).
5단계: 라즈베리 파이에서 Node.js 앱 실행
git clone git@github.com:demirhanaydin/waterpi-node.git
cd waterpi-node
npm install
AWS IoT에서 다운로드한 퍼블릭 키, 프라이빗 키, 인증서, 루트 CA 인증서(rootCA.pem)를 certs 폴더에 넣습니다.
device.js를 열어 파일 경로와 IOT_DEVICE_URL (예: https://xxxxxxx.iot.us-east-1.amazonaws.com)을 수정합니다.
sudo node index.js
정상이면 LCD에 센서 값이 20초마다 갱신되어 표시되고, DynamoDB 테이블에도 데이터가 쌓입니다.
6단계: 웹 애플리케이션 실행 (원격 제어·시각화)
Sinatra(루비) 기반 웹앱으로 DynamoDB 데이터를 Highcharts로 시각화하고, 펌프 원격 제어(시작/정지 버튼 → AWS IoT 퍼블리시 → 라즈베리 파이 수신 → 펌프 제어) 기능을 제공합니다.
git clone git@github.com:demirhanaydin/waterpi-web.git
cd waterpi-web
bundle install
certs 폴더에 인증서 파일들을 넣고 boot.rb에 AWS 액세스 키/시크릿 등 자격 증명 입력.
ruby app.rb
브라우저에서 https://localhost:4567/ 접속 → 센서 데이터 차트 확인. 'Start' 버튼으로 원격 급수 가능.
코드
라즈베리 파이 Node.js 소스
github.com/demirhanaydin/waterpi-node – 복제 후 certs 폴더에 인증서 배치, device.js에 IoT 엔드포인트 설정.
WaterPi 웹 클라이언트
github.com/demirhanaydin/waterpi-web – boot.rb에 자격 증명 설정 후 실행.
회로도
- 라즈베리 파이 배선도 (카메라 제외 버전)
- 아두이노 배선도 (Fritzing 파일 제공)