초보자를 위한 아두이노 코딩 입문-12: Adafruit DTH11 센서를 이용한 온습도 모니터링steemCreated with Sketch.

in #kr6 years ago (edited)

그림_01.png

아두이노 프로젝트 시작에 있어서 온습도 측정이 가장 대세이다. 온도나 습도 두 가지를 함께 측정하는 이유는 기상관측(Weather Station) 관점이기 때문이다. 기상 예보에서 온도와 습도 정보는 소숫점이 없는 정수형 데이터로 표현된다.

---이 블로그는 스팀잇에 새로리 가입한 회원들을 위하여 Reposting을 통해 재 노출 될 수도 있음을 양해 바랍니다.
Reposting: 초보자를 위한 아두이노 코딩연재-4: 아두이노 편집기(Arduino IDE) 다운로드 및 설치
https://steemit.com/kr/@codingart/reposting-4-arduino-ide

Reposting:아두이노 코딩 문법 및 편집의 모든 기초연재-9: 비오는 날 창가에서 조도센서 저항값 변화에 따른 LED ON OFF
https://steemit.com/kr/@codingart/reposting-9-led-on-off

Reposting:초보자를 위한 아두이노 코딩연재-6: CH340G 드러이버 설치, 아두이노 코딩에 의한 LED ON OFF
https://steemit.com/kr/@codingart/reposting-6-ch340g-led-on-off---

아두이노 온습도 측정을 위한 Adafruit사의 DTH11 센서는 온습도 두 가지를 동시에 측정할 수 있는 센서로서 아두이노의 디지털 핀 입력 구조를 정확히 반영하여 제작한 디지털 인터페이스 센서이다.

디지털 인터페이스란 이미 오래 전 스티브 잡스가 애플 컴퓨터를 팔던 시절부터 애플 마더 보드와 센서 보드간의 인터페이스에 사용되던 기법이다. 즉 컴퓨터와 센서간에 타이밍을 맞추기 위한 듀티 신호를 교환 후 정보를 주고 받는다. 다음 그림은 DHT11 센서의 타이밍 다이아그램이다.

그림_02.png

물론 아두이노에서는 C/C++ 언어가 사용되지만 라이브러리를 지원하는 방식이기 때문에 구체적인 타이밍을 코딩할 필요는 없으며, 총체적으로 온습도를 샘플링하는데 소요되는 시간 간격이 1초란 점만 지키도록 하면 된다. 반면에 라즈베리 파이(Raspberry Pi) 보드 와 DHT11 센서를 사용할 경우에는 이와 같은 타이밍을 고려하는 C 코딩 예제가 있으며 앞으로 소개할 기회가 있을 것이다.

DHT11센서 핀 구조
아래의 사진은 청색의 DHT11 과 흰색의 DHT22 온습도 측정 센서이다. DHT22 가 측정 온습도 범위 및 정밀도가 DHT11 보다 크고 정밀한 것이 차이점이다.

그림_03.png

DHYT11 센서 몸체만 있는 경우 배선 작업 시에 Vcc 와 Data 사이에 4.7KΩ 저항 배선이 필수적이며 한편 pcb 형태의 DHT11 센서가 있는데 사용의 편리성 및 배선의 간편성을 감안하면 pcb형 DHT11 센서가 훨씬 뛰어나므로 그 사용을 추천한다.

그림_04.png

PCB에 설치된 DTH11 센서를 사용하는 경우에 있어서 실제 PCB의 핀 수는 3개이다. Vcc는 5V에 GND는 접지에 디지털 데이터 핀은 예를 들자면 5번에 핀에 연결하도록 한다. DHT11 몸체만 있는 경우에는 4개의 핀 중 하나는 사용하지 않는다는 점에 주의하자. 참고로 아두이노 우노에서 Vcc는 5V 나 3V3 중 어느 전압을 사용해도 결과에는 영향이 없다.

그림_05.png

3핀 중 가운데 데이터 핀을 롱노즈로 구부려 편 후 DHT11 pcb의 GND 와 Vcc 핀을 사진과 같이 끼워 고정하도록 한다. 핀 간격이 표준화 되어 있어 GND 와 3V3 또는 GND 와 5V 핀에 맞게끔 되어 있다. 아울러 데이터 핀은 암-수 형태의 점퍼선으로 끼운 후 디지털 데이터 핀 5번에 연결 하도록 한다.
DHT11 온습도 센서 코딩
온도와 습도는 전형적인 아날로그 량이지만 Adafruit 사의 DTH 센서는 센서 내부에 실제로 센서와 마이크로콘트롤러가 들어 있어 결과물을 펄스 형태의 듀티로 디지털화 하여 출력한다.

그림_06.png

이 디지털화된 온습도 값을 디지털 처리하기 위해서는 제작자인 Adafruit사가 제공하는 라이브러리 DHT11.h가 필요하다.

스팀잇 편집기능에 파일 첨부 기능을 찾지 못해 다른 블로그에 올려둔 라이브러리를 사용하는 점을 양해 바란다. 아래에 첨부된 url 주소의 블로그 내에 설치되어 있는 라이브러리 파일을 다운로드하여 압축을 해제하도록 한다.

그림_07.png

http://blog.daum.net/ejleep1/320

라이브러리의 설치 위치는 아두이노 디렉토리 아래에 사용자가 경로를 정확히 지정해 줄 수 있는 곳에 설치하도록 한다. 가장 좋은 곳이 사용자가 짠 예제 코드를 모아둔 곳이 최적의 위치이며, 필자의 경우 prog_ex 라는 명칭의 디렉토리를 사용한다. 절대로 아두이노가 사용하는 library 디렉토리를 손대지는 말자.
아래의 사례를 참조하도록 한다. prog_ex 디렉토리에 DHT11_library.zip 파일을 옮겨 놓은 후 마우스 오른 쪽 버튼을 사용하여 압축 풀기를 하자. 아울러 zip 파일을 압축을 풀어버린 DHT11_library 디렉토리에 넣어 보관한다.
DHT11_library디렉토리 안에 DTH11 파일이 있는데 이 파일을 클릭하여 마우스 오른쪽 버튼을 눌러 속성을 체크하면 확장자가 H임을 알 수 있다. 그밖에 여러 가지 내용물들이 들어 있으나 그대로 놔두길 바란다.

그림_08.png

프로그램을 입력하여 컴파일 업로딩하기 전에 다음과 같이 먼저 라이브러리 경로를 지정하도록 하자.
아두이노 스케치 탭에서 라이브러리 포함하기로 들어가 ZIP 라이브러리 추가...를 선택 클릭 후 라이브러리가 들어 있는 DHT11_library디렉토리를 찾아서 클릭하여 경로 지정 작업을 완료한다.

그림_09.png

경로 지정 작업이 완료된 후 다시 스케치 탭에서 라이브러리 포함하기를 누루면 DHT11_libray가 등록되어 있음을 알 수 있다.

그림_10.png

온습도 측정을 위해서 아래의 프로그램을 복사하여 아두이노 편집기에서 보드 및 포트 번호를 지정 확인한 다음 컴파일하여 업로드 한다.
코드에서 보면 디지털 데이터 핀 번호를 5번으로 하였으므로 실제 배선 시에 정확하게 점퍼선을 연결하였는지 반드시 확인하기 바란다. 온습도 샘플링 시간 지연은 2초로 하였다. 사물인터넷 작업이 가능한 ThingSpeak의 경우 http 통신상의 시간적인 여유을 위해서 15초를 기준으로 하는 경우도 있다. 하지만 아두이노 보드와 직결된 온습도 센서간의 거리가 5cm 정도이기 때문에 2초면 충분하며, 사실 한 측정 지점에서 몇 초 만에 온습도 변화가 그다지 심하지 않다는 점을 명심하자.

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

그림_12.png

loop() 문에서 2초 간격으로 반복적인 온습도 측정 및 시리얼 모니터에 출력이 이루어진다. 클라스 명령 사용법에 주의하면서, 읽어내는 변수 값 즉 humi 와 temp 는 로컬(local)형태의 실수(float)로 정의한다. 하지만 읽어 들인 후 기상예보에서처럼 정수 부분만 출력하는 문제는 코드를 작성하는 사용자의 몫이다.

그림_13.png

컴파일 후 업로딩 과정에서 다음과 같은 에러가 출력되면 라이브러리 설치가 잘못된 것이므로, 다시 설치 과정을 확인해 보기 바란다.

그림_14.png

유사한 명칭의 라이브러리들이 있을 수 있는데 스팀잇 회원이라면 이 블로그에서 지정한 곳에 첨부된 라이브러리를 다운받아 사용 바란다.

디지털 데이터 핀 번호는 코딩하는 자가 정하면 되는 것이다.
dht11.read(humi, temp) 명령은 습도와 온도 값을 읽어 내는 명령이다.
셈플링 간격은 최소 1초이며 5초, 1분, 1시간 등 여유 있게 설정 하면 된다.

업로딩 완료 후 DHT11 센서의 실시간 측정 현황을 시리얼 모니터 창을 통해 확인하도록 하자.

실내에서 4월의 창가 온도는 섭씨 20도이며 습도가 18%로서 대단히 건조한 값을 보여 주고 있다. DHT11 데이터 자료에 의하면 이 센서는 온도 범위 0∼50°C 습도 범위 20∼80%로 지정되어 있다. 현재 습도 값이 거의 하한 근처에 있음을 알 수 있다.

그림_15.png

이 DHT11 센서에 의한 아두이노 온습도 측정 프로젝트는 아두이노를 접한 누구나가 다 경험하는 중요 프로젝트이며 이를 시발점으로 하여 측정 결과의 Processing 그래프 출력이라든지 또는 4쪽짜리 FND(Finite Numeric Display) 7세그먼트 출력 또는 무선 와이파이에 의한 온습도 기상 관측 결과의 ThingSpeak 싸이트에 그래프 기록 및 스마트폰에서의 결과 출력을 앞으로 다루어 볼 예정이다.

DHT11_01
#include <DHT11.h> //라이브러리 부르기

int pin = 5; //DHT11 데이타 핀 아두이노 연결
DHT11 dht11(pin); // DHT11 클라스 명령

void setup() {
Serial.begin(9600); //통신속도 설정
}

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(2000); //2초마다 측정
}

Sort:  

잘보고갑니다 ㅎㅎㅎ
저도 팔로우 해주세요 저도 팔로우하고갑니다

방문 감사합니다. 팔로우 처리 기꺼이 해드리겠습니다.

!!! 힘찬 하루 보내요!
https://steemit.com/kr/@mmcartoon-kr/5r5d5c
어마어마합니다!! 상금이 2억원!!!!!!

Coin Marketplace

STEEM 0.20
TRX 0.14
JST 0.030
BTC 68148.22
ETH 3249.65
USDT 1.00
SBD 2.67