物联网  >   传感器  >  正文

用DS18B20温度传感器DIY一个彩色LED温度计

  

 

  [DIY]DIY一个彩色LED温度计(中)

  David Zou 2018-09-26

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

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

  

 

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

  

 

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

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

  测试程序如下:

  

 

  讲解:前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()都可以一次输入执行,最后一行可以组合一下:

  

 

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

  

 

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

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

  

 

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

  

上一篇:微流体金刚石传感器:磁性移动生物粒子!

下一篇:奥迪车燃油传感器故障代码解读总结(珍藏)