아두이노 프로젝트 2. 가정용 스마트 식물 관리 시스템
개요
가정용 스마트 식물 관리 시스템
몇 가지 장치들을 활용해 가정에서 식물을 효율적으로 관리할 수 있는 가정용 스마트 식물 관리 시스템을 제작합니다.
고려사항
- 워터 펌프 및 온습도 정보를 통한 자동 급수 기능을 추가합니다.
- 블루투스로 연결된 어플리케이션에서 온습도 정보, 모터 작동 정보 및 음성인식을 통한 급수 기능을 지원합니다.
- 거치 LCD에도 온습도 정보가 표시됩니다.
사용 하드웨어
- 아두이노 메가
- 브레드보드 (400홀)
- 아두이노 워터 펌프
- L298N 모터 드라이버
- AA 배터리 케이스
- HC-06 블루투스 모듈
- 온습도 센서(DHT11)
- 점퍼 케이블
- 거치용 (1), 사용자용 (1) 안드로이드 기기
회로 구성
기능 구현
#include <DHT.h>
// 사용 핀번호
const int dht_pin = 2;
const int ENB = 7; //(IN3 = +, IN4 = -)
DHT dht(dht_pin, DHT11);
unsigned long past = 0;
unsigned long past2 = 0;
const unsigned long interval = 500; // 설정 시간때마다 스마트폰으로 현재 습도 및 온도 전송[ms]
int waterState = 0;
int hum = 0;
int temp = 0;
// 사용자 조정 필요 변수
int hum_criticalPoint = 25; // [*]습도 센싱 경계값(본 값보다 측정된 값이 낮을 시 워터펌프 작동)
const unsigned long waterdly = 500; // [*]워터펌프 on 시간(앱에서 눌렀을 때)
void waterOnOff(bool onOff, int val = 0) {
if (onOff == 0) { //off
digitalWrite(ENB, LOW);
Serial3.write(-10); //거치 스마트폰 전송 구분자
Serial3.write(0); //모터상태 전송
waterState = 0;
} else if (onOff == 1) { //on
digitalWrite(ENB, HIGH);
Serial3.write(-10); //거치 스마트폰 전송 구분자
Serial3.write(10); //모터상태 전송
waterState = 1;
}
if (val != 0) {
waterState = val;
}
}
int dhtfunc(char choice) {
int hh = (int)dht.readHumidity(); // 슴도
int tt = (int)dht.readTemperature(); // 섭씨 온도
if (isnan(hh) || isnan(tt)) {
Serial.println("Failed to read from DHT sensor!");
waterOnOff(0);
return -1;
}
switch (choice) {
case 'h':
return hh;
break;
case 't':
return tt;
break;
default:
break;
}
}
void setup() {
dht.begin();
pinMode(ENB, OUTPUT);
digitalWrite(ENB, LOW);
Serial.begin(9600);
Serial.println("strat");
Serial1.begin(9600); // 사용자 스마트폰
Serial3.begin(9600); // 거치된 스마트폰
}
unsigned long ppast = 0;
void loop() {
hum = dhtfunc('h');
temp = dhtfunc('t');
if (millis() - past2 > waterdly && waterState == 3) {
waterOnOff(0);
}
if (Serial1.available()) { // 사용자 스마트폰 수신 파트
int dump = Serial1.read();
waterOnOff(1, 3);
past2 = millis();
}
// 습도 기준 워터펌프 작동 부분
if (hum == -1 || temp == -1) {
// 사용자 스마트폰 전송
Serial1.write(-1); // 전송 시작 구분자
Serial1.write(-99); // 습도 전송
Serial1.write(-99); // 섭씨 온도 전송
// 거치 스마트폰 전송
Serial3.write(-1); // 전송 시작 구분자
Serial3.write(-99); // 습도 전송
Serial3.write(-99); // 섭씨 온도 전송
if (waterState == 0) { // 모터 상태 전송
Serial3.write(-10);
Serial3.write(0);
} else {
Serial3.write(-10);
Serial3.write(10);
}
past = millis();
} else {
if (hum < hum_criticalPoint && waterState == 0) waterOnOff(1);
if (hum > hum_criticalPoint && waterState == 1) waterOnOff(0);
}
// 스마트폰 통신 부분
if ((millis() - past) >= interval) { // 스마트폰으로 현재 습도 및 온도 전송(interval 마다 반복)
// 사용자 스마트폰 전송
Serial1.write(-1); // 전송 시작 구분자
Serial1.write(hum); // 습도 전송
Serial1.write(temp); // 섭씨 온도 전송
// 거치 스마트폰 전송
Serial3.write(-1); // 전송 시작 구분자
Serial3.write(hum); // 습도 전송
Serial3.write(temp); // 섭씨 온도 전송
if (waterState == 0) { // 모터 상태 전송
Serial3.write(-10);
Serial3.write(0);
} else {
Serial3.write(-10);
Serial3.write(10);
}
past = millis();
}
delay(5);
}
자동 급수 기능
DHT11 온습도 센서를 활용해 온습도 정보를 받고, 이 값을 기준으로 워터 펌프의 작동 여부를 판단합니다.
워터 펌프 작동 여부가 어플리케이션과 거치용 디스플레이에 표시되어야 하기 때문에 해당하는 신호를 보내줍니다.
펌프가 가동되면 물이 미리 연결된 관을 타고 식물로 이동합니다.
거치용 디스플레이
거치용 디스플레이는 안드로이드 기기를 활용하며 아두이노와는 HC-06 모듈을 활용해 블루투스로 연결됩니다.
아두이노 코드에는 거치용 디스플레이로 데이터를 전송하는 코드가 포함됩니다.
블루투스로 전달받은 온도, 습도, 모터 작동 여부를 표시하는 어플리케이션을 앱 인벤터를 활용하여 간단하게 제작했습니다.
사용자용 기기
사용자용 기기 역시 안드로이드 기기를 활용하며 아두이노와는 HC-06 모듈을 활용해 블루투스로 연결됩니다.
아두이노 코드에 사용자용 기기로 데이터를 전송하는 코드가 포함됩니다.
사용자 기기용 어플리케이션을 앱 인벤터를 활용하여 제작했습니다.
어플리케이션에는 온습도 표시, 모터 가동 버튼, 음성인식(급수, 온습도 확인) 기능이 포함됩니다.
결과
사진
Comment
완성된 시스템을 실제 화분에 설치한 모습입니다.
화분 토양에 설치된 온습도 센서 데이터는 거치용 디스플레이와 사용자 기기로 전송됩니다.
수동 모터 작동(버튼, 음성인식) 혹은 습도 기준 미달 시 워터 펌프가 가동되어 통 안의 물이 흐르게 됩니다.
추신
공집사의 아두이노 프로젝트 결과물은 판매되는 제품이 아니며, 프로젝트 수준에서 간단하게 진행되었습니다.
문의 및 의뢰는 크몽 공집사로 연락주시면 감사하겠습니다.