아두이노 우노 & 라즈베리 파이로 만드는 스마트 자동 정원 시스템
부품 및 소모품
| 아두이노 우노 |
× |
1 |
| 라즈베리 파이 2 모델 B |
× |
1 |
| 라즈베리 파이 카메라 모듈 |
× |
1 |
| 아두이노 이더넷 실드 2 |
× |
1 |
| 릴레이 (일반) |
× |
1 |
| 오픈빌드 와이어 케이블 (피트 단위) |
× |
1 |
| 포토레지스터 (조도 센서) |
× |
1 |
| 워터 펌프 (일반) |
× |
1 |
| 팬 (일반) - 오래된 컴퓨터 팬 사용 |
× |
1 |
| 범용 NPN 트랜지스터 |
× |
1 |
| 마이크로SD 카드 (일반) - 16GB, 타임랩스용 |
× |
1 |
앱 및 온라인 서비스
| 아두이노 IDE |
| 라즈베리 파이 라즈비안 |
| Win32DiskImager |
| PuTTY |
| myDevices Cayenne |
프로젝트 소개
자동 정원을 이용한 두 번째 프로젝트인데, 이번에는 모든 걸 Cayenne으로 제어해서 훨씬 쉽습니다. 라즈베리 파이도 추가해 타임랩스 영상도 찍습니다.
아두이노 설정
정원을 모니터링하기 위해 몇 가지 장치를 사용했습니다. 시작하기 전에 이더넷 실드를 아두이노에 연결해야 합니다.
연결
토양 수분: 식물에 물이 필요한지 확인.
팬: 너무 더우면 작동하거나 신선한 공기 공급용.
- 한 선은 저항에서 핀 3으로 - 팬의 GND는 트랜지스터 중간 핀에.
- 팬의 +는 릴레이(중간 핀)에. 트랜지스터 마지막 핀은 GND에.
- 다이오드는 트랜지스터 중간 핀과 GND에 연결.
워터 펌프: 토양 수분에 따라 작동.
- +는 릴레이 중간 핀에, GND는 전원 소스 GND에.
포토레지스터 (선택): 실내 조도가 충분한지 측정.
- 한쪽은 저항과 함께 A0에 연결, 다른 쪽은 5V에.
조명:
- 애노드(+)는 릴레이에, 다른 쪽은 전원 공급 장치 GND에.
습도/온도 센서: Cayenne과 제대로 작동하려면 코드가 필요.
- VCC: 3.3V
- GND: GND
- DAT: 디지털 핀 8
수위 센서:
최종 장착
프리칭에 4채널 릴레이가 없어서 릴레이 2개를 그래픽에 썼습니다. 릴레이엔 12V 전원 하나만 썼습니다. 양극과 음극 선을 분리하고 양극에서 선 3개를 납땜해 릴레이 각 부분에 연결했습니다. 모든 게 동시에 켜지지 않으니 하나면 충분합니다.
아두이노용 5V 전원 공급 장치 사용. 릴레이:
- VCC: 5V
- GND: GND
- IN1: 핀 2 - 조명 켜기
- IN2: 핀 5 - 워터 펌프 켜기
- IN3: 없음
- IN4: 핀 4 - 팬 켜기
Cayenne 설정
Cayenne 설정 방법을 볼 텐데 매우 쉽습니다.
- 먼저 여기서 계정 생성.
- 이더넷 실드에 RJ45 케이블 연결.
- Cayenne 연결 코드와 습도/온도 센서 설정 코드입니다.
이 코드는 W5100 실드용이며, 다른 이더넷/와이파이 실드용 코드는 Cayenne에 있습니다. 계정 생성 후 받는 토큰도 추가하세요.
#include "DHT.h"
//#define CAYENNE_DEBUG // 디버그 메시지 보려면 주석 해제
#define CAYENNE_PRINT Serial // 프린트 비활성화하려면 주석 처리, 공간 절약
#include
#define DHTPIN 8 // 연결된 디지털 핀
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
#define VIRT_TEMP V1
#define VIRT_HUM V2
// Cayenne 인증 토큰. Cayenne 대시보드에서 얻어야 함.
char token[] = "your_token";
DHT dht(DHTPIN, DHTTYPE);
unsigned long prev_DHT_refresh, interval_DHT_refresh = 1000;
void setup() {
Serial.begin(9600);
Cayenne.begin(token);
dht.begin();
}
void loop() {
Cayenne.run();
getDhtValues();
}
void getDhtValues() {
unsigned long now = millis();
if (now - prev_DHT_refresh > interval_DHT_refresh) {
// 온습도 읽는 데 약 250ms 걸림! 센서 읽기는 최대 2초까지 '오래된' 값일 수 있음(매우 느린 센서)
float h = dht.readHumidity();
float t = dht.readTemperature(); // 섭씨 온도 (기본값)
// 읽기 실패 체크
if (!isnan(h) && !isnan(t)) {
Cayenne.virtualWrite(VIRT_HUM, h);
Cayenne.celsiusWrite(VIRT_TEMP, t);
}
prev_DHT_refresh = now;
}
}
Cayenne의 장치들
아두이노 쪽은 거의 끝났습니다. 이제 쉬운 부분: Cayenne에 모든 장치 추가하기.
장치 추가 → 커스텀 위젯
원하는 위젯 종류 선택. 습도와 수위엔 차트, 나머지는 값 위젯을 썼습니다. 습도/온도 센서는 가상 핀 사용:
다른 장치는 가상 핀 대신 연결된 핀의 아날로그 선택. 액추에이터에서도 같은 절차지만 릴레이에 연결된 아두이노 핀(조명/팬/워터 펌프)을 선택.
이벤트와 트리거
대시보드 준비됐으니 트리거 설정:
- 워터 펌프: 토양 수분이 너무 건조하면 펌프 켜기. 시작/정지용 트리거 2개 사용.
- 수위: 값이 높으면 물 부족. 이메일 알림 받기.
- 이벤트: 아침에 조명 켜기, 저녁에 끄기, 팬 켜기/끄기용 4개 이벤트 설정.
라즈베리 파이 설정
식물 자라는 타임랩스 찍기.
필요한 소프트웨어 3가지:
- 라즈비안
- Win32DiskImager (SD 카드에 이미지 굽기)
- PuTTY (라즈베리 파이 원격 접속)
Win32 Disk Imager:
다운로드 후 설치. 열기:
- "장치"가 보임. 기본값이 보통 맞음 (SD 카드만 연결된 경우)
- 파란 폴더 아이콘 클릭해 다운로드한 라즈비안 제시 이미지 선택
- "쓰기" 클릭하면 끝. 카드를 라즈베리 파이에 꽂으세요.
PuTTY: SSH로 접속 가능. PuTTY 열기 (설치 불필요).
- 인터넷 케이블을 라즈베리 파이에 연결
- 라즈베리 파이 2의 IP 찾기 - 쉬운 방법: 공유기 관리 페이지 접속해 기기와 IP 확인
- 터치스크린/키보드 연결해 터미널에서
ifconfig 실행. PuTTY에 IP 주소 입력 (예: 192.168.0.3) 후 엔터.
- 신뢰 묻으면 예 클릭.
- 로그인:
pi, 비밀번호: raspberry. 창은 두고 나중에 다시 옵니다.
라즈베리 파이 실행됐으니 업데이트 몇 가지 필요. PuTTY에 복사 붙여넣기:
sudo apt-get update
sudo apt-get upgrade
VNC:
라즈베리 파이에 연결할 화면 없으면 VNC로 원격 제어.
sudo apt-get install tightvncserver
서버 시작:
vncserver :1
컴퓨터에 VNC 뷰어 다운로드해 접속. IP와 서버 번호 입력. 예: 192.168.0.3:1
Cayenne: Cayenne으로도 라즈베리 파이 원격 제어 가능. 설치만 하면 됨:
wget https://cayenne.mydevices.com/dl/rpi_03wl1tt4nt.sh
sudo bash rpi_03wl1tt4nt.sh -v
타임랩스
마지막 단계! 카메라 활성화하려면 PuTTY나 터미널에 붙여넣기:
sudo raspi-config
카메라 활성화로 이동. 사진 저장할 폴더 생성:
cd /home/pi/Desktop
mkdir timelapse
웹캠 연결 후 매시간 사진 찍는 스크립트 생성:
cd /home/pi/Desktop
nano timelapse.sh
다음 내용 붙여넣기:
SAVEDIR=/home/pi/Desktop/timelapse/
while [ true ]; do
filename=-$(date -u +"%d%m%Y_%H%M-%S").jpg
/opt/vc/bin/raspistill -o $SAVEDIR/$filename
sleep 3600;
done;
스크립트 실행 가능하게 만들기:
chmod +x timelapse.sh
결론
튜토리얼이 길지만 매우 쉽습니다. 연결하고 설정할 장치가 몇 개뿐이니까요. 사진엔 선이 너무 길어 엉망입니다. 식물 다 자라면 타임랩스 결과 올리겠습니다.
조언:
이더넷 실드가 DHCP 실패 에러를 낼 수 있습니다. 연결 시도 중 아두이노 포럼에서 해결책 찾음: 100옴 저항 2개를 아무 데나 납땜해서 독자들을 괴롭히면 됩니다. (역자 주: 원문은 유머러스한 표현으로, 실제로는 풀업/풀다운 저항 추가 등 적절한 하드웨어 수정 필요)