Skip to content

Commit 0ce626f

Browse files
committed
implemented dht22 reading
updated readme added example
1 parent 1755c89 commit 0ce626f

File tree

4 files changed

+184
-24
lines changed

4 files changed

+184
-24
lines changed

README.md

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,57 @@
11
# pigpio-dht
2+
23
Dht22 control using node.js and pigpio.
34

45
## Installation
6+
57
1. Install [pigpio C library](https://github.com/joan2937/pigpio).
6-
2. Install module dependencies: `npm i pigpio-dht`.
8+
2. Install module: `npm i pigpio-dht`.
9+
10+
## Usage
11+
12+
```javascript
13+
const dht = require('dht');
14+
15+
const dataPin = 5;
16+
const sensor = dht(dataPin);
17+
18+
setInterval(() => {
19+
sensor.read();
20+
}, 2500); // the sensor can only be red every 2 seconds
21+
22+
sensor.on('result', data => {
23+
console.log(`temp: ${data.temperature}°c`);
24+
console.log(`rhum: ${data.humidity}%`);
25+
});
26+
27+
sensor.on('badChecksum', () => {
28+
console.log('checksum failed');
29+
});
30+
```
31+
32+
### Events
33+
34+
#### start
35+
36+
Emitted when starting to read a value.
37+
38+
#### end
39+
40+
Emitted when the reading stops. This because it was complete, an error occured or anything else.
41+
42+
#### result
43+
44+
- result object containing temperature and humidity
45+
Emitted when the reading was completed successful.
46+
47+
#### badChecksum
48+
49+
Emitted when finished reading but the checksum was invalid.
50+
51+
## Built With
52+
53+
* [pigpio](https://github.com/fivdi/pigpio) - Gpio wrapper for nodejs
54+
55+
## Versioning
756

8-
## usage
9-
TODO
57+
We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [tags on this repository](https://github.com/your/project/tags).

examples/simpleRead.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
const dht = require('../');
2+
3+
const dataPin = 5;
4+
const sensor = dht(dataPin);
5+
6+
setInterval(() => {
7+
sensor.read();
8+
}, 2500); // the sensor can only be red every 2 seconds
9+
10+
sensor.on('result', data => {
11+
console.log(`temp: ${data.temperature}°c`);
12+
console.log(`rhum: ${data.humidity}%`);
13+
});
14+
15+
sensor.on('badChecksum', () => {
16+
console.log('checksum failed');
17+
});

index.js

Lines changed: 112 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,124 @@
11
'use strict';
22
const Gpio = require('pigpio').Gpio;
3+
const eventEmitter = require('events').EventEmitter;
34

45
module.exports = function(pin, type) {
6+
const dht = Object.create(new eventEmitter());
57
const gpio = new Gpio(pin, { mode: Gpio.OUTPUT, pullUpDown: Gpio.PUD_OFF };
68

7-
gpio.trigger(80, 0);
9+
dht.reading = false;
810

9-
gpio.enableAlert();
10-
gpio.disableAlert();
11+
var lastHighTick = 0;
12+
var bits = 0;
13+
14+
var rhumHigh = 0;
15+
var rhumLow = 0;
16+
var tempHigh = 0;
17+
var tempLow = 0;
18+
var checksum = 0;
19+
20+
function startReading() {
21+
if (dht.reading) {
22+
// cancel out if we are already reading
23+
return false;
24+
}
25+
dht.emmit('start');
26+
// Trigger a new relative humidity and temperature reading.
27+
// write low for 18 ms
28+
gpio.digitalWrite(0);
29+
// after that let the line go high and start reading
30+
setTimeout(() => {
31+
// reset all values
32+
bits = -2; // initialized at -2 because the first 2 lows are the ack
33+
rhumHigh = 0;
34+
rhumLow = 0;
35+
tempHigh = 0;
36+
tempLow = 0;
37+
checksum = 0;
38+
39+
// start reading input
40+
gpio.mode(Gpio.INPUT);
41+
gpio.enableAlert();
42+
}, 18);
43+
44+
return true;
45+
}
46+
function endReading() {
47+
dht.reading = false;
48+
gpio.disableAlert();
49+
gpio.mode(Gpio.OUTPUT);
50+
dht.emmit('end');
51+
}
1152

1253
gpio.on('alert', (level, tick) => {
13-
//TODO communication logic goes here
14-
var startTick = 0xffffffff; // 2^32-1 or 4294967295, the max unsigned 32 bit integer
15-
var endTick = 1;
16-
console.log((endTick >> 0) - (startTick >> 0)); // prints 2 which is what we want
54+
// Accumulate the 40 data bits. Format into 5 bytes, humidity high,
55+
// humidity low, temperature high, temperature low, checksum.
56+
57+
// bits are only accumulated on the low level
58+
if (level == 0) {
59+
let diff = (tick >> 0) - (lastHighTick >> 0);
60+
61+
// Edge length determines if bit is 1 or 0.
62+
let val = 0;
63+
// low bit is between 26 and 28 µs
64+
// high bit is 70 µs
65+
// So we check on the value in between to avoid small differences
66+
if (diff >= 50) {
67+
val = 1;
68+
if (diff >= 200) { // Bad bit?
69+
checksum = 256; // Force bad checksum.
70+
}
71+
}
72+
73+
if (bits < 0) {
74+
// header bits
75+
// we don't need to do anything with these
76+
} else if (bits < 8) {
77+
// in humidity high byte
78+
rhumHigh = (rhumHigh << 1) + val;
79+
} else if (bits < 16) {
80+
// in humidity low byte
81+
rhumLow = (rhumLow << 1) + val;
82+
} else if (bits < 24) {
83+
// in temp high byte
84+
tempHigh = (tempHigh << 1) + val;
85+
} else if (bits < 32) {
86+
// in temp low byte
87+
tempLow = (tempLow << 1) + val;
88+
} else {
89+
// In checksum byte.
90+
checksum = (checksum << 1) + val;
91+
92+
if (bits == 39) {
93+
// 40th bit received.
94+
endReading();
95+
96+
let total = rhumHigh + rhumLow + tempHigh + tempLow;
97+
98+
// Is checksum ok?
99+
if ((total & 255) == checksum) {
100+
let rhum = ((rhumHigh << 8) + rhumLow) * 0.1;
101+
102+
// check the temperature sign
103+
let mult = (tempHigh & 128) ? -0.1 : 0.1;
104+
tempHigh = tempHigh & 127; // strip the sign bit
105+
let temp = ((tempHigh << 8) + tempLow) * mult;
106+
107+
dht.emit('result', { temperature: temp, humidity: rhum });
108+
} else {
109+
dht.emmit('badChecksum');
110+
}
111+
}
112+
}
113+
114+
++bits;
115+
} else if (level == 1) {
116+
lastHighTick = tick;
117+
}
17118
});
18119

19-
function trigger() {
20-
//Trigger a new relative humidity and temperature reading.
21-
22-
//TODO implement
23-
/*self.pi.write(self.gpio, pigpio.LOW)
24-
time.sleep(0.017) // 17 ms
25-
self.pi.set_mode(self.gpio, pigpio.INPUT)
26-
self.pi.set_watchdog(self.gpio, 200)*/
27-
}
120+
return Object.assign(dht, {
121+
gpio,
122+
read: startReading
123+
});
28124
};

package.json

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "pigpio-dht",
33
"version": "1.0.0",
4-
"description": "DHT implementation using node.js and pigpio.",
4+
"description": "Dht22 control using node.js and pigpio.",
55
"main": "index.js",
66
"scripts": {
77
"test": "echo \"Error: no test specified\" && exit 1"
@@ -13,17 +13,16 @@
1313
"keywords": [
1414
"DHT",
1515
"DHT22",
16-
"pigpio"
16+
"pigpio",
17+
"raspberry",
18+
"pi"
1719
],
1820
"author": "depuits",
1921
"license": "ISC",
2022
"bugs": {
2123
"url": "https://github.com/depuits/pigpio-dht/issues"
2224
},
2325
"homepage": "https://github.com/depuits/pigpio-dht#readme",
24-
"devDependencies": {
25-
"pigpio-mock": "0.0.1"
26-
},
2726
"dependencies": {
2827
"pigpio": "^0.6.4"
2928
}

0 commit comments

Comments
 (0)