안녕하세요.
집에서 온도와 습도를 저렴한 가격으로 확인해 볼 수 있는 것이 무엇이 있을까 해서 찾아보던 중에 DHT11 모듈을 찾았습니다. 1,500원 정도면 구매할 수 있었습니다. 그런데 정확도와 측정주기가 느리기는 하지만 빠른 변화량이 필요하지 않다면 괜찮다고 생각이 들었습니다. 그리고 나중에 식물 물 주기 프로젝트와 연결해서 사용해보려고 합니다.
1. 사전지식 쌓기
DHT11은 NTC 방식으로 온도센서와 프로세서를 포함하고 있고 트리거 신호에 의해 온도와 습도 값을 40bit로 보내어 줍니다.
40bit에는 습도(상위 8Bit, 하위 8bit) + 온도(상위 8Bit, 하위 8bit) + Parity Bit(8bit)로 되어 있습니다.
0001 0101 0000 0000 + 0001 0110 0000 1000 + 0011 0011
그럼 NTC 가 무엇인지 알아보겠습니다.
저항의 온도 계수에 따라 서미스터는 크게 두 종류로 구분할 수 있습니다. k(1차 저항 온도 계수) > 0인 경우, 서미스터의 저항은 온도에 따라 증가하며, 이러한 서미스터를 정특성 서미스터(PTC thermistor:Positive Temperature Coefficient thermistor)라 합니다. 반대로 k <0인 경우 서미스터의 저항은 온도가 증가하면 감소하게 되며, 이를 부특성 서미스터(NTC thermistor:Negative Temperature Coefficient thermistor)라 합니다.
서미스터는 주로 폴리머나 세라믹 소재로 제작되며, 섭씨 영하 90도에서 130도 사이에서 높은 정확도로 온도를 측정할 수 있습니다. 이러한 점에서 순수한 금속을 사용하여 고온의 온도를 측정하는 저항 온도계와는 차이를 보입니다.
설명이 어려운데 간단하게 설명하자면 온도(T)가 올라가면 저항값이 내려가는 온도센서라고 보시면 됩니다. 그래서 이런 특성에 맞게 NTC 회사들은 저항-온도 테이블도 제공한다고 합니다.
2. DHT11 스펙
- Ultra low cost
- 3 to 5V power and I/O
- 2.5mA max current use during conversion (while requesting data)
- Good for 20-80% humidity readings with 5% accuracy
- Good for 0-50°C temperature readings ±2°C accuracy
- No more than 1 Hz sampling rate (once every second)
- Body size 15.5mm x 12mm x 5.5mm
- 4 pins with 0.1" spacing
- DHT11과 DHT22 차이점이라고 하면 DHT22가 습도(2~5%)와 온도(±0.5°C)로 정확도 높은 것과 sampling rating(0.5Hz) 더 빠르다는 것입니다. 그래서 좀 더 정확한 값을 원한다면 DHT11 이 아니라 DHT22를 구매해야 합니다.
3. 연결하기
- 3개의 선만 있으면 쉽게 값을 가져올 수 있습니다.
- DHT11의 Signal , VCC, GND를 아두이노 D2, 5V, GND에 연결합니다.
4. 소스 입력하기
- git hub에서 DHT11 소스를 다운로드하거나 복사해서 아두이노에 붙여 넣기 합니다.
https://github.com/winlinvip/SimpleDHT/blob/master/examples/DHT11WithRawBits/DHT11WithRawBits.ino
- #include <SimpleDHT.h> 사용을 위해서는 라이브러리를 추가해야 합니다.
"툴" -> "라이브러리 관리" 메뉴를 선택합니다. 그리고 DHT11로 검색합니다.
DHT 라이브러리가 많이 나오는데 그중에 SimpleDHT를 설치합니다. (최신 버전으로 설치하면 됩니다.)
그리고 소스를 붙여 넣고 업로드합니다.
// (-)GND: GND
// VCC: 5V or 3V
// (S)DATA: 2Pin(D2)
#include <SimpleDHT.h>
int pinDHT11 = 2;
SimpleDHT11 dht11;
void setup() {
Serial.begin(115200);
}
void loop() {
// start working...
Serial.println("=================================");
Serial.println("Sample DHT11 with RAW bits...");
// read with raw sample data.
byte temperature = 0;
byte humidity = 0;
byte data[40] = {0};
int err = SimpleDHTErrSuccess;
if ((err = dht11.read(pinDHT11, &temperature, &humidity, data)) != SimpleDHTErrSuccess) {
Serial.print("Read DHT11 failed, err="); Serial.println(err);delay(1000);
return;
}
Serial.print("Sample RAW Bits: ");
for (int i = 0; i < 40; i++) {
Serial.print((int)data[i]);
if (i > 0 && ((i + 1) % 4) == 0) {
Serial.print(' ');
}
}
Serial.println("");
Serial.print("Sample OK: ");
Serial.print((int)temperature); Serial.print(" *C, ");
Serial.print((int)humidity); Serial.println(" H");
// DHT11 sampling rate is 1HZ.
delay(1500);
}
- 정상적으로 작업하고 시리얼 모니터를 실행시키면 Raw 데이터와 온도, 습도 결과를 볼 수 있습니다.
참 고)
현재 SimpleDHT 소스를 기준으로 봤을 때 "[도서] 코딩으로 배우는 센서 - 온도 습도센서(DHT11)" 부분에 조금 수정이 필요해 보였습니다. (향후 개정판이 나와서 수정되었을 수도 있어요.)
1) 소스 부분
- 책 내용으로 출력하면 정상적인 Raw 값을 받을 수가 없었습니다. 그래서 Git 사이트에 소스로 출력하면 정상적인 값을 볼 수 있었습니다.
// =========== Book Source ==========
Serial.print("Sample RAW Bits: ");
for (int i = 0; i < 40; i++) {
Serial.print((int)data[i]);
if (i > 0 && ((i + 1) % 4) == 0) {
Serial.print(' ');
}
}
Serial.println("");
// ========== Git Source ==========
Serial.print("Sample RAW Bits: ");
for (int i = 0; i < 5; i++) {
for(int n=0;n<8;n++)
Serial.print(bitRead(data[i],n));
Serial.print(' ');
}
Serial.println("");
2) [DHT11 파형 확대]의 설명
- H1 구간의 구하는 값에 0001 0110이라고 하고 16이 나오는데 16이 아니라 16 +6으로 습도 22%가 됩니다.
- T1 구간 역시 동일한 오류
- T2 구간 이 항상 0으로 나온다고 했지만, 현재 값을 읽어보면 1이 나와서 항상 그렇지 않다고 해야 하지 않을까 합니다.
감사합니다.
<참조 사이트>
1. DHT11 스펙
https://learn.adafruit.com/dht
2. SimpleDHT11 소스
https://github.com/winlinvip/SimpleDHT/tree/master/examples/DHT11WithRawBits
3. [도서] 코딩으로 배우는 센서
4. 서미스터
https://ko.wikipedia.org/wiki/%EC%84%9C%EB%AF%B8%EC%8A%A4%ED%84%B0
5. NTC를 정확하게 활용하는 방법
'Embedded > Arduino' 카테고리의 다른 글
Arduino Nano + OSTSen-T007(TMP007) (MEMS) thermopile sensor Test (0) | 2024.03.17 |
---|---|
Arduino Nano + Crowtail-Capacitive Moisture (토양수분 센서) 테스트 (0) | 2024.03.09 |
초음파 센서 NT-TS601를 이용한 초음파 자(Ruler) 제작하기 (0) | 2024.02.22 |
아두이노 나노 + SZH-RFBB-019 (433MHz RF무선송수신 모듈) 테스트 – 여러 개 송수신 테스트 (0) | 2024.02.20 |
아두이노 나노 + HC-12 (433MHz RF 통신) 테스트 4편 – 여러 개 모듈 송수신 송수신 테스트 (2) | 2024.01.31 |