var rpio = require('rpio');
const INT_37 = 37;
// 单片机IO,输出模式,电平拉低,至少18ms,再拉高,单片机改为输入模式
//数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和
// 数据传送正确时校验和数据等于“8bit湿度整数数据 + 8bit湿度小数数据 + 8bi温度整数数据 + 8bit温度小数数据”所得结果的末8位。
// 如果上式不相等,说明程序还没有调试好,或者读取过快
function get() {
rpio.open(INT_37, rpio.OUTPUT, rpio.LOW);//将初始状态设置为低
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); //将已经在一种模式下断开的引脚切换到另一种模式,出于性能方面的考虑
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
// 准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1
// 当最后一bit数据传送完毕后,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等于 其他所有值相加,数据就可信
// 二进制转十进制
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用来读取温湿度传感器
网友评论