사물인터넷(IoT)2016. 6. 2. 13:14

지난번 글에서는 LM35를 이용해서 간단하게 IoT 클라우드 서비스인 ThingSpeak.com 에 온도값을 올려 보았습니다. 이번에는 정밀한 측정이 가능한 DHT22(AM2302) 센서의 측정값을 ThingSpeak 에 올려보기로 합니다. DHT22 센서에 대해서는 [정밀한 온습도 센서 DHT22 (AM2302) 의 사용] 이라는 글에서 이미 다루어 본 적이 있습니다. 저가형 온습도 센서인 DHT11 의 상위 제품으로서 측정값의 범위가 넓고 오차가 적습니다. 대신 값은 좀 비싸죠. DHT11과 DHT22 의 특성은 다음과 같습니다.

 


 

DHT11

DHT22

 온도 측정범위

 0 ~ 50℃

 -40 ~ 80

 온도 측정오차

 2

 0.5

 습도 측정범위

 20 ~ 80%

 0 ~ 100%

 습도 측정오차

 5%

 2%

측정 간격

 1초 2초








▲ DHT11 과 DHT22 (AM2302) 의 비교표


이를 이용해서 ThingSpeak.com 에 올려서 우리집의 온도와 습도의 정확한 값을 장소에 구애 없이 모니터링 해 보겠습니다.


먼저 아래의 내용을 구현 하려면 아래의 링크를 참조하여 ThingSpeak.com 에 온도와 습도를 저장할 field 2개 짜리 채널이 설정되어 있어야 하며 ESP8266 모듈에 AT Command 펌웨어가 올라가 있어야 합니다. 물론 와이파이도 필요 합니다.


USB to TTL 모듈이 있으면 첫번째 글을 참고해서 ESP8266 모듈의 펌웨어 업그레이드를 해 주시면 되고 아니라면 두번째 글을 참고, ThingSpeak 채널 설정은 4번째 글을 참고 하시면 됩니다. 쉽습니다. 물론 다 되어 있으면 아래 와이파이 설정 과정은 생략하셔도 됩니다.


ESP8266에 펌웨어 설치가 끝났으면 ESP8266을 와이파이에 연결을 해 주어야 합니다. 아래와 같이 해 주시면 됩니다.


ESP8266 와이파이 연결


아두이노와 ESP8266(ESP-01)의 연결은 위와 같이 합니다. 펌웨어 업데이트 시의 연결과 다른 점은 GPIO0 단자의 연결을 없앤 것입니다.


일단 시리얼 모니터를 열고 9600 보드레이트로 설정합니다.


1. 펌웨어 정상작동 확인

시리얼 모니터에 'AT' 를 입력합니다. 

'OK' 가 나오면 펌웨어가 정상적으로 설치된 것입니다.


2. ESP8266 모드 세팅

'AT+CWMODE=1' 을 입력해서 ESP8266 을 Station (Client) 로 세팅 합니다.


3. 연결할 와이파이 찾기

'AT+CWLAP' 명령을 입력해서 연결 가능한 와이파이를 찾습니다. 자신이 연결하고자 하는 와이파이가 목록에 나오는지 확인 합니다.


4. 와이파이 연결

AT+CWJAP="연결할 와이파이 이름","패스워드" 를 입력해서 와이파이에 연결 합니다.


5. 와이파이 연결 확인

'AT+CIFSR' 명령을 이용해서 ESP8266에 할당된 IP 가 정상적으로 나오면 연결이 잘 된 것입니다.


※ 한 번 설정된 와이파이 연결 정보는 설정을 바꾸기 전 까지는 ESP8266의 전원을 끄더라도 계속 설정이 유지됩니다.


DHT22 온습도 센서의 핀배열 입니다.


이제 ESP8266, DHT11, 아두이노 우노로 회로를 구성해 주겠습니다.


■ 연결

esp8266_dht22_thingspeak.fzz


DHT22는 3.3V 또는 5V 전원에 연결하면 됩니다. 저는 5V에 연결했습니다. 신호를 받을 SDA 핀은 디지털 2번에 연결했습니다. 그리고 VCC 와 SIgnal (SDA) 단자 사이에 10KΩ 풀업 저항을 달아 주었습니다.


DHT22

아두이노 우노

VCC

5V

SDA

D2

GND

GND


ESP8266

아두이노 우노

TXD

D10

CH_PD

3.3V

VCC

3.3V

GND

GND

RXD

D11


3.3V 및 DHT22 연결을 위해서 브레드보드 등을 이용해야 합니다.


실제 연결 모습



■ 소스

DHT 라이브러리를 먼저 설치해야 합니다.

DHT.zip


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <SoftwareSerial.h>
#include <stdlib.h>
#include <DHT.h>
 
#define DHTPIN 2        // SDA 핀의 설정
#define DHTTYPE DHT22   // DHT22 (AM2302) 센서종류 설정
 
// 업로드 알림 LED 설정 (아두이노 우노 On Board LED)
int ledPin = 13;
 
// 자신의 thingspeak 채널의 Write API key 입력
String apiKey = "Thingspeak channel write API Key";
 
SoftwareSerial ser(1011); // RX/TX 설정, serial 객체생성
DHT dht(DHTPIN, DHTTYPE);
 
void setup() {
  dht.begin();
  //알림 LED 아웃풋 설정
  pinMode(ledPin, OUTPUT);
  //시리얼통신속도 9600보드레이트 설정    
  Serial.begin(9600);
  //소프트웨어 시리얼 시작
  ser.begin(9600);
  //ESP8266 Reset
  ser.println("AT+RST");
}
 
void loop() {
  // blink LED on board
  digitalWrite(ledPin, HIGH);   
  delay(200);               
  digitalWrite(ledPin, LOW);
 
  // DHT22 값 읽음
  float temp = dht.readTemperature();
  float humi = dht.readHumidity();
 
  // String 변환
  char buf[16];
  String strTemp = dtostrf(temp, 41, buf);
  String strHumi = dtostrf(humi, 41, buf);
  
  Serial.println(strTemp);
  Serial.println(strHumi);
  
  // TCP 연결
  String cmd = "AT+CIPSTART=\"TCP\",\"";
  cmd += "184.106.153.149"// api.thingspeak.com 접속 IP
  cmd += "\",80";           // api.thingspeak.com 접속 포트, 80
  ser.println(cmd);
   
  if(ser.find("Error")){
    Serial.println("AT+CIPSTART error");
    return;
  }
  
  // GET 방식으로 보내기 위한 String, Data 설정
  String getStr = "GET /update?api_key=";
  getStr += apiKey;
  getStr +="&field1=";
  getStr += String(strTemp);
  getStr +="&field2=";
  getStr += String(strHumi);
  getStr += "\r\n\r\n";
 
  // Send Data
  cmd = "AT+CIPSEND=";
  cmd += String(getStr.length());
  ser.println(cmd);
 
  if(ser.find(">")){
    ser.print(getStr);
  }
  else{
    ser.println("AT+CIPCLOSE");
    // alert user
    Serial.println("AT+CIPCLOSE");
  }
    
  // Thingspeak 최소 업로드 간격 15초를 맞추기 위한 delay
  delay(16000);  
}
cs


LM35 전송과 다른 점은 LM35는 온도만 전송했지만 습도 데이터가 늘어났으므로 습도값을 field2 에 추가로 전송해 주었습니다. 습도값 추가로 63, 64행이 추가 되었습니다.


https://thingspeak.com 에 접속해서 데이터 업로드가 잘 되는지 관찰해 보았습니다. 실시간 그래프로 잘 나오고 있습니다.


이상으로 DHT22, ESP8266 을 이용해서 센서의 값을 와이파이 연결을 통해서 IoT 클라우드 서비스인 ThingSepak 에 연동해 보았습니다.


이런 IoT 클라우드 연동은 많은 활용분야가 있을 것 같습니다. 지금까지는 온도, 습도 등을 연동해 보았지만 인체감지 센서를 사용해서 외부인 침입 모니터링, 화재 및 가스탐지 센서를 이용한 재난 모니터링도 충분히 가능 할 것 같습니다. 그것도 원격지에서 스마트폰을 이용해서 말이죠. 치매나 건망증이 심한 분들 집에 만들어서 놓아드리면 좀 더 안심이 될 것 같습니다.



반응형
Posted by 대네브 (deneb)

댓글을 달아 주세요

  1. 0708kwo

    안녕하십니까 작성자님. 질문이 있어 댓글 남깁니다.
    우선 좋은 게시글 잘 보고 갑니다. 이 소스코드에서 API키 값만 수정하면 되나요? 다른 부분은 수정할 곳이 없나요?
    제가 API키 값만 바꾸었는데 업로드가 안되서요.. 아두이노에선 전송했다고하는데..그래서 혹시 다른 부분을 수정해야 하나 해서 질문 남깁니다.

    2017.02.20 21:23 [ ADDR : EDIT/ DEL : REPLY ]
  2. 비밀댓글입니다

    2019.10.11 10:56 [ ADDR : EDIT/ DEL : REPLY ]
    • 아두이노 제외하고 thinkspeak api를 통해 브라우저에서 직접 업데이트 해 보세요. 그 다음 아두이노쪽 점검을...

      2019.10.11 13:01 신고 [ ADDR : EDIT/ DEL ]
  3. kim

    AT+CIPCLOSE 가 시리얼 모니터에 뜨는 경우는 어떤 경우인가요?

    2019.11.26 00:24 [ ADDR : EDIT/ DEL : REPLY ]
  4. 배효근

    혹시 Wemos D1 R2 보드를 이용하는 소스를 알수 있을까요??
    기본지식이 없이 문의 드려 정말 죄송하지만 현장에 온도관리를 하고 싶은데 답답하네요..
    아두이노 우노와 8266도 있으나 8266 펌웨어를 업데이트 하고 AT 명령을 하면 Error만 뜨네요.. ㅠㅠ

    2020.03.14 14:51 [ ADDR : EDIT/ DEL : REPLY ]
    • 일단 wemos d1도 esp8266기반이니 핵심소스는 같을 것입니다. 제 블로그 사물인터넷 카테고리 더 참고해보시고 다른 사이트도 참고해보세요. 단순히 온도 정도라면 간단히 해결되실겁니다 소스는 짜드리거나 봐드리지 않습니다

      2020.03.14 15:20 신고 [ ADDR : EDIT/ DEL ]
  5. 배효근

    21.0
    11.0
    AT+CIPCLOSE

    시리얼 모니터에 이렇게 나오는데 전송이 안되고 있는거죠?

    혹시 WEMOS 보드를 사용하게 되면

    SoftwareSerial ser(10, 11); // RX/TX 설정, serial 객체생성
    DHT dht(DHTPIN, DHTTYPE);

    이부분을 어떻게 설정해야 할지 문의 드려도 될까요?


    2020.03.16 10:14 [ ADDR : EDIT/ DEL : REPLY ]