[아두이노 공부] 10. 온습도센서 (DHT22) 써보기
공부/아두이노, 전자·전기

[아두이노 공부] 10. 온습도센서 (DHT22) 써보기

안녕하세요.

기계과 감성쟁이입니다.

 

오늘은 온습도센서 모듈(DHT22)을 사용하여

이 좋은 날씨를 한번 파악해보겠습니다.

 

1. 온습도센서의 원리


온습도센서에는 두 가지 방식이 있습니다.

정전용량센서와 저항센서죠.

 

1) 정전용량센서

 

대학물리학 수업에서 배우 듯이

 

전기용량 공식 에서  유전율을 의미합니다.

 

유전율은 온도, 습도, 전자기장의 주파수 등에 영향을 받는데,

특히 온,습도에 민감한 매질을 축전기 사이에 넣어서 그 변화량으로 값을 추측해내는 것입니다.

 

2) 전기저항센서

 

저항 공식   에서  비저항(resistivity)이라고 하며,

유전율과 마찬가지로 온도와 습도에 영향을 받습니다.

 

즉, 저항값의 변화로 온 · 습도를 계산합니다.

 

2. DHT-22 온습도 센서 모듈


 

제가 사용하는 DHT-22 모듈은 2번에 해당하는

전기저항센서입니다.

 

 

DHT22 온도 습도 센서 AM2302 아두이노 연동 : 송파 메이커스페이스

[송파 메이커스페이스] 아두이노,라즈베리파이를 이용한 코딩 교육 재료, 교재 및 교구 개발, 컨텐츠 및 교육 지원

smartstore.naver.com

 

DHT22(AM2302).pdf
0.40MB

 

모듈 데이터 시트입니다.

 

은도 측정 범위 : -40ºC ~ 80ºC (측정단위 : 0.1ºC, 오차 : ±0.5ºC)

습도 측정 범위 : 0 ~ 100 % RH (상대습도, 측정단위 : 0.1% RH, 오차 : ±2~5% RH)

전압 : 3.3V ~ 5.5V DC

 

정도가 중요한 사안이 되겠네요.

 

* 상대습도는 특정한 온도의 대기 중에 포함되어 있는 수증기의 압력을 그 온도의 포화 수증기 압력으로 나눈 것을 말합니다.

 

3. DHT 라이브러리를 이용하여 사용해보기


 

 

GitHub - RobTillaart/Arduino: libs and code

libs and code. Contribute to RobTillaart/Arduino development by creating an account on GitHub.

github.com

 

또는 아두이노 IDE 속 라이브러리 매니저를 통해

DHT 라이브러리를 다운받아주세요.

 

 

LED는 일단 무시해주세요.

뒷부분에 써먹을거에유.

 

 

(+), DATA, (-) 차례대로 꽂아주세요.

저거 왜 중간에 살짝 빠졌대

 

제 모델은 데이터시트와 모양이 다릅니다.

조금 업그레이드 된 버전 같은데

 

한 유튜버 분의 말에 따르면,

저항이 달린 형태라고 합니다.

 

그래서 따로 풀업저항을 달아주지 않았어요.

 

#include "DHT.h"

#define DHTPIN 11 // 11번핀에 연결
#define DHTTYPE DHT22 // 센서 모델 설정

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  dht.begin();
  }

void loop() {
  
  float humi = dht.readHumidity();
  float temp = dht.readTemperature();

  if(isnan(humi) || isnan(temp)) {
    Serial.println("Fail. Try again");
    delay(2000);
    return;
  } // 값을 못읽을 경우
  
  Serial.print("Temperature : ");
  Serial.print(temp);
  Serial.println("ºC");
  Serial.print("Humidity : ");
  Serial.print(humi);
  Serial.println("%");
  delay(2000);
}

 

데이터 시트에 따르면,

정보수집 주기가 2초라서 딜레이는 2초로 설정했습니다.

 

isnan () 함수is not a number의 약자로,

Input이 숫자가 아니면 True, 숫자면 False 를 반환합니다.

 

 

믈통 속에 살짝 넣으니

습도가 상승하네요.

 

잘 됩니다.

 

4. 리모컨 이용하기


#include <DHT.h>
#include <IRremote.h>

#define DHTPIN 11
#define DHTTYPE DHT22

int ir_recieve = 3; // ir센서는 3번핀

IRrecv irrecv(ir_recieve);
decode_results signals;

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  
  irrecv.enableIRIn();
  dht.begin();
  }

void loop() {

  irrecv.decode(&signals);

    while (signals.value == 0xFFA25D) {
      
        float humi = dht.readHumidity();
        float temp = dht.readTemperature();
        
        if(isnan(humi) || isnan(temp)) {
          Serial.println("Fail. Try again");
          delay(2000);
          return;
    }
    
    Serial.print("Temperature : ");
    Serial.print(temp);
    Serial.println("ºC");
    Serial.print("Humidity : ");
    Serial.print(humi);
    Serial.println("%");

    irrecv.decode(&signals);
    irrecv.resume();
   	 if (signals.value == 0xFF629D){
    	  Serial.println ("stop...");
     	  return;
   		 }
    delay(2000);
    }
  }

 

이거 하면서 스스로 너무 멍청했던건

 if 안에 ==가 아니라 =를 넣었다는 겁니다...

 

if 안에서 저게 작동을 연산자가 작동해서,,,

계속 같은 값이 객체 속으로 입력되더군여,,, 내 시간 ㅠㅠ

 

LED는 그냥 안썼습니다.

LED, 온습도센서, 적외선센서 세개 연결하니 적외선센서가 죽으려고 하길래요...

 

 


 

다음엔 ESP 8266을 이용하여

인터넷에서 현재 시간을 가져와서

 

시간과 함께 온습도를 출력해보도록 하겠습니다.