ds18b20温度转换指令_「DIY」DIY一个彩色LED温度计(中)

d7c2ac7d91805c15a4681e6cd084e033.png

今天,我们开始讲解温度测量部分的程序。

上回,我们已经接好线,将DS18B20的DQ接到uPyBoard的X1引脚。那么,我们该如何控制并读取温度传感器呢?之前介绍中已经说过,DS18B20使用的是单线通讯方式,这是Maxim公司的Onewire协议。其实很类似WS2812B的通讯方式,或者说WS2812就是借鉴了Onewire协议。但他们的时间参数不太一样。

9483ef55955fd9cd17f759f68e721021.png

上图中左侧为输出0时的时序图,右侧的时输出1的时序图。我们可以看到,在Onewire协议中,是以负脉冲宽度为数据0和数据1 的区别。而在WS2812中则以正脉冲的宽度区分0和1。因此,要想和DS18B20通讯,就必须按照onewire协议编程产生相应波形。另外需要说明的是,onewire是一个比较复杂的总线协议,也就是它允许在onewire这一根线上连接多个设备(DS18B20),然后通过不同的设备地址进行寻址访问。这里的多个设备是并接在一根线上的,而非象WS2812那样串接。

28a9b5ccb97550ed2281b57d67bec675.png

因此,onewire协议更复杂,功能也更强。看到这里恐怕大家都要头痛了吧。不过,非常幸运的是,uPyBoard的官方固件中其实已经带有onewire协议的驱动库,而且也带有DS18x20的驱动,我们只需要调用就可以了。

这里要用到两个库:OneWire和DS18X20。

测试程序如下:

e61c850ab7e6929e2eb37bdc7676dac5.png

讲解:前3行,引入驱动库。紧接2行实例化设备。之后,就可以使用了,这里先使用scan()来扫描总线上的所有设备并找到DS18B20的传感器,返回的结果保存在sensor中,sensor是多位数组(列表),其中每一项,都是传感器的地址。如果只有一个传感器,那么,sensor只有一项:sensor[0],sensor[0]是一个8字节的list,内容为对应DS18B20的地址。如果需要专门访问这个传感器就需要使用这个地址了。

那么接下来,我们使用convert_temp()将当前温度转换为数字值,可理解为测量当前的温度,这个命令是需要一个执行过程的,也就是测量温度需要时间,在12比特转换时,最大耗时750ms,因此,我们在调用完convert_temp()函数后,不能立即读取转换结果,此时的温度值是不对的。要等待1秒后,再通过read_temp(sensor[0])来读取温度值。大家可能注意到了,read_temp()时,需要指定DS18B20的地址,也就是sensor[0],这是因为总线上也许不止一个传感器,因此需要特别指定。

现在,我们可以再实际的环境中测试我们的程序了,前面几行包括convert_temp()都可以一次输入执行,最后一行可以组合一下:

958a3b2cb7394b630f95055748ec080b.png

这样,我们一起执行这两行,就可以看到转换的结果:

fe09a4783dd6ca7b1f874e1565739783.png

可以看到,我这里的室温为23.4摄氏度,可多发送几次最后两行命令。注意,两次发送要有间隔至少1秒。

接下来,用手指捏住DS18B20传感器上面的黑塑料部分,不要动,用我们的体温加热DS18B20传感器,稍等会儿,再次发送读取和转换两条命令,可看见,温度再缓慢上升:

ae61d0b061f7dc76f0af775b607d1a28.png

至此,我们已经实现了DS18B20温度传感器测量并读取温度的试验,今天可以收工了,下次,我们完成显示和程序主体部分。祝大家玩得愉快!

请继续关注:创客DIY乐园(MakerDIY-Park),您的关注就是我前进的动力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值