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

in #kr6 years ago

noname41.png

NodeMCU/WeMos 보드에서 DHT11 온습도 센서를 사용하여 ThingSpeak 사이트에 측정된 온도와 습도 데이터를 기록해 보자. Cactus Micro 와는 코드 구조가 좀 다르겠지만 이미 앞서서 포스팅했던 웹서버 코드와 유사성이 많다.

noname42.png

헤더 영역의 코드 도입 부에 와이파이 라이브러리 ESP8266.h와 DHT11.h 라이브러리를 불러들인다. ThingSpeak 서버 사이트 url 주소 명을 문자열 즉 String으로 정의하자. ThingSpeak 사이트 API 키 값도 문자열로 설정한다. Thingspeak에 가입되어 있으면 부여되는 Write Key 값이다.

DTH11 온습도 측정을 위한 NodeMCU 상에서의 데이터 핀을 GPIO번호로는 14번에 해당하는 D5로 설정하자. 아두이노 우노에서의 5번 핀과 완전히 다름에 유의한다.

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

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

loop() 중앙에 많이 사용된 client.print() 명령이 유효하게 실행되기 위해서는 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 사이트에tj 온도와 습도 그래프를 작성하기 위해서는 약 30초 이상이 걸리는 셈이다. 아시다시피 온도와 습도는 변동 속도가 그다지 빠르지 않으므로 30초면 여유 있는 측정 간격 설정이 될 수 있다.

noname43.png

다음은 시리얼 모니터에서 볼 수 있는 출력 내용이다.

noname44.png

//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 끝

Sort:  

(jjangjjangman 태그 사용시 댓글을 남깁니다.)
호출에 감사드립니다! 즐거운 스티밋하세요!

pairplay 가 kr-dev 컨텐츠를 응원합니다! :)

Coin Marketplace

STEEM 0.27
TRX 0.12
JST 0.032
BTC 66445.93
ETH 3080.27
USDT 1.00
SBD 3.69