반응형

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



반응형

+ Recent posts