아두이노 강좌 #39 DHT11 사용 방법 및 라이브러리 없이 온도 습도 측정
Lucy Archive
Lucy / Facilitate4U
2020. 9. 22. 02:00

아두이노 우노 DHT11 온도 습도아두이노 우노 DHT11 온도 습도

Arduino Uno : DHT11 without Library

이번 포스트에서는

아두이노와 함께 많이 사용되는 온도 습도 센서 DHT11의 구동 방법을 이해하기 위해 라이브러리 없이 동작하는 코드를 소개

합니다. 동작 원리를 이해하는 것은 필수로 요구되는 사항은 아니고, DHT11은 아두이노에서 제공되는 라이브러리를 사용하면 동작 원리를 몰라도 충분히 사용 가능합니다. 

DHT11 : 온/습도 센서

DHT11은 온도와 습도를 측정하기 위해 보편적으로 사용되는 센서 중 하나입니다. 센서의 외형은 아래 사진과 같고, DHT11 모듈의 연결을 쉽게 하기 위해 DHT11 Module로 구매해서 사용할 수 있습니다. DHT11 의 3번 핀은 NC(No Connection)로 DHT11 과 DHT11 Module은 동일한 회로로 보시면 됩니다.

DHT11 온습도센서DHT11 온습도센서

주요 스펙

  • Operation Voltage : 3.3V ~ 5.5V
  • Operation Ragne
    • Humidity : 20 ~ 90 %
    • Temperature : 0 ~ 50 ℃
  • Accuracy (오차율)
    • Humidity : ±5 %
    • Temperature : ±2 ℃
  • Resolution (분해능)
    • Humidity : 1 %
    • Temperature : 1 ℃
  • Minimum Measurement Cycle(최소측정주기) : 2s

※ 분해능은 센서의 최소 측정 단위입니다. 


동작 방법

DHT11는 1핀을 사용하여 데이터를 주고받는 방법은 아래와 같습니다. Arduino Uno 에서 Start Signal을 보내면, DHT11에서 준비 신호를 송신합니다. 이 신호에 이어서 습도, 온도 값 및 체크섬 데이터 40bit를 연속으로 송신합니다. Arduino Uno 가 40bit를 모두 수신하면 데이터 핀을 HIGH로 활성화하여 통신을 종료합니다. 

DHT11이 송신하는 데이터 0과 1은 HIGH 지속 시간이 각각 26~28us 와 70us 입니다.

샘플 파형 예시

아래 그림은 Arduino Uno 와 DHT11 간 통신 데이터를 측정한 그림입니다. Arduino 또는 MCU가 Start Signal을 송신하면, DHT11가 준비신호로 약 80us 의 HIGH 펄스를 송신합니다. 이어서 습도와 온도 및 체크섬 데이터를 송신합니다. 아래 파형에서처럼 HIGH 지속 시간이 긴 펄스는 데이터 1을 의미합니다. 데이터 신호의 처음 8개의 데이터는 습도의 이진수 데이터 0b00010001로 습도 17%를 의미합니다.

DHT11 통신 파형DHT11 통신 파형


아두이노 우노로 DHT11 사용하기

Arduino Uno DHT11 회로 구성

Arduino Uno에서 DHT11를 동작시키기 위해 아래와 같이 회로를 구성하였습니다. DHT11의 데이터 핀은 아두이노 우노의 D4로 연결했지만, 다른 핀을 연결해도 무방합니다.

Arduino Uno DHT11 연결Arduino Uno DHT11 연결


코드 작성

아두이노 프로그램이 실행되면 온도와 습도를 한 번만 읽어오는 프로그램입니다. 

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
#define DHT11 4
 
long highDuty[40];
uint8_t recData[5];
 
void setup(){
    pinMode(DHT11, OUTPUT);
    digitalWrite(DHT11, HIGH);
    Serial.begin(115200);
    Serial.println("Program Start....");
    delay(1000);
}
 
void loop(){
    // Arduino Uno -> DHT11 Start SIgnal 
    digitalWrite(DHT11, LOW);
    delay(20);
    digitalWrite(DHT11, HIGH);
    delayMicroseconds(40);
    pinMode(DHT11, INPUT);
 
    // Jump DHT Ready Signal
    while(digitalRead(DHT11)==LOW){
        ;
    }
 
    // Get DHT Data Signal
    for(int i = 0 ; i < 40 ; i++){
        highDuty[i] = pulseIn(DHT11, HIGH);
    }
 
    // Data Analysis
    for(int i = 0 ; i < 5 ; i++){
        for(int j = 0 ; j < 8 ; j++){
            int temp = (8 * i) + j;
            if(highDuty[temp] > 50){
                recData[i] |= 1 << 7-j;                 
            }
        }
    }
 
    // Serial Print
    Serial.print("Humidity : ");
    Serial.println(recData[0], DEC);
    Serial.print("Temperature : ");
    Serial.println(recData[2], DEC);
    Serial.print("CheckSum : ");
    Serial.print("0b");
    Serial.println(recData[4], BIN);
 
    // Stop Program
    while(1);
}
cs

코드 설명

  • Data 핀 초기화 : 7~8 Line
    • Data 핀을 Output 으로 설정하고, Default로 HIGH 출력합니다.
  • Start Signal : 16~20 Line
    • Arduino Uno 에서 DHT11 로 Start Signal 을 송신합니다.
  • Read SIgnal : 23 Line
    • DataPin 이 LOW가 될 때까지 대기합니다. (Ready Signal 종료)
  • Data Signal : 28~30 Line
    • DHT11가 송신하는 습도 온도 40bits 데이터 HIGH 지속 시간을 highDuty[] 배열에 순차적으로 저장합니다.
  • Data Analysis : 33~37 Line
    • highDuty[] 에 보관된 데이터에서 온도, 습도, Check Sum 데이터를 분류합니다. highDuty 지속 시간이 50us 이하일 때 '0' 이상일 때 '1'로 분류하였습니다.
    • recData[0] - 습도데이터
    • recData[2] - 온도데이터
    • recData[4] - 체크섬


실행 결과

위의 코드를 실행하면 아래와 같이 습도, 온도 및 CheckSum 데이터를 시리얼 포트로 출력합니다.


마무리

본 포스트에서

DHT11의 동작 방법에 대해 알아보고, 동작 원리에 따라 Arduino 코드로 구현하는 방법을 소개

하였습니다. 끝까지 읽어 주셔서 감사합니다. 😄
관련포스트

👉 아두이노 온도센서 관련글 목록 보기

👉 아두이노 센서 관련글 목록 보기

👉 아두이노 관련글 전체 목록 보기