수분센서로 화분의 함습량을 체크하여 자동으로 물도 주고  data를 인터넷에 기록하는 프로젝트를 진행했습니다. Data는 ThingSpeak라는 사이트에 기록했고, ThingSpeak에 Data를 주고 받는 방법에 대해서는 링크에서 확인하실 수 있습니다.


1. 토양 수분 센서의 원리

  

수분센서(정확히는 토양수분센서)는 화분에 꽂아서 토양의 수분이 어느정도인지 측정하는 센서입니다.
물이 전기를 흘려주는 성질을 이용해 화분의 수분함량이 많으면 전류가 잘 흐르게 되고, 수분함량이 적으면 전류가 잘 흐르지 않게 됩니다. 이 방법으로 화분 내 함습량을 알 수 있습니다.

 

수분센서에 대해 조금 더 궁금해 하실 분들을 위해 수분센서의 회로도를 가져왔습니다.


SASB는 수분센서의 탐침이구요, SA에서 전류를 흘려 SB로 흘러 들어 갑니다. 그 사이에 있는 토양의 상태에 따라 전류의 값은 변하게 되고, 전류가 작기 때문에 트랜지스터로 한번 증폭시켜서 그 전압 값을 센싱하게 되는 원리입니다. (측정되는 전압은 V = Ie * R2 인 것 같습니다. 근데 궁금한 점이 Vcc 5v라 가정하고 R2에 걸리는 전압이 3v라고 한다면 2v는 어디로 가는 것인가요..? 아시는 분 혹시 계신가요..?)

 

,

토양에 수분이 많음 -> 저항이 낮음 -> 전류 증가 -> 측정값이 높음

토양에 수분이 적음 -> 저항이 높음 -> 전류 감소 -> 측정값이 낮음

이렇게 정리해서 프로젝트를 진행하면 될 것 같습니다.

 


2. 인터넷으로 화분의 상태 확인하기


-. 회로


기본적으로 수분센서는 전압을 걸어 두면 계속 전류를 흘립니다. 전류가 계속 흐르게 되면 식물의 성장을 방해할 뿐만 아니라 탐침에 부식도 생깁니다.

그래서 측정할 때만 전류를 흘려 주기 위해 D1핀과 연결하여 테스트를 해봤습니다. 3.3v를 연결했을 때와 값의 차이가 거의 없어서 3.3V가 아닌 D1에 연결하여 프로젝트 진행했습니다.

하지만 센서에 전압을 인가하고 바로 측정하게 되면 정확한 값이 측정되지 않기 때문에 코드에서 3초정도의 딜레이를 주는 것이 좋습니다.



-. 코드

1. 일정 간격마다 함습량을 체크하여 ThingSpeak로 전송

2. 함습량이 일정한 값 이하이면 모터를 작동시켜 물 공급

3. 물 공급 30초 이후에 다시 함습량을 체크하여 일정 값 이상이면 더 이상 물 공급하지 않음

4. 최대 3회까지 물을 공급하고 그래도 함습량이 낮으면 문제가 발생한 것으로 간주(ex. 물통에 물이 없음)

5. 문제가 발생하면 LEDON되고 버튼을 누르기 전까지 함습량이 낮더라도 모터는 작동하지 않음

// include ThingSpeak and ESP8266 WiFi Libraries
#include "ThingSpeak.h"
#include <ESP8266WiFi.h>

#define SOIL A0
#define SENSOR_VCC D1
#define BUTTON D3
#define LED D5
#define PUMP D7
#define READ_INTERVAL 900000 //1800000 : 30분, 300000 : 5분
// #define AUTO_STOP_INTERVAL 1500
#define HUMIDITY_DRY 250
#define HUMIDITY_HUMID 600
unsigned long prevReadTime = 0;
int ValveFlag = 0;
int humi = 0;
int count = 0;
int no_water = 0;
int rst = 0;

char ssid[] = " your network SSID "; // your network SSID (name)
char pass[] = " your network password "; // your network password

int status = WL_IDLE_STATUS;
WiFiClient client;

unsigned long myChannelNumber = 000000;
const char * myWriteAPIKey = "Your Write APIKey";

void sensing();

void setup() {
WiFi.begin(ssid, pass);
ThingSpeak.begin(client);
pinMode(PUMP, OUTPUT);
digitalWrite(PUMP, LOW);
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
pinMode(BUTTON, INPUT_PULLUP);
Serial.begin(9600);
pinMode(SENSOR_VCC, OUTPUT);
digitalWrite(SENSOR_VCC, HIGH);
sensing();
}

void loop() {
rst = digitalRead(BUTTON);
if(!rst){ //리셋버튼이 눌리면 LED OFF
no_water = 0;
ValveFlag=0;
count=0;
digitalWrite(LED, LOW);
}

if(millis() - prevReadTime > READ_INTERVAL) { //일정 시간마다 센싱해서 ThingSpeak에 data 전송
prevReadTime = millis();
sensing();

if(humi< HUMIDITY_DRY){ //설정 값보다 낮으면 펌프 ON, OFF후 30초간 대기
ValveFlag=1;

Serial.print("HUMID : ");
Serial.print(humi);
Serial.print(" < ");
Serial.println(HUMIDITY_DRY);
}

while(ValveFlag == 1 && no_water == 0) { // flag 값이 0이 될 때 까지 30초 간격으로 3초간 PUMP ON
count++;
digitalWrite(PUMP, HIGH);
Serial.println("ON");
delay(3000);
digitalWrite(PUMP, LOW);
Serial.println("OFF");
delay(30000);
sensing();


Serial.println(count);

if(humi > HUMIDITY_HUMID){ // 수분센싱한 값이 일정 값 이상이면 물 공급 정지
ValveFlag=0;
count = 0;
Serial.println("FLAG = 0");
break;
}

if(count > 2){ // 3회 이상 PUMP가 ON 됐는데도 센싱값이 낮으면 물이 없거나 문제가 발생한 것으로 간주
digitalWrite(LED, HIGH);
no_water = 1;

Serial.println("no_water = 1");
}

}
}
}

void sensing(){
digitalWrite(SENSOR_VCC, HIGH); //센서 ON
delay(3000);
humi = analogRead(SOIL);
ThingSpeak.writeField(myChannelNumber, 1, humi, myWriteAPIKey);
digitalWrite(SENSOR_VCC, LOW); //센서 OFF
Serial.println(humi);
}












































































































 ※ 코드 작성 시 주의할 점


위 사진에 네모박스 쳐놓은 D5번핀을 사용하고 싶으시다면  [ #define LED D5 ] 꼭 이렇게 선언해 주셔야 합니다.  [ #define LED 5 ] 로 선언하게 되면 GPIO5번핀으로 인식해서 D1번핀을 사용하는 셈이 되어버립니다.



-. 측정 Data


지난 밤 동안 15분 간격으로 측정한 데이터 입니다.

시간이 흐름에 따라 값이 작아지다가 6시 12분 경에 갑자기 값이 올라간 모습입니다.

오늘 일출 시간이 6시 였는데 빛이나 온도랑 측정되는 값 사이에 관계가 있는 것인지, 아니면 단순히 우연의 일치인지 조금 더 확인해 봐야할 것 같네요.


 -.문제점

아두이노 우노에서는 작동이 잘되던 모터펌프가 NodeMCU에서는 작동이 잘 안되더라구요

그래서 확인해보니까 우노는 출력 핀에서 대략 40mA를 출력하는 반면에 NodeMCU에서는 12~14mA 밖에 출력을 못한다고 하더라구요.....

 그래서 모터에 충분한 전류를 흘려주지를 못해서 모터는 작동이 안되는 상태입니다.

전류를 적게 소모하는 모터를 사두기는 했는데 해외배송이라 언제 도착할지 몰라서 일단 트랜지스터 2개를 써서 베이스에 입력되는 전류를 좀 더 키우는 방법을 알아봐야 될 것 같네요.

댓글 0

인터넷으로 화분의 상태 확인하기현재글 물 공급 기능 테스트 이전글