21
21
#include <sys/mman.h>
22
22
#include <sys/types.h>
23
23
#include <sys/stat.h>
24
+ #include <sys/time.h>
24
25
#include <bcm2835.h>
25
26
#include <unistd.h>
26
27
27
28
#define MAXTIMINGS 100
28
29
30
+ //#define DEBUG
31
+
29
32
#define DHT11 11
30
33
#define DHT22 22
31
34
#define AM2302 22
@@ -76,30 +79,38 @@ int readDHT(int type, int pin) {
76
79
77
80
// Set GPIO pin to output
78
81
bcm2835_gpio_fsel (pin , BCM2835_GPIO_FSEL_OUTP );
82
+
79
83
bcm2835_gpio_write (pin , HIGH );
80
- usleep (100 );
84
+ usleep (500000 ); // 500 ms
81
85
bcm2835_gpio_write (pin , LOW );
82
86
usleep (20000 );
87
+
83
88
bcm2835_gpio_fsel (pin , BCM2835_GPIO_FSEL_INPT );
84
89
85
90
data [0 ] = data [1 ] = data [2 ] = data [3 ] = data [4 ] = 0 ;
91
+
92
+ // wait for pin to drop?
93
+ while (bcm2835_gpio_lev (pin ) == 1 ) {
94
+ usleep (1 );
95
+ }
96
+
86
97
// read data!
87
98
for (int i = 0 ; i < MAXTIMINGS ; i ++ ) {
88
99
counter = 0 ;
89
100
while ( bcm2835_gpio_lev (pin ) == laststate ) {
90
101
counter ++ ;
91
- nanosleep (1 ); // overclocking might change this?
92
- if (counter == 100 )
102
+ // nanosleep(1); // overclocking might change this?
103
+ if (counter == 1000 )
93
104
break ;
94
105
}
95
106
laststate = bcm2835_gpio_lev (pin );
96
- if (counter == 100 ) break ;
107
+ if (counter == 1000 ) break ;
97
108
bits [bitidx ++ ] = counter ;
98
109
99
110
if ((i > 3 ) && (i %2 == 0 )) {
100
111
// shove each bit into the storage bytes
101
112
data [j /8 ] <<= 1 ;
102
- if (counter > 16 )
113
+ if (counter > 200 )
103
114
data [j /8 ] |= 1 ;
104
115
j ++ ;
105
116
}
@@ -109,7 +120,7 @@ int readDHT(int type, int pin) {
109
120
#ifdef DEBUG
110
121
for (int i = 3 ; i < bitidx ; i += 2 ) {
111
122
printf ("bit %d: %d\n" , i - 3 , bits [i ]);
112
- printf ("bit %d: %d (%d)\n" , i - 2 , bits [i + 1 ], bits [i + 1 ] > 15 );
123
+ printf ("bit %d: %d (%d)\n" , i - 2 , bits [i + 1 ], bits [i + 1 ] > 200 );
113
124
}
114
125
#endif
115
126
0 commit comments