아두이노와 Processing

아두이노 ESP32 화분 수분 온습도 센싱 보드

coding art 2020. 11. 25. 16:37
728x90

HIGROW ESP32 센싱 보드 사용법에 대해서 알아보자. 이미 제작사는 망한 듯 하나 하드웨어만 제작해서 판매 되고 있는 상황이다. ESP-WROOM-32 보드의 기본적인 사용법을 알고 있다면 사용에 드다지 문제가 없을 것이다. 보드 종류는 현재 확인해 본 바에 의하면 DOIT ESP32 DEVKIT V1 으로 설정하면 된다. 빌드 과정에서 주의해야 할 점은 USB 케이블 연결 ON/OFF 스위치가 반드시 ON 되어 있어야 한다. 마이크로 USBㅇㄴ결하는 순간에 윈도우즈의 사운드를 들어 보면 인식 여부를 확인할 수 있다. 아울러 업로딩 시 반드시 BOOT 버튼을 누르고 있어야 한다. 한편 시리얼 모니터링 과정에서 모니터에 아무 것도 출력되지 않지만 EA 버튼을 눌러야 만 WiFi 검색이 이루어지고 출력이 이루어진다. 업로딩 완료 후에는 보드 후면에 설치된 18650 리튬배터리에 의해 보드 작동이 이루어지는데 화분에 설치 후 반드시 EA 버튼을 눌러 주어야 한다. 무선 송출의 결과는 주로 사물인터넷인 ThingSpeak 채널에서 관찰하도록 한다.

인터넷이나 Github 에 올려둔 예제 코드들이 있는데 제대로 작동되는 사례가 없어 필자가 직접 손 본 ThinSpeak 코드를 예제로 올려두니 참조하기 바란다. 현재 ESP32 보드의 슬립모드를 활용할 수 있어야 리튬배터리 지속 시간이 수일로 늘어 날 수 있는데 이는 앞으로 숙제로 남겨둔다. WiFi 사용에 따른 전류 소모가 커 첨부된 코드를 사용할 경우 하루 정도 지속이 가능하다. 샘플링 시간이 5분 즉 300초에 한번 정도이므로 슬립모드 코딩이 가능하다면 일주일 이상 장시간 모니터링이 가능해 질 것이다.

 

헤더 영역의 코드를 살펴보자. ThingSpeak.h, WiFi.h DHT11.h 3가지 라이브러리를 불러오자. ThingSpeak.h 라이브러리 설치에 관해서는 일전에 게시한 아래의 블로그 내용을 참조하자. esp32와 센서가 결합된 형태이긴 하지만 근본적으로 내용에 별반 차이가 없다.

아두이노 WeMos ESP32 클라이언트로 ThingSpeak에 수분 및 온습도 측정값 전송

http://blog.daum.net/ejleep1/1079

 

esp32 보드를 사용한 ThingSpeak 데이터 전송에서는 API 키 값 외에도 Channel ID 가 필요하다.

esp32센서 보드에서는 dht11 22번 핀에 아날로그 전압을 읽어야 하는 Capacitive sensor 32번 핀을 사용한다. 아두이노 우노에서는 A0, A1,... 과 같이 지정하지만 esp32에서는 pinout 다이아그램의 GPIO 번호를 그대로 핀 번호로 사용함에 유의하자.

hg lwesp32 보드의 ADC에서 읽은 값이다. 아두이노 우노의 0~1023 보다 해상도가 높아 0~4095 사이 범위 값을 읽어 낼 수 있다.

WeMOS D1 R1 사용 시에는 map 명령을 사용하여 0~100 사이 퍼센트로 환산하였으나 esp32에서는 해상도가 달라 map 명령 사용이 불가능하다. 따라서 공기 중의 센서 값과 물속에 담궜을 때의 센서 값을 측정해 100% 범위로 직접 계산하여 환산할 필요가 있다. 측정해 보면 정확하게33501600 이 나오는 것은 아니고 1% 가량의 오차가 있음에 유의하자

수분, 온도 및 습도를 측정하여 ThinsSpeak에 보내는 명령 코드는 다음과 같이 동일함을 알 수 있다.

 

//Thingspeak_esp32_dieffenbachia

#include "ThingSpeak.h"

#include <WiFi.h>

#include <DHT11.h>

 

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

char pass[] = "dddddddddd"; // your network password

//char ssid[] = "YSC-2.4GHz";

//char pass[] = "";

WiFiClient client;

 

unsigned long myChannelNumber = 185411;

const char * myWriteAPIKey = "J5WGWY8OMQEH6BKR";

 

int number = 0;

int sensor = 32;

int pin = 22; //Signal 이 연결된 아두이노weMos의 핀번호

int hg = 3350;

int lw = 1600;

unsigned long sampling_time =300000;

 

DHT11 dht11(pin);

 

void setup() {

Serial.begin(115200); //Initialize serial

WiFi.mode(WIFI_STA);

ThingSpeak.begin(client); // Initialize ThingSpeak

pinMode(Motorpin, OUTPUT);

pinMode(pin, INPUT);

}

 

void loop() {

int err,xsoil;

float temp, humi,soil;

 

// Connect or reconnect to WiFi

if(WiFi.status() != WL_CONNECTED){

Serial.print("Attempting to connect to SSID: ");

while(WiFi.status() != WL_CONNECTED){

WiFi.begin(ssid,pass); // Connect to WPA/WPA2 network. Change this line if using open or WEP network

Serial.print(".");

delay(5000);

}

Serial.println("\nConnected.");

}

 

if((err=dht11.read(humi, temp))==0) {

xsoil = analogRead(sensor);

if( xsoil < 1600 ) xsoil = 1600;

if( xsoil > 3350 ) xsoil = 3350;

soil = 100.0*(xsoil-lw)/(hg - lw);

Serial.print(soil, 0);

Serial.print(temp, 0);

//Serial.print(" humidity:");

Serial.print(humi, 0);

Serial.println();

}

else {

Serial.println();

Serial.print("Error No :");

Serial.print(err);

Serial.println();

}

 

// Write to ThingSpeak. There are up to 8 fields in a channel, allowing you to store up to 8 different

// pieces of information in a channel. Here, we write to field 1.

// set the fields with the values

ThingSpeak.setField(1, soil);

ThingSpeak.setField(2, temp);

ThingSpeak.setField(3, humi);

int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);

 

delay(sampling_time); // Wait 20 seconds to update the channel again

}