-
아두이노 온습도 센서 DHT-11, DHT-22(AM2302) 비교 테스트스터디/아두이노 2017. 3. 20. 00:52반응형
온습도센서 dht-22(AM2302), dht-11 비교를 해보자
전에 라즈베리파이에서 사용하기 위해 알리익스프레스에서 온습도센서 dht22 센서를 구입했다
http://findnew.tistory.com/2
배송이 너무 늦어지는 바람에 아두이노와 dht11 까지 구매해버렸다.
http://findnew.tistory.com/12
온습도센서 2개 생겨 버렸다
두 센서의 차이는 간단히 아래 표를 보면 된다
두센서의 데이터시트 파일도 첨부하겠다
DHT-22 :
DHT-11 :
작동 전압 : 3.3V ~ 5.5V
DHT11
DHT22
온도 측정범위
0 ~ 50℃
-40 ~ 80℃
온도 측정오차
2℃
0.5℃
습도 측정범위
20 ~ 80%
0 ~ 100%
습도 측정오차
5%
2%
측정 간격
1초 2초
두 센서는 정밀도 차이 만큼이나 가격 차이도 난다.미리 말하자면 DHT-22 센서를 추천한다
왼쪽 파란색이 DHT-11, 오른쪽 흰색이 DHT-22 센서이다
모듈 타입으로 3개의 핀으로 구성되어 있다
+ : 5V or 3.3V
out : DATA - signal (digital 2번 핀을 이용하겠다)
- : GND
위처럼 연결한다
원래 라즈베리파이에서 사용하려고 했었지만 아두이노가 생겨버려
좀더 간편한 아두이노에서 테스트해보겠다
이 센서에 관한 라이브러리 제공되고 있어 그것을 이용하겠다
라이브러리 추가가 되지 않을 경우 아래 링크에서 다운 받아 이용해도 된다
// - Adafruit Unified Sensor Library: https://github.com/adafruit/Adafruit_Sensor
// - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library아래 스케치 메뉴에서 라이브러리 관리를 클릭한다
라이브러리 매니저 창에서 "dht" 검색하고
DHT sensor library by Adafruit 를 설치한다
설치완료 후 파일 > 예제 > DHT sensor libray > DHT_Unified_Sensor 를 선택한다
만약 보이지 않으면 아두이노 IDE(스케치)를 재시작한다.
아래와 같은 소스가 열리는데
적당히 수정하여 사용하면 된다
센서 종류에 따라 아래 빨간색 소스 부분을 주석/해제 처리해서 사용한다
LCD를 이용하려면 추가 코드가 필요한데
그건 나중에 기회가 되면 포스팅하겠다
// DHT Temperature & Humidity Sensor
// Unified Sensor Library Example
// Written by Tony DiCola for Adafruit Industries
// Released under an MIT license.
// Depends on the following Arduino libraries:
// - Adafruit Unified Sensor Library: https://github.com/adafruit/Adafruit_Sensor
// - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#define DHTPIN 2 // Pin which is connected to the DHT sensor.
// Uncomment the type of sensor in use:
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// See guide for details on sensor wiring and usage:
// https://learn.adafruit.com/dht/overview
DHT_Unified dht(DHTPIN, DHTTYPE);
uint32_t delayMS;
void setup() {
Serial.begin(9600);
// Initialize device.
dht.begin();
Serial.println("DHTxx Unified Sensor Example");
// Print temperature sensor details.
sensor_t sensor;
dht.temperature().getSensor(&sensor);
Serial.println("------------------------------------");
Serial.println("Temperature");
Serial.print ("Sensor: "); Serial.println(sensor.name);
Serial.print ("Driver Ver: "); Serial.println(sensor.version);
Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id);
Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println(" *C");
Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println(" *C");
Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println(" *C");
Serial.println("------------------------------------");
// Print humidity sensor details.
dht.humidity().getSensor(&sensor);
Serial.println("------------------------------------");
Serial.println("Humidity");
Serial.print ("Sensor: "); Serial.println(sensor.name);
Serial.print ("Driver Ver: "); Serial.println(sensor.version);
Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id);
Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println("%");
Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println("%");
Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println("%");
Serial.println("------------------------------------");
// Set delay between sensor readings based on sensor details.
delayMS = sensor.min_delay / 1000;
}
void loop() {
// Delay between measurements.
delay(delayMS);
// Get temperature event and print its value.
sensors_event_t event;
dht.temperature().getEvent(&event);
if (isnan(event.temperature)) {
Serial.println("Error reading temperature!");
}
else {
Serial.print("Temperature: ");
Serial.print(event.temperature);
Serial.println(" *C");
}
// Get humidity event and print its value.
dht.humidity().getEvent(&event);
if (isnan(event.relative_humidity)) {
Serial.println("Error reading humidity!");
}
else {
Serial.print("Humidity: ");
Serial.print(event.relative_humidity);
Serial.println("%");
}
}위 코드를 컴파일하고 업로드 한다.
시리얼 모니터로 데이터를 확인한다
아래는 LCD를 이용하여 데이터를 표시한 것이다
DHT11, 22 센서를 각각 5V, 3.3V에 연결하고 테스트 하였다
1. DHT-22 : 5V
2. DHT-22 : 3.3V
3. DHT-11 : 5V
4. DHT-11 : 3.3V
같은 시간대에 같은 장소에서 테스한 결과인데
DHT-22 와 DHT-11 의 차이가 제법 크다
일단 DHT-22의 경우는 5V, 3.3V 일때 온도, 습도 차이가 별로 없는 결과를 보여준다
5v : 온도 24.20 'C, 습도 46.10 %
3.3v : 온도 24.10 'C 습도 46.30 %
DHT-11의 경우 입력전압에 따라 온도 오차가 크게 발생한다
5v : 온도 21.00 'C 습도 60.00 %
3.3v : 온도 24.00 'C 습도 58.00 %
내가 가지고 있는 센서가 이렇다는 것이다.
워낙 정밀도가 높지 않은 저가형 센서들이라 섣불리 판단하기는 어렵지만
이번 경우는 DHT-22 가 조금 더 신뢰할 만한 결과를 보여준다고 생각할 수 있다.
보다 정확한 테스트를 위해서는 온도계 습도계를 옆에 두고 테스트 해가면서 보정값 처리도 해주어야 할 것 같다
DHT-11의 경우 3.3v 에서 DHT-22 의 온도측정값과 근접한 결과가 나온다
그런데 습도는 워낙 편차가 커서 모르겠다.
어쨌든 조금 더 비싼 DHT22의 측정값에 믿음이 더 가는 것은 사실이다
반응형'스터디 > 아두이노' 카테고리의 다른 글
우분투에서 아두이노 회로도 그리기 프로그램 Fritzing 설치하기 (0) 2017.02.25 우분투 16.04 에서 아두이노 최신버전 사용하기 (0) 2017.02.18