var rpio = require('rpio');
const INT_37 = 37;
// 單片機(jī)IO,輸出模式,電平拉低贺辰,至少18ms逼裆,再拉高稽物,單片機(jī)改為輸入模式
//數(shù)據(jù)格式:8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)+8bi溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)+8bit校驗和
// 數(shù)據(jù)傳送正確時校驗和數(shù)據(jù)等于“8bit濕度整數(shù)數(shù)據(jù) + 8bit濕度小數(shù)數(shù)據(jù) + 8bi溫度整數(shù)數(shù)據(jù) + 8bit溫度小數(shù)數(shù)據(jù)”所得結(jié)果的末8位巢价。
// 如果上式不相等倒得,說明程序還沒有調(diào)試好农渊,或者讀取過快
function get() {
rpio.open(INT_37, rpio.OUTPUT, rpio.LOW);//將初始狀態(tài)設(shè)置為低
rpio.msleep(20);
rpio.write(INT_37, rpio.HIGH)
// rpio.sleep(n); /* Sleep for n seconds */
// rpio.msleep(n); /* Sleep for n milliseconds */
// rpio.usleep(n); /* Sleep for n microseconds */
rpio.mode(INT_37, rpio.INPUT); //將已經(jīng)在一種模式下斷開的引腳切換到另一種模式,出于性能方面的考慮
while (rpio.read(INT_37) == 0) {
continue
}
while (rpio.read(INT_37) == 1) {
continue
}
var data = [];
var i = 0;
while (i < 40) {
// http://m.elecfans.com/article/648303.html
// 準(zhǔn)備發(fā)送數(shù)據(jù)患蹂,每一bit數(shù)據(jù)都以50us低電平時隙開始,高電平的長短定了數(shù)據(jù)位是0還是1
// 當(dāng)最后一bit數(shù)據(jù)傳送完畢后砸紊,DHT11拉低總線
var cnt = 0;
while (rpio.read(INT_37) == 0) {
continue
}
while (rpio.read(INT_37) == 1) {
cnt += 1
if (cnt > 100) break
}
if (cnt < 8) {
data.push(0)
} else {
data.push(1)
}
i++
}
var humidity = parseInt(data.slice(0, 8).join(""), 2);
var humidity_point = parseInt(data.slice(8, 16).join(""), 2);
var temperature = parseInt(data.slice(16, 24).join(""), 2);
var temperature_point = parseInt(data.slice(24, 32).join(""), 2);
var check = parseInt(data.slice(32, 40).join(""), 2);
// 判斷check等于 其他所有值相加传于,數(shù)據(jù)就可信
// 二進(jìn)制轉(zhuǎn)十進(jìn)制
if (check == (humidity + humidity_point + temperature + temperature_point)) {
console.log("ok");
}
console.log(data, humidity, humidity_point, temperature, temperature_point, check);
}
get();
rpio.sleep(2);
get();
rpio.sleep(2);
get();
rpio.sleep(2);
get();
rpio.sleep(2);
node還有個模塊node-dht-sensor用來讀取溫濕度傳感器