pi27cyf

#!/usr/bin/env python
import RPi.GPIO as GPIO
import numpy as np
import time

DHTPIN = 17  # 引脚号17

GPIO.setmode(GPIO.BCM)  # 以BCM编码格式


def read_dht11_dat():
    GPIO.setup(DHTPIN, GPIO.OUT)
    GPIO.output(DHTPIN, GPIO.LOW)
    # 给信号提示传感器开始工作,并保持低电平18ms以上
    time.sleep(0.02)  # 这里保持20ms
    GPIO.output(DHTPIN, GPIO.HIGH)  # 然后输出高电平

    GPIO.setup(DHTPIN, GPIO.IN)
    # 发送完开始信号后得把输出模式换成输入模式,不然信号线上电平始终被拉高

    while GPIO.input(DHTPIN) == GPIO.LOW:
        continue
    # DHT11发出应答信号,输出 80 微秒的低电平

    while GPIO.input(DHTPIN) == GPIO.HIGH:
        continue
    # 紧接着输出 80 微秒的高电平通知外设准备接收数据

    # 开始接收数据
    j = 0  # 计数器
    data = []  # 收到的二进制数据
    kk = []  # 存放每次高电平结束后的k值的列表
    while j < 40:
        k = 0
        while GPIO.input(DHTPIN) == GPIO.LOW:  # 先是 50 微秒的低电平
            continue

        while GPIO.input(DHTPIN) == GPIO.HIGH:  # 接着是26-28微秒的高电平,或者 70 微秒的高电平
            k += 1
            if k > 100:
                break
        kk.append(k)
        if k < 8:  # 26-28 微秒时高电平时通常k等于5或6
            data.append(0)  # 在数据列表后面添加一位新的二进制数据“0”
        else:  # 70 微秒时高电平时通常k等于17或18
            data.append(1)  # 在数据列表后面添加一位新的二进制数据“1”

        j += 1

    print("sensor is working.")
    print("初始数据高低电平:\n", data )  # 输出初始数据高低电平
    print("参数k的列表内容:\n", kk)  # 输出高电平结束后的k值

    m = np.logspace(7, 0, 8, base=2, dtype=int)  # logspace()函数用于创建一个于等比数列的数组
    # 即[128 64 32 16 8 4 2 1],8位二进制数各位的权值
    data_array = np.array(data)  # 将data列表转换为数组

    # dot()函数对于两个一维的数组,计算的是这两个数组对应下标元素的乘积和(数学上称之为内积)
    humidity = m.dot(data_array[0:8])  # 用前8位二进制数据计算湿度的十进制值
    humidity_point = m.dot(data_array[8:16])
    temperature = m.dot(data_array[16:24])
    temperature_point = m.dot(data_array[24:32])
    check = m.dot(data_array[32:40])

    print(humidity, humidity_point, temperature, temperature_point, check)

    tmp = humidity + humidity_point + temperature + temperature_point
    # 十进制的数据相加

    if check == tmp:  # 数据校验,相等则输出
        return humidity, temperature
    else:  # 错误输出错误信息
        return False


def main():
    print("Raspberry Pi DHT11 Temperature test program\n")
    time.sleep(1)  # 通电后前一秒状态不稳定,时延一秒
    while True:
        result = read_dht11_dat()
        if result:
            humidity, temperature = result
            print("humidity: %s %%,  Temperature: %s  ℃" %  (humidity, temperature))
            print('\n')
            time.sleep(1)

        if result == False:
            print("Data are wrong,skip\n")
            time.sleep(1)


def destroy():
    GPIO.cleanup()


if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        destroy()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值