
아두이노 온습도 측정용 센서 DHT11 과 DHT22 는 측정 범위와 정밀도가 다르다. 아두이노 와이어링 및 코딩 학습 단계에서는 정밀도가 낮고 측정 범위가 좁은 DHT11을 사용해도 아무런 문제가 없으나 적어도 실내외 온도 측정 제어를 생각한다면 측정의 정밀도와 범위가 문제가 된다. 온도는 소숫점 이하 값이 필요하며 상대 습도는 정수 값까지 필요하다.

기상관측에서 중요한 상대습도는 DHT11은 20∼80%로 상당히 제한적이다. 건조한 겨울철에 실내의 상대 습도는 얼마든지 20% 이하로 떨어지므로 성능이 다소 부족하며 여름 장마철 비가 쏟아질 정도이면 90% 이상의 상대 습도 값을 가진다.
반면에 DHT22는 0∼100% 전체를 커버하므로 실내 공조용으로 사용이 가능해 보인다.
온도 측정 범위에 있어서도 DHT22는 –40∼125℃ 까지 넓은 범위를 포함하며 정밀도는 ∓0.5℃로 소숫점까지 포함한다. 온습도 센서로 쓸만한 수준이다. 배선 구조도 DHT11 과 거의 동일하며 다지 사용하는 라이브러리가 다르다는 점에 주의하자.

DHT22의 측정 결과는 I2C인터페이스 lcd를 사용하여 디스플레이 하기로 하자.
I2C 인터페이스는 전원Vcc, 접지 GNFD, 데이터(SDA), 클럭(SCL) 즉 단지 4줄의 점퍼 선만을 사용하기떄문에 배선이 대단히 간결한 이점이 있다.
DHT22 온습도 센서 사용에 따라 DHT.h 라이브러리를 설치하도록 한다. DHT11 온습도 센서 사용 시에는 라이브러리 명칭이 DHT11.h 이였으며 DHT.h 와는 다름에 주의한다.
DHT22 온습도 센서 측정을 위한 DHT.h 라이브러리는 아래의 외부 블로그를 방문하여 라이브러리 zip 파일을 다운받아 압축을 풀어 설치하도록 한다.
아두이노 DHT22 온습도 센서 측정
http://blog.daum.net/ejleep1/536
라이브러리 설치 이후 아두이노 편집기의 스케치 탭에서 라이브러리 포함하기 명령을 사용하여 ZIP 라이브러리 추가하기 작업을 한다. 작업이 끝난 후에는 라이브러리 포함하기 메뉴를 열어서 라이브러리 설치 여부를 확인하도록 한다.

헤더 영역의 코드를 살펴보자. 한편 I2C lcd를 사용하기 위해서는 반드시 WIre.h 라이브러리 설치가 선행되어야 한다.
I2C 라이브러리 ZIP 파일인 LiquidCrystal_I2C-master 는 인터넷에서 흔히 구할 수 있으나 편리를 위해서 아래의 블로그를 참조하여 처리하기 바란다.
Reposting: 초보자를 위한 아두이노코딩입문-14: I2C인터페이스 1602 LCD 디스플레이 출력
https://steemit.com/kr/@codingart/steemit
DHT22 온습도 센서와 I2C lcd 배선도는 아래와 같다.

DHT22 온습도 센서 배선
+: 3.3V, out: 디지털 핀 5번, -: GND
I2C lcd 디스플레이 배선
GND:GND VCC:5V SDA:A4 SCL:A5
온습도계는 3V3 전원을 lcd 는 5V 전원을 배당한다.
아울러 I2C 인터페이스 lcd를 사용하기 위해서는 주소 확인 작업도 함께 이루어져야 한다.

인터넷에서 흔히 접할 수 있는 정보를 체크해 보면 0x27 과 0x3F 가 많이 사용되는 듯하다. 이 주소를 확인하기 위해서는 아래의 사이트에 실려 있는 i2cscanner 코드를 다운받아 실행하여 확인해 보기 바란다. 확인된 데이터가 LiquidCrystal_I2C lcd(0x3F, 16, 2) 와 다르다면 주소를 수정하도록 하자.
백팩(backpack)PCB 회로를 부착한 I2C인터페이스 1602 lcd 출력
http://blog.daum.net/ejleep1/532
한편으로 lcd 디스플레이를 사용함에 있어서 백라이트에 불이 들어와 ON 이 되어도 출력된 문자들이 보이지 않는 수도 있을 수 있으므로 반드시 I2c lcd 뒷면에 부착되어 있는 백팩(Backpack)회로의 가변저항을 드라이버로 돌려 밝기를 맞추도록 한다. 비록 간단한 작업이긴 하나 상당히 많은 경우 이 단계에서 실패하기도 한다.

온습도 데이터인 temp 와 hum은 실수 즉 float 로 선언하여 사용한다. DHT11 온습도 센서에서는 소수 이하 데이터가 아무런 의미가 없었으나 DHT22에서는 특히 온도 데이터가 소수이하 첫째 자리까지가 유효 숫자임에 유의한다.
setup() 은 9600 으로 통신속도 설정과 더불어 dht.begin() 명령에 의해 온습도계 가동을 시작한다. 하지만 이 명령은 없어도 문제는 없는 듯하다.
delay(2000)은 DHT22 온습도 센서가 아두이노와 디지털 방식에 의해 데이터를 받아들이는 샘플링 타임 최소값이다. 아울러 loop() 에서도 반복적으로 온습도를 측정할 경우 끝 부분에 반드시 넣어야 한다.

I2C 인터페이스 시작을 위한 lcd.init()을 비롯하여 출력 후 사용자가 lcd 디스플레이에 출력된 결과를 확인할 수 있도록 시간 지연 delay(5000) 즉 5초의 여유를 주도록 한다. 이정도 시간이면 출력을 확인함에 충분한 시간이다. 확인이 끝난 후 온습도를 디스플레이 할 예정이므로 lcd 출력 결과들을 lcd.clear() 명령에 의해 깨끗하게 지울 필요가 있다.
loop()에서 온습도 데이터를 읽은 후 lcd.setCursor(문자시작위치, 문자 출력 줄) 명령을 사용한다.
아울러 소수이하 첫 자리를 포함하는 정밀한 온도 출력을 위해 lcd.print(t, 1) 명령을 사용한다. 뒷 자리의 1 이 소수이하 자릿수를 의미한다.
마지막에 DHT22 온습도 센서의 샘플링 타임 간격만큼 시간 여유 delay(2000) 즉 2초를 부여한다.

//LCD_DHT22_01
#include <DHT.h>;
#define DHTPIN 5 // what pin we're connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302)
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x3F,16,2);
float hum; //Stores humidity value
float temp; //Stores temperature value
void setup() {
Serial.begin(9600);
dht.begin();
delay(2000);
lcd.init();
lcd.backlight();
lcd.setCursor(2,0);
lcd.print("Hello, world!");
delay(5000);
lcd.clear();
}
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");
lcd.setCursor(0,0);
lcd.print("temp:");
float t = temp;
lcd.print(t,1);
lcd.print(" C deg");
lcd.setCursor(0,1);
lcd.print("humidity:");
int h = hum;
lcd.print(h);
lcd.print(" % ");
lcd.println();
Serial.println(hum,1);//시리얼플로터
delay(2000);// 샘플링 간격 2초 부여
Serial.println(hum,1);
}//끝