본문 바로가기

소프트박스 라즈파이

Raspberry Pi3 B+ 에서 DHT11 온도습도 센서 프로그램

반응형


Raspberry Pi3 B+ 에서 DHT11 온도 습도 센서 Test 실습


실행 결과는 잘 나온다. 메인 프로그램에서 딜레이 시간을 2초 정도로 주어야 'Data not good. skip' 메세지가 나오는 횟수가 적어진다. 차라리 이 메시지가 나오지 않게 하는 게 좋은 방법일 수 있다. 무슨 말이야 하면 잘 동작하는 것처럼 보이게 하는 게 중요하다. 사용자의 실수가 아니고 1-wire 통신을 하는 하드웨어가 그러는 건데도 에러 메시지가 나오면 기분은 별로 좋지 않다. 그러니 터미널에 표시될 때도 에러 메세지가 나오지 않고 오히려 이전 값을 가지고 있다가 연속해서 표시해주는 게 맞다. 사용자는 아무렇지도 않게 넘어간다. "그렇게 보이게 하는 일"은 중요한 의미가 있다.


만약에 이전 라즈베리파이 버전에서 잘 동작했는데 최신 버전 라즈베리파이에서 동작이 안된다면 아래 코드를 사용해도 좋고, 다음 블로그 글을 참고하여 수정 부분 만 한줄 고치고 당신의 코드를 사용해도 된다.


온도 습도 센서 DHT11 에러. raspberry pi DHT11 센서 data not good skip error 해결


Raspberry Pi3 B+ 에서 DHT11 온도습도 센서에서 데이터를 얻는 소스코드를 올린다. 이 소스코드를 가지고 실습한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define MAXTIMINGS    85
#define DHTPIN        5 //BCM 24
 
int dht11_dat[5= { 00000 };
 
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 > 50 /*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( 2000 ); 
    }
 
    return(0);
}
 


nano 에디터를 사용하여 소스코드 dht11-temphumi.c 코드 수정

$nano dht11-temphumi.c 

 

컴파일 명령

$ gcc -o dht11-temphumi dht11-temphumi.c -lwiringPi

 

실행하면  

$ sudo ./dht11-temphumi


실행 결과 화면을 아래에 나타낸다. 사용자와 당신을 위해서 "Data not good, skip." 메시지는 나오지 않으면 좋지만, 만약 나온다고 해도 보이지 않는 처리를 하길 바란다.  


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
nano 에디터를 사용하여 소스코드 dht11-temphumi.c 코드 수정

$nano dht11-temphumi.c 
 
컴파일 명령
$ gcc -o dht11-temphumi dht11-temphumi.c -lwiringPi
 
실행하면 
 
$ sudo ./dht11-temphumi
Raspberry Pi wiringPi DHT11 Temperature test program
Data not good, skip
Humidity = 58.0 % Temperature = 23.7 C (73.4 F)
Humidity = 65.0 % Temperature = 23.7 C (73.4 F)
Data not good, skip
Humidity = 65.0 % Temperature = 23.7 C (73.4 F)
Humidity = 65.0 % Temperature = 23.7 C (73.4 F)
Humidity = 65.0 % Temperature = 23.7 C (73.4 F)
Humidity = 65.0 % Temperature = 23.7 C (73.4 F)
Humidity = 65.0 % Temperature = 23.7 C (73.4 F)
Humidity = 65.0 % Temperature = 23.7 C (73.4 F)
Humidity = 65.0 % Temperature = 23.8 C (73.4 F)
Humidity = 65.0 % Temperature = 23.7 C (73.4 F)
Data not good, skip
Humidity = 65.0 % Temperature = 23.8 C (73.4 F)
Humidity = 65.0 % Temperature = 23.8 C (73.4 F)
Data not good, skip
Humidity = 65.0 % Temperature = 23.8 C (73.4 F)
Humidity = 65.0 % Temperature = 23.8 C (73.4 F)
Humidity = 65.0 % Temperature = 23.8 C (73.4 F)
 



반응형