사물인터넷(ThingSpeak)

ThingSpeak 사물인터넷에 의한 아두이노 Wemos 보드 사용 실내외 온습도 측정

coding art 2019. 11. 2. 15:18
728x90

 

 

 

 

 

 

Adafruit 사의 DHT11 센서를 사용하여 측정한 온습도 데이터를 ThingSpeak 사물인터넷 서버에 저장하여 그래프를 작성하는 것은 너무나 유명하여 아두이노에 입문하였다면 누구든지 해봐야 할 프로젝트이다. ThingSpeak 사용 방법에 관해서는 아래의 사이트를 참조하자.

 

초보자를 위한 라즈베리 파이3 DHT11 온습도 ThingSpeak 그래픽 처리 파이선 코딩

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

 

여기서는 DHT11 온습도 센서 2개를 사용하여 하나는 실외 하나는 실내 온도를 측정하여 ThingSpeak에 송신하여 모니터링 하는 방법을 고려해 보자.

 

 

 

2개의 DHT11 센서에서 데이터 핀 하나는 5번 핀에 다른 하나는 6번 핀에 할당하자. Wemos 보드의 전원은 아두이노 우노와 동일하게 5V 3V3 이 있으므로 역시 각각 하나씩 할당하자. GND 는 보드 전체에 3개가 있으므로 그 중에 2개를 사용하여 배선한다. 배선 사례는 위 사진을 참조하자. 실외 온도 측정을 위해서는 DHT11 센서 배선 길이가 길어야 하므로 점퍼선을 하나 더 넣어서 길이를 늘리도록 하여 창문 밖에 센서를 설치하고 Wemos 보드는 창 안에 두도록 한다. Wemos 보드의 CPUESP8266WiFi 칩을 사용하므로 실내에서는 무선 공유기가 설치되어 있든지 또는 스마트폰 테더링 기능을 사용할 수 있어야  한다.

 

한편 ThingSpeak 무료 회원에 가입하여 자신의 Write API 키값을 가지고 코드를 작성하자

주의할 점은 전송하는 데이터 샘플링 속도가 1분 이상 넘어가면 무료 사용이 가능하다는 저에 유의하자.

 

 

 

한편 2개의 센서를 사용하여 dhtin dhtout 클라스 명령을 사용하여 loop 내에서 각각의 instance를 교대로 생성하도록 코드를 작성한다. 샘플링 간격을 10분으로 하였는데 처음에는 15초 정도로 해서 ThingSpeak에서 결과를 확인한 후 10분으로 늘리는 것이 좋다.

 

 

ThingSpeak의 문법 상 하나의 그래프에 2종류의 데이터를 작도할 수 있도록 코딩하기는 어렵다. 아래의 그래프는 ThingSpeak에서 2개의 그래프로 작성한 측정 결과를 그림판에서 겹쳐 놓은 결과이다. 밤새 실외 온도가 10 근방까지 떨어졌다가 오전 12시가 되어 감에 따라 실내와 실외 온도가 역전되는 과정을 보여준다.

 

 

//Thingspeak_wemos_02

#include <ESP8266WiFi.h>
#include <DHT11.h>   
 #define myPeriodic 15 //in sec | Thingspeak pub is 15sec

 const char* server = "api.thingspeak.com";
 String apiKey = "Y7RAJNWH7QRXV2UD";
 const char* MY_SSID = "android1234";//반드시 자신의 무선 공유기 ID 입력
 const char* MY_PWD = "dddddddddd"; //반드시 자신의 무선공유기 비밀번호 입력
 int sent = 0;
 int pin1 = D5;
 int pin2 = D6;
 
 DHT11 dhtin(pin1); 
 DHT11 dhtout(pin2);

 void setup() {
   Serial.begin(9600);
   connectWifi();
 }
 
 
 void loop() {
   WiFiClient client;

  int err;
  float temp, humi;
  if((err=dhtin.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();   
  }
                    
// Send indoor 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 indoor temperature
 
   client.stop();
   delay(600000);

 
  if((err=dhtout.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();   
  }
 
//Send humidity data.     
 if (client.connect(server, 80)) {

     String humidStr = apiKey;
     humidStr += "&field2=";
     humidStr += String(temp);
     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++;
   client.stop();
   delay(600000);
   
 }
 
 
 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 끝