사물인터넷(ThingSpeak)

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

coding art 2020. 11. 20. 18:15
728x90

ESP-WROOM-32 보드를 사용하여 실내에서 화분 토양의 수분 및 화분 주위의 온습도를 측정하여 ThingSpeak 채널에 전송하도록 하자. ESP32 보드의 종류가 다양하므로 사용자는 자신의 보드 명을 자세히 알고 있어야 한다. 그림에서처럼 칩 위에 ESP-WROOM-32 를 확인하도록 하자. 아울러 동일한 칩을 사용하더라도 PCB PINOUT 다이아그램이 다를 경우 보드 명이 다를 수 있음에 유의하자. 확인은 아두이노 IDE에서 보드 명을 대상으로 빌드 작업을 통해 확인하도록 하자.

 

ESP32 보드를 사용하기 위한 준비작업은 두 가지이다. 첫째는 환경 설정이며 둘째는 툴바의 보드 매니저에서 ESP32 보드를 설치하는 작업이다.

 

아두이노 IDE 의 파일>환경설정을 누르면 나타나는 팝업창의 추가적인 보드매니저 URLs에서 다음과 같이 입력 하자. https://dl.espressif.com/dl/package_esp32_index.json

이미 그 이전에 다음과 가이 esp8266 칩을 다루기 위한 다음의 URL 주소도 이미 입력되어 있을 것이다. http://arduino.esp8266.com/stable/package_esp8266com.index_json

그 다음 툴>보드>보드매니저를 클릭하면 다음과 같이 팝업창이 나타나면 esp32를 입력하여 검색하자. INSTALLED 로 나타나면 이미 설치가 된 것이다. 미 설치 시에는 버튼 클릭 후 설치 시간이 필요하다.

 

ESP32 보드를 사용하여 수분 및 온습도를 측정 후 ThingSpeak에 전송하려면 아래의 NodeMCU ThingSpeak 전송 코드 방식으로 처리하면 에러 메시지는 뜨지 않으나 실제로 ThingSpeak 채널에 데이터가 전송되지 않는다는 점에 유의하자.

 

아두이노 코딩-79: NodeMCU 클라이언트 온습도센서 DHT11 ThingSpeak 코딩

https://steemit.com/kr/@codingart/79-nodemcu-dht11-thingspeak

 

물론 Crome Browser를 사용하여 Mathworks 사이트에 ThingSpeak 에 미리 가입하여 Write API를 가지고 있어야 한다. ESP32 보드는 ESP8266WiFi 칩을 사용하는 NodeMCU 보드 코드와는 아래와 같이 크게 다른 점들이 있음을 명심하자.

 

수정해야 할 내용을 다음과 같이 요약한다.

첫줄의 ThingSoeak.h 라이브러리는 별도로 다운받아 설치해야 한다.

리이브러리를 ESP8266.h에서 WiFi.h 로 수정한다. ESP32 보드 설치 시에 자동으로 WiFi.h 가 아두이노 편집기에 이미 들어 있다.

Channel ID 값도 가져다 입력하도록 한다.

API 키 값은 ThingSpeak 사이트 API 탭에서 본인의 키 값을 가져오도록 하자.

PC에 설치된 무선 공유기의 ID 와 비번을 정확히 입력한다.

int pin = D5에서 int pin = 5로 수정한다.

 

 

 

 

ThingSpeak.h 라이브러리는 다음의 Github에서 다운 받는다. 다운받은 ZIP 파일의 압축을 해제하고 여늬 라이브러리처럼 경로를 주어 라이브러리 포함하기 작업을 실시한다.

 

 

스케치 탭에서 ThingSpeak 라이브러리 설치 결과를 확인하자.

 

 

ESP32 보드를 사용하여 ThingSpeak IOT 코딩 작업을 하려면 앞서 다운 받은 자료의 examples 폴더의 예제를 사용하면 편리하다.

 

3개의 예제가 있으며 그 중에서 WriteMultipleFields를 사용하도록 한다. WriteSingleField WriteMultipleFields와 사용하는 명령이 다른데 field 가 하나인 경우도 사용 가능하다. ThingSpeak 명령 사용법은 esp8266 ThingSpeak 사용 경험이 있다면 전혀 어렵지 않으며 오히려 훨씬 쉽다. WiFi connection 코드 내용은 전혀 손댈 필요가 없으며 loop() 내에서 dht11 온습도 측정 코드에 수분 측정 코드만 추가하면 디는 구조이다. 여기까지의 코딩을 가지고 시리얼 모니터에서 수분 및 온습도 출력이 가능할 것이다. 한편 esp8266 에서는 일일이 전송할 데이터 field를 캐릭터화 하여 더 한 후 http 클라이언트 request 헤딩과 함께 전송하였으나 ESP32에서는 ThingSpeak.h 라이브러리흫 사용하기 때문에 아주 간단한 명령 추가로 소기의 목적 달성이 가능하다. 다음의 코드 예제를 살펴보자. 수분 및 온습도 측정 후 ThingSpeak.setField(number, variable) 명령을 쓰면 된다. number ThingSpeak Channel 의 각가의 그래프 번호에 해당하며 variable 은 전송하려는 데이터를 의미한다.이들 각각의 field를 세팅 완료 후 마지막으로 ThingSpeak.writeFields() 명령을 사용한다. 이때에 Channel ID API 키 값을 사용한다.

 

 

 

아직은 적절한 base board를 구하지 못하여 그냥 점퍼선을 배선하였다.

이 상태에서 코드가 준비되었으면 업로드를 하도록 한다. 가장 중요한 점은 보드 명을 무엇으로 선택하느냐 하는 문제일 것이다. 실제 여러 가지 보드 명을 선택하여 업로딩 해 본 결과 보드 명을 확인하였다. 사진의 보드 명은 DOIT ESP32 DEVKIT V1 이었다. 보드 사용 칩은 동일하지만 나머지 부품 배치가 다를 경우 또 다른 보드 명을 시험해 보아 찾아야 할 것이다.

 

 

업로딩 시 주의할 점은 보드의 양쪽 버튼 중 오른 쪽 버튼(boot 버튼)을 눌러 홀딩한 상태에서 빌드 작업을 진행해야 한다는 점이다. 완쪽 버튼은 ENABLE 버튼으로 RESET에 해당한다.

 

 

 

 

 

 

 

 

 

//WriteTempFields

#include "ThingSpeak.h"

#include <WiFi.h>

#include <DHT11.h>

 

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

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

 

WiFiClient client;

 

unsigned long myChannelNumber = 185411;

const char * myWriteAPIKey = "J5WGWY8OMQEH6BKR";

 

int number = 0;

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

int AirValue = 890;

int WaterValue = 470;

unsigned long sampling_time = 300000;

int Motorpin = 2;

int Threshold = 85;

int watering_time = 10000;//급수시간

 

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,soilC;

float temp, humi,soil;

 

// Connect or reconnect to WiFi

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

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

Serial.println(SECRET_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) {

//soilC = analogRead(sensor);

//soil = map(soilC, AirValue, WaterValue, 100, 0);

soil = 80.0;

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

}