아두이노 프로젝트 2. 가정용 스마트 식물 관리 시스템

아두위키 : Arduwiki
ArduWiki (토론 | 기여)님의 2024년 5월 10일 (금) 21:11 판


개요

가정용 스마트 식물 관리 시스템

몇 가지 장치들을 활용해 가정에서 식물을 효율적으로 관리할 수 있는 가정용 스마트 식물 관리 시스템을 제작합니다.

고려사항

  • 워터 펌프 및 온습도 정보를 통한 자동 급수 기능을 추가합니다.
  • 블루투스로 연결된 어플리케이션에서 온습도 정보, 모터 작동 정보 및 음성인식을 통한 급수 기능을 지원합니다.
  • 거치 LCD에도 온습도 정보가 표시됩니다.


사용 하드웨어


회로 구성


기능 구현

#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 모듈을 활용해 블루투스로 연결됩니다.

거치용 LCD 기기까지 총 3개 기기가 연결되어야 하기 때문에 아두이노 메가의 하드웨어 시리얼 핀을 활용합니다.

어플리케이션에는 기본적으로 온습도 정보 및 모터 작동 여부가 표시됩니다.

전원 스위치

해당 프로젝트 전원은 12V 어댑터를 연결하여 활용합니다.

전원 스위치 사용을 위해 어댑터의 GND와 아두이노의 GND를 연결하고, 어댑터의 VCC는 로커 스위치를 통해 아두이노에 연결되도록 했습니다.

결과

사진

Comment

아이디어 스케치와 비슷한 형태로 간단한 케이스를 MDF로 제작하여 테스트한 모습입니다.

초록색이 보정단계 up 버튼, 노란색은 보정단계 down 버튼, 빨간색은 전원 스위치입니다.

비접촉 온도 센서는 하단부에 동그랗게 구멍을 뚫어 외부에 노출되도록 했습니다.

추신

공집사의 아두이노 프로젝트 결과물은 판매되는 제품이 아니며, 프로젝트 수준에서 간단하게 진행되었습니다.

문의 및 의뢰는 크몽 공집사로 연락주시면 감사하겠습니다.