아두이노프로세싱 프로그래밍

아두이노 DHT22 온습도 센서 측정

coding art 2018. 1. 4. 14:25
728x90


                                               



2종류의 아두이노 온습도 측정용 센서 DHT11 과 DHT22 는 측정 범위와 정밀도가 다르다. 아두이노 와이어링 및 코딩 학습 단계에서는 정밀도가 낮고 측정 범위가 좁은 DHT11을 사용해도 아무런 문제가 없으나 적어도 실내외 온도 측정 제어를 생각한다면 측정의 정밀도와 범위가 문제가 된다.


2센서의 전압 범위는 3.3∼5V 범위를 포함한다.

기상관측에서 중요한 상대습도는 DHT11은 20∼80%로 상당히 제한적이다. 건조한 겨울철에 실내의 상대 습도는 얼마든지 20% 이하로 떨어지므로 성능이 다소 부족하며 여름 장마철 비가 쏟아질 정도이면 90% 이상의 상대 습도 값을 가진다.







반면에 DHt22는 0∼100% 전체를 커버하므로 실내 공조용으로 사용이 가능한듯하다.

온도 측정 범위에 있어서도 DHT22는 –40∼125℃ 까지 넓은 범위를 포함하며 정밀도는 ∓0.5℃로 소숫점까지 포함한다.

온습도 센서는 위의 그림에서처럼 4핀 센서로 공급되기도 하지만 아두이노 코딩을 위해서라면 그림에서처럼 부품 납땜 작업이 필요 없는 PCB 형 온습도 센서를 사용하는 것이 편리하다.









PCB 형 DHT22 온습도 센서 배선은 그림과 같다.
  +: 5.0V 혹은 3.3V
  out: 5번
  –: GND






DHT22 온습도 센서 측정을 이한 아두이노 코딩을 위해서 아래의 라이브러리 zip 파일을 다운로드 하도록 한다.

                                

                                                      DHT.zip



다운로드한 파일을 경로 지정이 가능한 곳에 저장하고 압축 파일을 풀도록 한다. 여러번 언급했지만 아두이노 디렉토리 내부에 이미 lib. example, hardware 등의 디렉토리가 이미 있으므로 이곳에 사용자가 작성한 아두이노 예제 파일들을 디렉토리를 만들어서 저장하도록 한다. 아울러 이 예제 디렉토리 내부에 라이브러리 ZIP 파일 압축을 푼 후 아두이노 편집기의 스케치 탭의 라이브러리 포함하기의 ZIP 라이브러리 추가 명령에 의해 경로를 지정하도록 한다.
그러한 과정의 아래 사례를 참조하기 바란다.





아두이노 코딩의 헤드 부분에서 DHT22 온습도 센서 라이브러리DHT.h 를 불러 오도록 한다.

#define 용법은 C언어에서의 용법과 동일하며 상수 DHTPIN을 정수 5로 지정한다.
마찬가지로 DHTTYPE을 DHT22 로 설정한다.


이어서 DHT의 클라스 명령 dht(DHTPIN, DHTTYPE)으로 설정한다.
클라스 명령이라 함은 특정 센서나 디바이스 사용을 위해 별도로 만들어 놓은 클라스 산하의 명령어를 사용하기 위한 접두어 정도로 이해하면 좋을 듯하다.

setup()에서 PC와의 통신을 위해 아두이노 우노 보드의 통신속도를 9600 baud rate으로 설정한다. 아울러 dht.begin()에 의해 dht.⚫⚫⚫형태의 클라스 명령 사용을 시작한다. delay(2000)은 샘플링 간격이 2초인 DHT22 온습도 센서에 충분한 시간을 부여한다.


loop()에서 습도와 온도 값을 읽은 후 시리얼 모니터에 출력하도록 하자.

Serial.print() 명령은 문자를 출력하거나 float 유형의 실수 데이터를 아래와 같이 소수이하 자리수 지정과 함께 출력할 수 있다. 

Serial.print( float variable, DEC) 
float ㅍㅁ갸뮤ᅟᅵᆮ 자리에는 실수형 변수를 지정하면 되며, DEC는 십진 소숫이하 자리수를 의미한다. 따라서 습도의 경우 오차가 5% 이며 기상 예보에서 소수점을 사용하지 않는 점을 감안하면 수소이하 자리 값을 0으로 두면 된다, 반면에 온도 값은 DHT22의 측정 정밀도가 ∓0.5℃이므로 소수이하 자리 값을 1로 두도록 한다. 많은 경우에 그냥 내버려 두어도 큰 문제는 없으나 GPS 코딩의 경우 위도와 경도 값 소수이하 6자리까지 정확한 값을 부여해야 수 메터(m)의 정밀도를 주는 사례가 있음을 참고하자.

한편 정수형 변수를 출력하고자 하는 경우에는 아래와 같이 로컬(local) 지정 변수 방식으로 처리하면 된다.

         Serial.print((int)Int_variable)



컴파일 업로딩해서 결과를 출력해 보자.










DHT22_01


#include <DHT.h>;
#define DHTPIN 5     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE);

float hum;  //Stores humidity value
float temp; //Stores temperature value

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

void loop()  {
  hum = dht.readHumidity();//온도 읽기
  temp= dht.readTemperature();//습도 읽기
 
  Serial.print("Humidity: ");
  Serial.print(hum,0);// 소수 이하 자리 없음
  Serial.print(" %, Temp: ");
  Serial.print(temp, 1);//소수 이하 1자리 허용
  Serial.println(" Celsius");
  delay(2000);// 샘플링 간격 2초 부여
}//끝



DHT.zip
0.0MB