Arduino Uno : DHT11 without Library
아두이노와 함께 많이 사용되는 온도 습도 센서 DHT11의 구동 방법을 이해하기 위해 라이브러리 없이 동작하는 코드를 소개
합니다. 동작 원리를 이해하는 것은 필수로 요구되는 사항은 아니고, DHT11은 아두이노에서 제공되는 라이브러리를 사용하면 동작 원리를 몰라도 충분히 사용 가능합니다.DHT11 : 온/습도 센서
DHT11은 온도와 습도를 측정하기 위해 보편적으로 사용되는 센서 중 하나입니다. 센서의 외형은 아래 사진과 같고, DHT11 모듈의 연결을 쉽게 하기 위해 DHT11 Module로 구매해서 사용할 수 있습니다. DHT11 의 3번 핀은 NC(No Connection)로 DHT11 과 DHT11 Module은 동일한 회로로 보시면 됩니다.
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 사용하기
Arduino Uno DHT11 회로 구성
Arduino Uno에서 DHT11를 동작시키기 위해 아래와 같이 회로를 구성하였습니다. DHT11의 데이터 핀은 아두이노 우노의 D4로 연결했지만, 다른 핀을 연결해도 무방합니다.
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]- 체크섬
실행 결과
마무리
DHT11의 동작 방법에 대해 알아보고, 동작 원리에 따라 Arduino 코드로 구현하는 방법을 소개
하였습니다. 끝까지 읽어 주셔서 감사합니다. 😄'Embedded > Arduino' 카테고리의 다른 글
아두이노 코딩 : DHT11 온도 습도 데이터 I2C Character LCD에 출력하기 (0) | 2020.09.25 |
---|---|
아두이노 강좌 #40 온습도 센서 DHT11 Adafruit 라이브러리 사용 방법 (6) | 2020.09.24 |
아두이노 코딩 : HC-SR04 로 측정한 거리를 I2C CLCD 에 출력 (0) | 2020.09.21 |
아두이노 강좌 #38 HC-SR04 동작 방식과 사용법 (0) | 2020.09.19 |
아두이노 코딩 : 아두이노 우노로 리모컨 만들기 (0) | 2020.09.11 |