树莓派用node读取dht11温湿度传感器

2019-11-19  本文已影响0人  adtk
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用来读取温湿度传感器

上一篇下一篇

猜你喜欢

热点阅读