아두이노 코딩-78: Cactus Micro 클라이언트 온습도센서 DHT11 ThingSpeak 코딩

codingart(66)
Published in
#kr
Words
436
Reading
2 min
Listen
Play
8y

noname21.png가변저항에 의해 발생 시킨 아날로그 전압을 ThingSpeak 사이트에 전송하였다. 이어지는 사물인터넷 예제로는 Cactus Micro 보드에 Adafruit 사 DHT11 온습도 센서를 설치하여 측정한 온습도 값을 ThingSpeak에 전송해서 살펴 보자. ThingSpeak 의 공공(Public) 사이트에 접속해보면 전 세계 많은 실험실들부터 기상 데이터를 전송하여 보여 주고 있음을 확인해 볼 수 있다.

온습도 데이터 전송을 위한 예제 코드는 espduino 내 example 폴더 안의 thingspeak 폴더 안에 있다. (espduino master-espduino master-examples-thingspeak-thingspeak.ino)
이 thingspeak 예제는 그대로 실행이 되지 않는다. 특히 온습도 측정을 위한 DHT11.h Adafruit 사 리이브러리를 준비해 두어야 한다. 우리가 흔히 사용한 라이브러리 명칭이 DHT11.h 임에 반하여 thingspeak예제에 들어 있는 라이브러리 명칭이 DHT.h 인데 이름은 비슷하지만 서로 다른 라이브러리임에 유의하자. DHT11.h 라이브러리 준비에 관해서는 이미 여러 이전 예제들에서 언급했으므로 구독자 분들의 아두이노 편집기에 DHT11 라이브러리가 설치되어 있다고 가정하도록 하겠다.

아울러 DHT.h 라이브러리로부터 DHT11.h 으로 변경에 따른 코딩 부분을 정확히 지적하도록 하자. 아래는 thingspeak 으로부터 변경한 ThingSpeak_Cactus_DHT11_01 코딩 내용이다.

noname22.png

아래는 loop() 내부의 편집된 부분을 지적했다. 그대로 옮겨서 컴파일 업로딩하면 된다.

noname23.png

dtostrf() C 명령에서 문자 처리할 실수형 변수 즉 humidity 와 temeprature를 지정해 주고 이들을 4개로 묶는데 소숫점 이하 1자리 처리하도록 한다. buff[64] 는 16비트 정보 4개에 해당하며 이는 즉 2바이트 doubleprecision float 변수 처리를 위한 루틴이다.

보드종류 LilyPad Arduino USB에 COM 포트 명을 정확히 설정하여 컴파일 업로딩하자. 성공적으로 업로딩되면 아래와 같이 가상ip를 포함하여 시리얼 모니터에 출력이 된다. 단 시리얼 모니터의 baud rate를 19200으로 설정하도록 주의하자.
noname24.png

물론 ThingSpeak 사이트에 2개의 그래프가 준비되어 있어야 한다. Private View에서 Channel Settings 로 들어가 다음과 같이 2개의 데이터 필드를 준비하도록 한다. 코드에서API 키 값에 이어 field1&field2 로 코딩했던 정보와 대응이 이루어진다.

noname25.png

마지막 단계로 Catus 보드의 DHT11 센서에 의한 온습도 데이터를 살펴보자. 6월달 약간 습한 상태로서 60% 수준의 상태습도와 냉방이 가동되는 섭씨 20도 가량의 실내 온도를 보여 주고 있다.

noname26.png

//ThingSpeak_Cactus_DHT11_01
#include "espduino.h"
#include "rest.h"
#include "DHT11.h"

#define PIN_ENABLE_ESP 13
#define SSID "android1234"
#define PASS "dddddddddd"

int pin = 5;
DHT11 dht11(pin);
ESP esp(&Serial1, &Serial, PIN_ENABLE_ESP);
REST rest(&esp);

boolean wifiConnected = false;

void wifiCb(void* response)
{
uint32_t status;
RESPONSE res(response);

if(res.getArgc() == 1) {
res.popArgs((uint8_t*)&status, 4);
if(status == STATION_GOT_IP) {
Serial.println("WIFI CONNECTED");

  wifiConnected = true;
} else {
  wifiConnected = false;
}

}
}

void setup() {
Serial1.begin(19200);
Serial.begin(19200);
esp.enable();
delay(500);
esp.reset();
delay(500);
while(!esp.ready());

Serial.println("ARDUINO: setup rest client");
if(!rest.begin("api.thingspeak.com")) {
Serial.println("ARDUINO: failed to setup rest client");
while(1);
}

/setup wifi/
Serial.println("ARDUINO: setup wifi");
esp.wifiCb.attach(&wifiCb);

esp.wifiConnect(SSID, PASS);
Serial.println("ARDUINO: system started");
}

void loop() {
char response[266];
esp.process();
if(wifiConnected) {
float temperature, humidity;
int chk = dht11.read(humidity, temperature) ;
if(chk == 0){
char buff[64];
char str_hum[6], str_temp[6];
dtostrf(humidity, 4, 1, str_hum);
dtostrf(temperature, 4, 1, str_temp);
sprintf(buff, "/update?api_key=0DKX98L3Z0DXYEQP&field1=%s&field2=%s", str_hum, str_temp);
Serial.println(buff);
rest.get((const char*)buff);
Serial.println("ARDUINO: send get");

  if(rest.getResponse(response, 266) == HTTP_STATUS_OK){
    Serial.println("ARDUINO: GET successful");
    Serial.println(response);
  }
  delay(30000);
  
} else {
  Serial.print("error,\r\n"); 
}

}
}//끝

아두이노 코딩-78: Cactus Micro 클라이언트 온습도센서 DHT11 ThingSpeak 코딩 | Ecency