Embedded/Arduino

아두이노 나노를 이용해서 DHT11 온도 습도 센서 값 받아오기

변화의 물결1 2024. 3. 7. 00:05

 

 

안녕하세요.

 

  집에서 온도와 습도를 저렴한 가격으로 확인해 볼 수 있는 것이 무엇이 있을까 해서 찾아보던 중에 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 스펙

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를 설치합니다. (최신 버전으로 설치하면 됩니다.)

 

 

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를 정확하게 활용하는 방법

https://openstory.tistory.com/229   

반응형