아두이노프로세싱 프로그래밍

아두이노 NodeMCU 1.0(ESP8266 12-E module)에서 DHT11 센서 적용 온습도 와이파이 모니터링: III

coding art 2017. 2. 7. 18:14
728x90

NodeMCU를 사용하여 DHT11 온습도 센서를 사용하는 시리얼 모니터링을 완료하였으면 그 다음은 NodeMCU의 파워풀한 특징인 WiFi 기능을 사용하여 Thingspeak 사이트에 측정된 온도와 습도 데이터를 기록해 보자.

 








프로그램 도입 부에서 와이파이 라이브러리와 DHT11 라이브러리를 불러들인다.

Thingspeak 서버 사이트 명을 캐릭터로 정의한다.

Thingspeak 사이트 API 키 값을 설정한다. Thingspeak에 가입되어 있으면 부여되는 Write Key 값임.

DTH11 온습도 측정을 위한 데이터 핀은 D5로 설정한다. 아두이노 우노에서 처럼 5가 아님을 주의한다.

 

와이파이 연결을 위해서는 집에 설치된 공유기 아니면 자신의 스마트 폰 핫스팟의 ID와 비밀 번호를 입력하도록 한다. 예제의 값들은 실제처럼 보이나 실제 값들이 아닌 임의적 값들임에 유의하자.

 

setup()에서는 우선 NodeMCU의 고유의 통신 속도인 115200으로 설정한다. 시리얼 창에서도 baud rate115200임을 반드시 확인하도록 하며 그 다음 connectWiFi() 루틴을 호출한다. 프로그램 구조가 간단해 보이는 장점이 있다. 하지만 프로그램 구조 상 WiFisetup()에서 한번 연결되었다가 끓어지게 되면 다시 연결이 곤란한 구조임을 명심하자.

 

loop() 중앙에 많이 사용된 print.client() 명령이 유효하게 실행되기 위해서는 loop()문 초반에 WiFiclient client; 가 반드시 선언되어야 한다.

loop() 초반에서는 DHT11 센서 시리얼 모니터링에서 사용된 코드가 그대로 사용되고 있으며 여기에서 DHT11 라이브러리 지원을 받아 dht11.read(humi, temp); 명령에 의해 습도 값과 온도 값을 읽어 낸다. 아울러 이 코드 내용 중에 err 체크 명령들이 있는데 DHT11 센서가 문제가 없어서인지 에러가 전혀 보고된 적이 없음을 참조하기 바란다. 그렇다고 이 관련 명령들을 지울 필요는 없을 것이다.

 

loop() 의 핵심은 //Sending temperature data //Sending humidity data 파트로 구성된다. 온도 데이터를 한번 전송하고 client와 연결을 끓고 15 초 시간 지연 대기 한다. 다시

client.connect(server, 80) 명령에 의해 서버 80과의 연결 여부 확인 후 습도 데이터를 한번 전송 후 마찬가지로 client와 연결을 끓고 15 초 시간 지연 대기 한다.

Thingspeak 사이트에 온도와 습도 그래프를 작성하기 위해서는 약 30초 이상이 걸리는 셈이다. 아시다시피 온도와 습도는 변동 속도가 그다지 빠르지 않으므로 30초면 여유있는 측정 간격 설정이 될 수 있다.

 

 

NodeMCU_thingspeak_DHT_01

 

#include <ESP8266WiFi.h>

#include <DHT11.h> //라이브러리 불러오기

const char* server = "api.thingspeak.com";

String apiKey = ""0EKQ74L3W0DZYFSP;

const char* MY_SSID = "AndroidHotspot1994";

const char* MY_PWD = "00000000";

int sent = 0;

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

DHT11 dht11(pin);

void setup() {

Serial.begin(115200);

connectWifi();

}

void loop() {

WiFiClient client;

 

int err;

float temp, humi;

if((err=dht11.read(humi, temp))==0) //온도, 습도 읽어오기 및 에러 체크

{

Serial.print("temperature:");

Serial.print(temp);

Serial.print(" humidity:");

Serial.print(humi);

Serial.println();

}

else //에러 처리 과정

{

Serial.println();

Serial.print("Error No :");

Serial.print(err);

Serial.println();

}

// Sending temperature data

if (client.connect(server, 80)) { // use ip 184.106.153.149 or api.thingspeak.com

Serial.println("WiFi Client connected ");

 

Serial.print(String(sent)+" Temperature: ");

Serial.println(temp);

 

Serial.print(String(sent)+" Humidity: ");

Serial.println(humi);

String postStr = apiKey;

postStr += "&field1=";

postStr += String(temp);

postStr += "\r\n\r\n";

 

client.print("POST /update HTTP/1.1\n");

client.print("Host: api.thingspeak.com\n");

client.print("Connection: close\n");

client.print("X-THINGSPEAKAPIKEY: " + apiKey + "\n");

client.print("Content-Type: application/x-www-form-urlencoded\n");

client.print("Content-Length: ");

client.print(postStr.length());

client.print("\n\n");

client.print(postStr);

delay(1000);

 

}//end if temperature

delay(15000);

client.stop();

 

//Sending humiduty data

if (client.connect(server, 80)) { // use ip 184.106.153.149 or api.thingspeak.com

 

String humidStr = apiKey;

humidStr += "&field2=";

humidStr += String(humi);

humidStr += "\r\n\r\n";

client.print("POST /update HTTP/1.1\n");

client.print("Host: api.thingspeak.com\n");

client.print("Connection: close\n");

client.print("X-THINGSPEAKAPIKEY: " + apiKey + "\n");

client.print("Content-Type: application/x-www-form-urlencoded\n");

client.print("Content-Length: ");

client.print(humidStr.length());

client.print("\n\n");

client.print(humidStr);

delay(1000);

}//end if

sent++;

delay(15000);

client.stop();

 

 

}

void connectWifi()

{

Serial.print("Connecting to "+*MY_SSID);

WiFi.begin(MY_SSID, MY_PWD);

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

delay(1000);

Serial.print(".");

}

Serial.println("");

Serial.println("Connected");

Serial.println("");

}//end connect




실내와 문 열린 추운 창가에서 온도와 습도를 관측하였다. 겨울철 실내 온도는 대략 18도 선에 다소 건조해서 습도는 20% 선이다. NodeMCU를 추운 창가에 습도에 변화를 주기 위해서 문을 열고 둘 경우 온도가 5도 습도는 25까지 변하였고 다시 실내에 두었을 경우 원래의 값으로 회복이 되었다.