
아두이노 온습도 센서 DHT11 을 사용하여 바로 자신이 위치한 곳의 데이터를 측정해보자. 또는 RC카에 온습도계를 설치하는 경우에 문제는 Adafruit 모터 쉴드 사용에 따라 디지털 핀 3∼12번 까지 모터 쉴드가 점유하기때문에 가용 디지털 핀이 2번과 13번인데 이마저 초음파 센서 설치에 사용하면 더 이상 남는 디지털 핀이 없다. 따라서 아날로그 핀으로 배정된 A0∼A5까지를 출력(OUTPUT)에 한해서 필요하다면 디지털 핀 14∼19번으로 사용하기로 한다.

구매 시에 납땜작업을 피할 수 있도록 반드시 PCB 상에 얹혀있는 DHT11 센서를 구매하자.
Adafruit사의 DTH11 센서는 아두이노 우노 보드 디지털 핀을 사용하여 디지털 인터페이스에 의해 온습도 두 가지를 측정할 수 있다. 전원은 5V 또는 3V3 두 가지다 사용이 가능하다. 작은 PCB 상에 설치된 DHT11을 구매하면 3개의 핀이 있으며 다음과 같이 연결한다.
DHT11 아두이노
Vcc ⤍ 5V 또는 3V3
DATA ⤍ 디지탈 핀
GND ⤍ GND 0V
디지털 핀은 통신을 위한 0번과 1번을 제외하고 2∼13번까지 가능하지만 최근에 실험해 본 결과 아날로그 핀 A0∼A5까지도 출력용 디지털 핀 14∼19번으로 사용할 수 있음을 확인하였다. 이번 배선 및 코딩은 커버 사진에서 처럼 디지털 핀 14번을 사용하기로 한다.
PCB에 설치된 DHT11 센서를 사용하는 경우에 있어서 실제 PCB의 핀 수는 3개이다. DHT11의 Vcc는 5V 또는 3V3 핀에 GND는 접지에 디지털 데이터 핀은 예를 들자면 14번에 핀에 연결하도록 한다. 여기서 DHT11의 Vcc 와 아두이노 보드의 Vcc 핀과 혼동을 피하도록 하자.
DHT11 온습도 센서 코딩
온도와 습도는 전형적인 아날로그 량이지만 Adafruit 사의 DTH 센서는 센서 내부에 실제로 센서와 마이크로콘트롤러가 들어 있어 결과물을 펄스 형태의 듀티로 디지털화 하여 출력한다.
이 디지털화된 온습도 값을 디지털 처리하기 위해서는 제작자인 Adafruit사가 제공하는 라이브러리 DHT11.h가 필요하다. 이 라이브러리가 필요하면 필자의 외부 블로그에서 다운로드 받을 수 있다. 아래에 첨부된 url 주소의 블로그 내에 설치되어 있는 라이브러리 파일을 다운로드하여 압축을 해제하도록 한다.

http://blog.daum.net/ejleep1/320
아울러 온도 측정 소스 코드는 본 블로그 끝에 첨부해 두었다.
※ 만약 아두이노 온습도 센서 코딩에 완전 초보라면 차라리 다음 주소의 내용을 읽고 배선 및 코딩을 해보기 바란다. 초보자를 위한 라이브러리 설치과정을 상세히 브리핑하였다. https://steemit.com/kr/@codingart/11-adafruit-dth11
코드에서 보면 디지털 데이터 핀 번호를 14번으로 하였으므로 실제 배선 시에 정확하게 점퍼선을 연결하였는지 반드시 확인하기 바란다. 온습도 샘플링 시간 지연은 2초로 하였다.
현실적으로 한 측정 지점에서 온습도 데이터의 변동은 적어도 5분 10분 1시간에 한 번 정도 측정하면 충분하지만 아두이노 배선 코딩에 있어서 장시간 기다릴 이유는 없으므로 짧게는 2초 이상 ThingSpeak에 전송할 목적이면 15초 이상, ㄲㅊ카에 탑재하려면 2분 이상으로 주기를 설정하도록 하자. 여기서는 15초로 해서 시리얼 프린터에서 확인하도록 하자.

헤더 부분 코딩이다. 라이브러리를 불러들이기 위해서 C 코딩에서처럼 <∙∙∙> 기호를 사용하며 세미콜론(;) 이 필요 없다.
DHT11 데이터 핀을 연결하기 위한 아두이노의 디지털 데이탄 핀 번호를 pin = 14 로 지정한다. 아울러 DHT11 클라스 명령을 dht11(pin)으로 선언한다. 이 명령이 선언 이후 dht11.read(humi, temp)를 실행하게 되면 DHT11 센서로부터 온습도 데이터를 읽어 들이는 명령이 수행된다.

loop() 문에서 15초 간격으로 반복적으로 온습도를 측정하고 동시에 시리얼 모니터에 출력이 이루어진다. 클라스 명령 사용법에 주의하면서, 읽어내는 변수 값 즉 humi 와 temp 는 로컬(local)형태의 실수(float)로 정의한다. 하지만 읽어 들인 후 기상예보에서처럼 정수 부분만 출력하는 문제는 코드를 작성하는 사용자의 몫이다.
DHT11 센서의 정밀도는 정수부분에 한한다는 점에 유의하자. 소숫점 이하의 정밀하면서 영하의 온도 범위까지 온습도 계측이 필요하면 DHT22 온습도 센서와 이를 지원하는 별도의 라이브러리를 사용해야 한다.
dht11.read(humi, temp) 명령은 습도와 온도 값을 읽어 내는 명령이다. DHT11 센서 배부에서의 샘플링 간격은 최소 2초이며 5초, 1분, 1시간 등 여유 있게 설정 하면 된다. 업로딩 완료 후 DHT11 센서의 실시간 측정 현황을 시리얼 모니터 창을 통해 확인하도록 하자.
가을철 실내 창가 온도는 섭씨 20도 안밖 습도가 20%선으로서 대단히 건조한 값을 보여 주고 있다. DHT11 데이터 자료에 의하면 이 센서는 온도 범위 0∼50°C 습도 범위 20∼80%로 지정되어 있다. 현재 습도 값이 거의 하한 근처에 있음을 알 수 있다.

//DHT11_Analogpin_01
#include <DHT11.h>
int pin = 14; //DHT11 데이타 핀 아날로그 핀 A0에 연결
DHT11 dht11(pin);
void setup() {
Serial.begin(9600);
pinMode(pin, OUTPUT)
}
void loop() {
int err;
float temp, humi;
if((err=dht11.read(humi, temp))==0) {
Serial.print("temperature:");Serial.print(temp);
Serial.print(" humidity:");Serial.print(humi);
Serial.println();
}
else {
Serial.println();
Serial.print("Error No :");Serial.print(err);
Serial.println();
}
delay(15000); //15초마다 측정
}//끝