发新帖本帖赏金 20.00元(功能说明)我要提问
返回列表
打印

树莓派读取DHT11分析

[复制链接]
3658|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tobot|  楼主 | 2021-12-15 22:08 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tobot 于 2021-12-15 22:12 编辑

#申请原创#  @21小跑堂
在物联网时代,用的最多的是啥?传感器。
相信大家都入手过不少传感器,DHT11作为一款比较常用的温湿度传感器,估计没有人会说没听过,不会用,最近我带儿子玩树莓派的时候发现了一个问题,那就是网上使用树莓派读取DHT11python代码同质化太严重,而且说是给树莓派使用的,但实际上每段代码只适合少许型号的树莓派使用。例如:
这段代码在树莓派3b上工作的不错,但是在树莓派4b上就完全不能用了,读出的结果为255(全1)。
对照Datasheet我们很容易分析出原因,考虑申请原创,这里就不大段抄文了,简单说一下原理,在读取数据的时候,如果有一个较长时间的持续高电平,读取此位为1,否则就是0。如下:

根据手册来说:0”的高电位持续时间是26~28us,“1”的高电位持续时间是70us。在上面的代码中,是以循环是否超过8次作为该位01的区分,这是树莓派3b中比较适合的数字了(相信也是反复试验出来的)。
但因为不同树莓派的SoC主频不同,显然如果换一款树莓派(比如树莓派4b)这个数值肯定是需要根据实际修改的,将其循环次数k记录下来:
[7, 8, 8, 25, 25, 8, 8, 9, 8, 8, 8, 9, 8, 8, 9, 8, 8, 8, 8, 26, 26, 8, 8, 9, 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 24, 24, 8, 8, 8, 8]
从数值上来看789应该是0242526应该是1,那么直接把刚才的代码第25行改成if k<15:再尝试,根据传感器的要求,每次读取时间间隔超过1s,多次读取,发现大多数时候读取的结果是正确的,但也有错得比较离谱的情况:

这是为什么呢?
其实原因很简单,树莓派的SoC工作频率并不固定,因此循环周期也是不同的,以树莓派4b为例,它的频率可以在600MHz~1500MHz间变化。

这样,每次循环所用的时间肯定是有比较大差异的。
如果不用循环,直接读取两次时间差值是否可行呢?
经过验证,是可以的,使用time.time.time_ns()函数就行。但有个小小问题,python的效率比较低,在树莓派上,即使原始值是“0”(只有不到30us),经过两次调用这个函数并且做差值运算以后,花费的时间依然超过了70us。当然这并不是什么大问题,我们直接尝试将两次调用的时间相减(实测大概是50us),作为基础数值加到30us中,因此将上述循环计数改成时间计数:

在一定程度上可以抵御树莓派主频自动变化造成读数错误的风险。
实测,依然有一定出错概率。因此最合适的方案就是,多读几次,把校验错误和明显不符合常识的数值(比如湿度大于100)丢弃,这样结果相对准确。
代码很简单,这里就不献丑了,仅提出一个思路,请大家自行展开尝试。

使用特权

评论回复

打赏榜单

21小跑堂 打赏了 20.00 元 2021-12-17
理由:恭喜通过原创文章审核!请多多加油哦!

相关帖子

沙发
怀揣少年梦| | 2021-12-18 11:56 | 只看该作者
还没玩过树莓派。大佬厉害

使用特权

评论回复
板凳
hi0712| | 2021-12-19 22:42 | 只看该作者
牛掰 不过这种操作系统跟实时性本来就是冲突的

使用特权

评论回复
地板
风华求实| | 2021-12-20 15:27 | 只看该作者
树莓派这种进别的处理器已经不是玩玩传感器的啦,建议还是使用单片机类大MCU去玩传感器还能做一些简单的边缘计算工作,至于树莓派完全可以做一个小型的云啦。

使用特权

评论回复
5
tobot|  楼主 | 2021-12-23 01:37 | 只看该作者
风华求实 发表于 2021-12-20 15:27
树莓派这种进别的处理器已经不是玩玩传感器的啦,建议还是使用单片机类大MCU去玩传感器还能做一些简单的边 ...

是的,树莓派上的通信接口似乎都有类似问题,uart也存在类似情况

使用特权

评论回复
6
tobot|  楼主 | 2021-12-27 16:48 | 只看该作者
风华求实 发表于 2021-12-20 15:27
树莓派这种进别的处理器已经不是玩玩传感器的啦,建议还是使用单片机类大MCU去玩传感器还能做一些简单的边 ...

嗯,吸取了建议,用esp8266来玩传感器。见https://bbs.21ic.com/icview-3188566-1-1.html

使用特权

评论回复
7
lospring| | 2021-12-30 16:40 | 只看该作者
厉害厉害,树莓派好东西

使用特权

评论回复
8
tobot|  楼主 | 2021-12-30 22:14 | 只看该作者
lospring 发表于 2021-12-30 16:40
厉害厉害,树莓派好东西

到周五了?你又开始灌水啦。。。

使用特权

评论回复
9
tobot|  楼主 | 2021-12-30 22:16 | 只看该作者
怀揣少年梦 发表于 2021-12-18 11:56
还没玩过树莓派。大佬厉害

感觉树莓派经典的还是3B,4B似乎bug比较多,而且不带散热片基本用不了。。。

使用特权

评论回复
10
lihui567| | 2021-12-31 07:35 | 只看该作者
树莓派也可以跑实时操作系统?比如freertos这种类似的实时系统?

使用特权

评论回复
11
dirtwillfly| | 2021-12-31 08:51 | 只看该作者
lihui567 发表于 2021-12-31 07:35
树莓派也可以跑实时操作系统?比如freertos这种类似的实时系统?

可以跑rtthread,网上有人移植

使用特权

评论回复
评论
lihui567 2021-12-31 13:10 回复TA
多谢 
12
dirtwillfly| | 2021-12-31 08:53 | 只看该作者
linux不太适合做这种实时性比较强的工作,一般都是外挂一个mcu,或者选带硬实时内核的的芯片,比如stm32mp1

使用特权

评论回复
13
lospring| | 2021-12-31 11:35 | 只看该作者
tobot 发表于 2021-12-30 22:14
到周五了?你又开始灌水啦。。。

别这样,我是周四开始的

使用特权

评论回复
14
tobot|  楼主 | 2021-12-31 13:51 | 只看该作者
lihui567 发表于 2021-12-31 07:35
树莓派也可以跑实时操作系统?比如freertos这种类似的实时系统?

raspbian+rt补丁应该也算吧
要不我写一篇如何在raspbian上做实时的操作的方法?正愁找不到原创题材咧。。。

使用特权

评论回复
15
jgp886585| | 2021-12-31 15:27 | 只看该作者
学习一下

使用特权

评论回复
16
weiwei4dk| | 2021-12-31 17:17 | 只看该作者
不错,我的树莓派都拿来当投屏器用了

使用特权

评论回复
发新帖 本帖赏金 20.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

3834

帖子

7

粉丝