스마트 가드닝(Smart Gardening)

by 조혜인 | 2017-03-02 18:09
arduino gardening iot smart thingspeak 가드닝 수분 스마트 아두이노 텃밭 화분

재료

  • NPN 트랜지스터 (해외) 1개 (40원)
  • 리튬배터리 충전 모듈 (국내) 1개 (2200원)
  • Node-MCU (국내) 1개 (8800원)
  • 솔레노이드 벨브 1/4" 12V (국내) 1개 (8300원)
  • 토양수분센서 (해외) 1개 (3000원)
  • 충전용 3.7V 리튬배터리 1개 (3750원)
  • 리튬배터리 충전 모듈 (해외) 1개
  • Node-MCU (해외) 1개 (4000원)
  • NPN 트랜지스터 (국내) 1개 (550원)
  • 충전용 3.7V 리튬배터리 1개 (6000원)
  • 솔레노이드 벨브 1/4" 12V (국내) 1개
  • 토양수분센서 (국내) 1개 (5500원)

스마트 가드닝을 아두이노로 개발해서 실제로 이용하고 있는 사례를 발견했습니다(Smart Gardening, Instructables). 일단 이 사례를 살펴보고, 커스터마이징 해 보려고 합니다. 소스코드를 완성하고, Enclosure 박스를 만들면 저만의 스마트 가드닝 키트를 만들 수 있을 것 같습니다. 

이 프로젝트에서는 토양 수분 센서를 사용하여 수분 값을  ThingSpeak 채널에 전송합니다. 다른 모듈은 MQTT 서버에서 데이터를 읽습니다. 이후 솔레노이드 밸브를 켜서 PVC 파이프를 통해 식물에 연결된 호스로 물을 뿌립니다.

이 프로젝트는 전체소스코드를 제공하지 않습니다. (ThingSpeack, MQTT, Node-MCU간 통신 예제코드만 제공)


1. 준비물

Node-MCU
토양수분센서
트랜지스터
3.7V 충전용 리튬배터리
리튬-이온 충전 모듈
솔레노이드 벨브





2. 만드는 과정

SETP 1. 회로도

수분센서와 솔레노이드 벨브를 연결한 회로 입니다.

78XX : 수분센서

V1 12V : 솔레노이드 벨브



STEP 2. 소스코드 Logic

1. 수분센서 데이터를 ThingSpeack으로 보냅니다. Node-MCU의 WiFi 통신을 이용합니다.

2. 수분센서값을 바탕으로 solenoid valve를 On/Off 해서 물을 공급합니다.

3. 배터리나, 전원공급이 없을 때 '0' 을 전송합니다. 이 경우에 물이 공급되지 않도록 해야 합니다.

4. 또 다른 Node-MCU를 이용해, 솔레노이드 벨브를 제어합니다.

5. 트랜지스터로 전압을 증폭시켜줍니다. solenoid valve는 12V에서 작동하기 때문입니다.

6. MQTT 서버에서 '1'을 Node-MCU로 전송하면, 30초간 솔레노이드 벨브를 작동시키게 됩니다.

7. 솔레노이드의 작동 상태도 ThingSpeak 채널로 보내집니다.




STEP 3. 소스코드

소스코드가 제공되지는 않지만, Thingspeak에서 MQTT방식을 사용하는 NodeMCU WiFi 통신예제가 있어서 소개해 드립니다. 

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char* ssid = "";
const char* password = "";

//const char* mqtt_server = "test.mosquitto.org";
//const char* mqtt_server = "iot.eclipse.org";
const char* mqtt_server = "broker.mqtt-dashboard.com";

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  
  pinMode(4,OUTPUT);
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  reconnect();
}

void setup_wifi(){

  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  
  if((char)payload[0] == 'o' && (char)payload[1] == 'n') //on
    digitalWrite(4,HIGH);
  else if((char)payload[0] == 'o' && (char)payload[1] == 'f' && (char)payload[2] == 'f') //off
    digitalWrite(4,LOW);
    
  Serial.println();
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("ESP8266Client")) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.publish("ESP8266/connection status", "Connected!");
      // ... and resubscribe
      client.subscribe("ESP8266/LED status");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void loop() {
 
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
}


 


3. 설치된 모습

실제로 화분에 이용된 모습입니다. 호스를 쭉 연결해서 화분마다 연결해 두었습니다.

간단해 보이는데 멋지네요.


댓글 0

MADE BY

조혜인

arduino, processing, rhino, sketchup, 아두이노, 에프터이펙트, 포토샵, 프리미어
스마트 가드닝 프로젝트 구상 다음글 스마트 가드닝(Smart Gardening)현재글