资讯中心

用树莓派做一个光照温度记录仪

发布时间:2023-12-03 资讯中心 1 次浏览

  随着冬天的脚步慢慢的接近,天气也渐渐变冷了,室内更是难得一见一缕阳光。而家里养的植物却渴望更多的光照。于是为满足植物们的需要,老婆每天都要把一盆盆花从客厅搬到卧室,再从卧室搬回客厅,只为了让那稍纵即逝的阳光多照到一点点。经过了几天的折腾后,老婆终于给我提出了一个要求:而最近着迷硬件的我自然不能拒绝这个要求。于是就有了这一个项目:光照温度记录仪。

  本着有什么用什么的原则,我决定将我手头的树莓派3B+改造成一台光照温度记录仪。而且与单片机相比,树莓派还有很多优点:

  通常,市面上的传感器有两种,一种是传感器模块,另一种是传感器的分立元件。比如下图中,左图是光照传感器模块,右图是光敏电阻。

  传感器模块一般都配备了外围电路,可以直接输出高低电平,而且无需焊接,只需插上杜邦线就能用,可以直接与Arduino、树莓派等配合使用,十分方便。但传感器模块占用空间较大,而且由于电路板布局的限制,不太方便集成到实际的产品中。比如在这一个项目中,我需要将传感器放入树莓派的外壳内,而传感器模块的尺寸远超于了外壳能容纳的大小。另一个缺点就是一些模块没有模拟输出——像上图中的传感器模块只可以通过调节模块上的电位器(蓝色的方块)来调整传感器灵敏度,因此只能得知“亮”还是“暗”,而无法获取实际的亮度值。

  因此,这一个项目中我只能选择分立元件的传感器,然后自己添加外围电路了。分立元件的缺点一是要自己添加外围电路,比如光敏电阻需要搭配一个电阻使用;二是需要焊接。但其体积要比传感器模块小得多,也很容易集成到别的产品中。

  还有一个不太重要的差异就是成本。上图左的光照传感器价格大约是¥1.60人民币,而上图右的光敏电阻价格约¥0.15人民币,两者相差10倍左右。对于个人项目而言这点差距可能并不大,但要大规模制作,成本还要考虑一下。

  光敏电阻本质上是一个电阻,光照强时阻值变小,光照弱时阻值变大。因此在实际应用时,光敏电阻需要串联一个电阻,利用分压原理,将光照强弱转换为电压的高低:

  而衡量光照(正式名称为照度)的单位是勒克斯(lux)。不同环境下的光照强度大致如下表所示:

  从表中能够准确的看出,室内的照度范围大约在20~100勒克斯。而光敏电阻的数据手册给出了不同照度下的电压范围:

  可以看出,在室内环境、照度为10~100勒克斯的范围下,光敏电阻的电阻范围为20kΩ~11.5kΩ。鉴于树莓派的电压为3.3V,咱们不可以直接参照上表中给出的电压范围,但通过简单计算能得出,串联一个10kΩ电阻时,光敏电阻上产生的电压范围为1.76V~2.2V,能实现较好的精度。因此10kΩ电阻完全够用。

  我选择了德州仪器产的LMT86传感器。这个传感器的价格相对较便宜,不到$1。它的特点有:

  从数据手册的图9中能够准确的看出,在温度不变的情况下,当输入电压超过2.7V时,输出电压几乎不会随着输入电压的变化而变化。也就是说,测量的电压值不会被输入电压的波动影响。树莓派提供的电压为3.3V,符合这个条件。

  LMT86是一个“几乎”线性的传感器,也就是说其输出电压和温度的关系几乎为直线(实际为一个曲率极小的抛物线提供了一个输出电压和温度的对照表,还提供了一个近似公式:

  不过这个公式要使用到开平方计算。尽管树莓派计算平方根不是问题,但在低功耗的应用场景下可能会有些麻烦。尽管如此,我还是决定使用数据手册中的对照表,将电压转换为温度。因此我写了一个很小的Python库lmt8x(源代码在此)。使用方法也很简单,直接pip安装即可:

  然后是一些有关LMT86的需要注意的几点。首先,LMT86有三种不同的型号,其封装和管脚排列是不一样的:

  尤其注意LP和LPG的封装的输出管脚的位置不同。务必根据买到的器件的封装选择正确的连接方式。

  另一个必须要格外注意的就是“热力时间常数”,这个值表明了温度传感器对温度的响应速度。从数据手册来看,LMT86需要至少40秒才能读取准确的温度值。因此,要注意在系统刚启动后的40秒内,读到的温度值是不准确的。

  光敏电阻和LMT86的输出都是模拟输出,而树莓派的GPIO只支持数字输入,因此就需要一个模数转换模块(ADC),将模拟信号转换成数字信号。网上推荐的一个ADC为MCP3008(数据手册),它支持8个通道、10比特分辨率(即输出范围为0~1024)。

  MCP3008支持两种模式:单输入模式和差分模式。在这一个项目中只需要从传感器读取数据,因此单输入模式就足够了。

  Adafruit还提供了一篇指南和Python的示例,所以这里就不再赘述使用方法,仅给出连接图作为参考。

  接下来只需要将光敏电阻连接到MCP3008的CH0上, 温度传感器连接到CH1上,再将MCP3008连接到树莓派即可。原理图如下:

  这里我将MCP3008的CS脚连到了树莓派的GP22上。面包板的图示如下:

  然后给树莓派插上电源并启动。默认情况下,树莓派的SPI接口是禁用的,而MCP3008一定要通过SPI接口与树莓派通信。因此就需要先执行以下命令启用SPI:

  Adafruit提供了一个非常好的包mcp3xxx,可以直接读取MCP3008的值。因此我们将要创建一个项目并安装这个包。当然还要安装前面我编写的那个lmt8x包来翻译温度传感器的温度。

  运行该程序,用手触摸温度传感器,或遮挡光线传感器,能够正常的看到亮度值和温度值有明显的变化:

  电路板制作时的最大难题就是控制电路板的尺寸,让它能放进树莓派的盒子内,同时又能较好地固定。虽然树莓派的主板四周有螺丝孔,但市面上能买到的万用板并不能完美适配这些螺丝孔的位置。所以最终我只能选择了一片4cmx6cm的万用板,在其中一边装上40pin的排母,插入树莓派上的GPIO排针来固定位置。虽然并不牢靠,但正常使用是没问题的。

  另一个问题是,如果将传感器放入树莓派盒子内部,那么测得的将是盒子内的数据,而不是房间内的数据。所以我将传感器放到了另一片万用板上,两片万用板之间靠导线连接。

  JP1到JP5为五个3针的排针,用于连接传感器。为便于以后扩展,我设计了5个传感器接口(实际上MCP3008支持8路模数转换,但万用板的面积有限,只能连接5个)。

  焊接好后的万用板如下图所示。我在3V3和GND之间接了个电容用于滤波,不过事后证明好像用处不大。

  终于到了实际应用的环节了。将上一节的程序略作改动,每次运行只读取一次当前的光照强度和温度,然后连同日期一起写入文件:

  实际上,这个数据收集装置我做了两台(第二台的硬件配置略有不同,见下一节),分别收集两个房间的光照和温度数据。然后把收集到的数据文件用Excel整理一下,画出曲线图:

  我将这个方案发到了Reddit上,收到了许多网友的建议。有人建议我使用Perma-proto HAT来省却连线的麻烦。Perma-proto是像下面这样的树莓派专用万用板:

  这块板的确有很多优点:四个螺丝孔正好对应树莓派的螺丝孔位置,可以直接用铜柱固定在树莓派上;自带2×20针排母;提供了3V3、+5V两条电源轨,和两条地线轨,中间是五连孔,因此能省却大量连线的麻烦。

  我试着做了一块,用于另一个房间的数据采集。中间的16针IC插座用于插MCP3008,左下方是光敏电阻。右边的温度传感器(蓝色方块)采用了DHT11,这款温度湿度传感器更方便使用,Adafruit也提供了专门的驱动程序,不要自己转换电压值了。

  需要注意的一点是,DHT11的Signal脚需要接一个上拉电阻,这一点在DHT11的数据手册中有明确的说明。我接了一个10kΩ的上拉电阻。

  注意最后的循环内需要用try...catch来捕获DHT11也许会出现的硬件错误。

  总的来说,这个Perma-proto HAT板还是可以的,在需要快速建立原型的时候能省却不少焊接的麻烦,非常好用。不过,这块板的一个缺点就是3V3和+5V的电源轨的布局不太符合我这一个项目的需要,按照默认布局的话,需要额外走许多线。所以我在背面切断了+5V电源轨的供电,并将其连到3V3上,这样两条电源轨都能提供3.3V的电源,布线就方便多了。


  • 在线客服
  • 联系电话
    181-1877-6570
  • 二维码

    扫一扫
    加好友