AWS IoT 기반 스마트 식물 모니터링 시스템: 원격 관리 및 알림 자동화
필요한 부품 및 소모품
| 부품 |
수량 |
비고 |
| 아두이노 윤 (Arduino Yun) |
1 |
리눅스(OpenWrt) 탑재, WiFi 내장 |
| Seeed Grove 스타터 키트 플러스 (인텔 에디슨용) |
1 |
실드 + 온도/조도 센서 사용 |
| Grove 토양 수분 센서 |
1 |
|
| 5mm 적색 LED |
1 |
알림 표시용 |
| 저항 330Ω |
1 |
LED 전류 제한용 |
필요 도구
사용 클라우드 서비스 및 플랫폼
- AWS IoT Core (MQTT 브로커, 사물 레지스트리, 규칙 엔진)
- AWS IAM (역할/정책 관리)
- AWS DynamoDB (센서 데이터 저장)
- AWS SNS (이메일 알림 발송)
- dweet.io (간단 테스트용 대안)
- 아두이노 IDE
프로젝트 개요
휴가 중에도 집 식물 상태를 원격 모니터링하고, 수분 부족 시 자동 이메일 알림을 받아 이웃/가족에게 물 주기 요청 가능한 시스템입니다. 두 가지 데이터 경로 제공:
- dweet.io 경로: 간단 테스트용, 무료, 실시간 대시보드 제공
- AWS IoT → DynamoDB 경로: 영구 저장, 규칙 기반 알림, 확장성 우수
3D 프린팅 인클로저로 아두이노 윤, 그로브 실드, 센서를 일체형으로 구성하여 화분에 꽂아 사용.
1단계: 회로 구성 (그로브 실드 기준)
- 온도 센서 → A0
- 토양 수분 센서 → A1
- 조도 센서 → A2
- LED + 330Ω 저항 → 디지털 핀 2
2단계: 3D 프린팅 인클로저
STL 파일 3개 출력 (레이어 높이 0.3mm, 충전율 25% 이상, 약 2시간 소요). 토양 센서 프로브 부분이 화분 흙에 꽂히도록 설계.
3단계: 토양 수분 임계값 결정
전용 스케치(SoilMoistureValue) 업로드 → 건조/습윤 상태에서 아날로그 값 측정 → tooDryValue 설정 (예: 250). 이 값이 알림 트리거 기준이 됨.
4단계: dweet.io 데이터 전송 테스트
ArduinoYunDweetio.ino 업로드 → 고유 디바이스명(예: PlantMonitorSeoulKR)으로 dweet.io에 10초마다 전송. 웹에서 dweet.io/follow/디바이스명으로 확인 가능.
5~11단계: AWS CLI 설정 및 아두이노 윤 연동 (핵심)
- AWS 계정 생성 (프리 티어 권장)
- AWS CLI 설치 및 구성 (
aws configure)
- IoT Thing 생성:
aws iot create-thing --thing-name "PlantSystem"
- 인증서/키 생성:
aws iot create-keys-and-certificate --set-as-active ... (3개 PEM 파일 생성)
- IoT 정책 생성 및 인증서에 연결 (전체 권한
iot:* 허용)
- 인증서를 Thing에 연결
- PC에서 MQTT.fx로 발행/구독 테스트 (루트 CA, 인증서, 개인키 설정)
- 아두이노 윤에 AWS IoT SDK 설치:
- 깃허브에서
aws-iot-device-sdk-arduino-yun 다운로드 → 아두이노 라이브러리 폴더에 압축 해제
- 인증서 3개 파일을 윤의
/mnt/sda1/arduino/www/certs/에 업로드 (codebase_upload.sh, environment_setup.sh 실행, 약 5~10분 소요)
12~14단계: DynamoDB 테이블 및 IoT 규칙 생성
- IAM 역할
iot-actions-role 생성 (신뢰 정책: iot.amazonaws.com)
- 정책
iot-actions-policy 연결 (DynamoDB, Lambda 권한)
- DynamoDB 테이블
plantSensor 생성: 파티션 키 key, 정렬 키 timestamp, RCU/WCU=1
- IoT 규칙
plantDataToDynamoDB 생성: SQL SELECT * FROM 'topic/plantdata' → DynamoDB 액션 (해시 키: 토픽 2번째 세그먼트, 레인지 키: 타임스탬프)
- MQTT.fx로 테스트 발행 → DynamoDB 콘솔에서 레코드 확인
15단계: 아두이노 윤에서 AWS IoT로 데이터 발행
ArduinoYunAWSIoTDynamodb.ino + aws_iot_config.h (엔드포인트, Thing 이름, 인증서 경로 설정) 업로드. 10초마다 JSON 페이로드 발행:
{"temp": 23.5, "lightval": 450, "moistval": 320}
시리얼 모니터로 발행 성공/실패 로그 확인. 영구 운용 시 postingInterval 증가로 비용 절감 권장.
16단계: SNS 이메일 알림 규칙 설정
- IAM 역할에
AmazonSNSFullAccess 정책 추가
- SNS 콘솔에서 토픽
sendMail 생성 → 이메일 구독 추가 (확인 메일 클릭 필수)
- IoT 콘솔에서 규칙
EmailSend 생성:
- 속성:
moistval (아두이노 JSON 키와 일치)
- 토픽 필터:
topic/plantdata
- 조건:
moistval < 250 (3단계에서 결정한 임계값)
- 액션: SNS 푸시 알림 → 타겟
sendMail, 역할 iot-actions-role
토양 센서를 물에서 빼면 즉시 이메일 수신 확인 가능.
17단계: 최종 조립 및 설치
3D 프린트 부품 조립 (M4×40 나사/너트로 프로브 고정), 상단 커버 스냅핏, 프로브를 화분 흙에 꽂고 마이크로 USB로 전원 공급. 창가 방향 센서 향하게 배치.
소스 코드 (깃허브 또는 본문 포함)
SoilMoistureValue.ino: 임계값 결정용
ArduinoYunDweetio.ino: dweet.io 전송용
ArduinoYunAWSIoTDynamodb.ino: AWS IoT → DynamoDB 전송용
aws_iot_config.h: AWS 엔드포인트/인증서 설정 (IDE 새 탭으로 추가)
참고 사항
- AWS 프리 티어 범위 내 운용 권장 (IoT 메시지 월 25만 건, DynamoDB 25GB 무료)
- 영구 설치 시 전송 간격 늘리기 (예: 1시간)로 비용 최소화
- 아두이노 윤 단종 시 ESP32/ESP8266 + AWS IoT Device SDK로 마이그레이션 가능