DHT11 온 습도 센서에서 온도 습도를 읽어오기

by 김봉조 | 2017-01-20 15:14
dht11 library dht11 온습도 센서 dht22 wiringpi api 습도읽기 온도읽기 온습도센서 웨더스테이션

웨더 스테이션에 사용될 온습도 센서는 DHT11 센서를 사용한다.

라즈베리 파이로 DHT11 온습도 데이터를 읽어오는 방법을 설명한다.

DHT11 온습도 센서는 아래와 같은 모양이다. PCB 마운트 되어 있거나 그냥 4핀이 나와있는 형태다. 

온습도 출력을 보기 위해 PuTTY 와 같은 SSH 지원 터미널을 사용한다. 즉 윈도우에서 Putty 를 실행하여 라즈베리 파이에 IP 주소를 사용하여 접속하라는 말이다.

라즈베리 파이 접속방법에 대한 자세한 설명은 http://fishpoint.tistory.com/1979 "랜케이블 하나로 가장 빠르게 라즈베리파이와 접속하는 방법" 를 참고한다.


DHT11 온습도 센서의 간단한 사양을 살펴보면

DHT11 MODULE

Power: DC 3~5V

Pins: G (GND) – V (VCC) – D (Data)

Humidity Measurement: 20~80% humidity reading with 5% ACcuracy

Temperature Measurement: 0~50°C temperature reading with ±2°C accuracy

Should not measure more than once per second


측정 온도 범위가 0도에서 50도 까지인게 마음에 들지 않는다. 이후 포스팅에서 DHT22 온습도 센서를 사용하는 방법을 올리겠다.


일단 연결하고 프로그램을 입력하기 전에 wiringPi  라이브러리를 설치해야 한다. wiringPi 에 대한 자세한 설명은 아래를 참고한다. 프로그램을 하기전에 wiringPi 라이브러리가 설치되어 있어야 한다. 아래 링크를 참고한다.


http://fishpoint.tistory.com/1518  라즈베리파이의 GPIO를 제어할 수 있는 wiringPi라이브러리의 설치 방법


http://fishpoint.tistory.com/1814 Raspberry Pi GPIO

 


DHT 11 온습도 센서 외형과 Pinmap




라즈베리 파이와 연결도





가만이 보니 DHT11 온습도 센서의 데이터 핀이 라즈베리 파이 물리적 번호 7번에 연결되어 있고, 프로그램에서도 7번 핀으로 설정되어 있다. 다른 GPIO 에 연결하여도 이 번호만 잘 맞춰주면 데이터를 읽을 수 있다. 

$gpio readall 을 사용하여 wpi 핀 번호를 확인한다.


아래 소스코드를 나노 편집기를 이용하여 편집한다.


$nano dht11temp.c 하고 편집기가 열리면 아래 코드를 복사하여 편집기 화면에서 마우스 오른쪽 키를 클리하면 복사가 된다. nano 편집기를 빠져 나올때는 xtrl-x 누르고 저장하겠냐고 물어오면 Y 를 누르고, 파일이름은 같으니까 엔터를 치고 빠져나온다.


#include<wiringPi.h>
#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>
#define MAXTIMINGS 85
//#define DHTPIN 11
#define DHTPIN 7
int dht11_dat[5] = { 0, 0, 0, 0, 0 };
void read_dht11_dat()
{
uint8_t laststate = HIGH;
uint8_t counter =0;
uint8_t j =0, i;
float f;
dht11_dat[0] = dht11_dat[1] = dht11_dat[2] = dht11_dat[3] = dht11_dat[4] =0;
pinMode( DHTPIN, OUTPUT );
digitalWrite( DHTPIN, LOW );
delay( 18 );
digitalWrite( DHTPIN, HIGH );
delayMicroseconds( 40 );
pinMode( DHTPIN, INPUT );
for ( i =0; i < MAXTIMINGS; i++ )
{
counter =0;
while ( digitalRead( DHTPIN ) == laststate )
{
counter++;
delayMicroseconds( 1 );
if ( counter ==255 )
{
break;
}
}
laststate = digitalRead( DHTPIN );
if ( counter ==255 )
break;
if ( (i >=4) && (i % 2==0) )
{
dht11_dat[j /8] <<=1;
if ( counter >16 )
dht11_dat[j /8] |=1;
j++;
}
}
if ( (j >=40) &&
(dht11_dat[4] == ( (dht11_dat[0] + dht11_dat[1] + dht11_dat[2] + dht11_dat[3]) &0xFF) ) )
{
f = dht11_dat[2] *9./5.+32;
printf( "Humidity = %d.%d %% Temperature = %d.%d C (%.1f F)\n",
dht11_dat[0], dht11_dat[1], dht11_dat[2], dht11_dat[3], f );
}else {
printf( "Data not good, skip\n" );
}
}
int main( void )
{
printf( "Raspberry Pi wiringPi DHT11 Temperature test program\n" );
if ( wiringPiSetup() ==-1 )
exit( 1 );
while ( 1 )
{
read_dht11_dat();
delay( 1000 );
}
return(0);
}


컴파일 한다. $표시는 프롬프트이므로 입력하지 않는다.

$gcc -o dht11temp dht11temp.c -l wiringPi  

실행은 

$sudo ./dht11temp 


결과를 아래에 나타낸다.


$ sudo ./dht11temp

Raspberry Pi wiringPi DHT11 Temperature test program

Humidity = 27.0 % Temperature = 28.0 C (82.4 F)

Humidity = 28.0 % Temperature = 28.0 C (82.4 F)

Humidity = 24.0 % Temperature = 28.0 C (82.4 F)

Humidity = 26.0 % Temperature = 28.0 C (82.4 F)

Data not good, skip

Humidity = 26.0 % Temperature = 28.0 C (82.4 F)


결과중에 Data not good, skip 는 데이터가 정확하지 않을때 발생되는 에러이므로 발생해도 성능에는 지장이 없다.


참고싸이트 : http://www.uugear.com/portfolio/dht11-humidity-temperature-sensor-module/



댓글 3

MADE BY

김봉조

C, c sharp, C++, 납땜, 드론비행, 라즈베리파이 활용, 미디어활용, 아두이노
DHT11 온 습도 센서에서 온도 습도를 읽어오기 현재글 조도센서 = 빛센서=포토센서 연결 시험 이전글