欢迎光临散文网 会员登陆 & 注册

Raspberry Pi 伪智能散热风扇控制脚本

2021-04-07 12:20 作者:28283844972_bili  | 我要投稿

我们知道树莓派4B在各大性能方面有较大提升的同时,其发热量同样也是惊人的,普通室温环境下,树莓派空载温度都可以稳定地维持在40+℃,所以通过加装一般的2pin散热风扇,以达到温控的目的。缺点就是风扇只要加电就会一直处于启动状态,不仅会长时间产生扰人的噪音,也会浪费多余的电能、缩短风扇电机寿命等问题。

因此,能够像普通个人计算机那样、根据当前CPU温度选择是否开启风扇散热的需求就产孕育而生了。该怎么实现呢?有没有现成的解决方案呢?想起刚刚入手树莓派4B、配置开发板初始环境(Raspberry pi os)的时候,在raspi-config工具中遇到的一个风扇控制功能:

在命令行中输入: sudo raspi-config ,随即进入了一个模拟图形配置界面

选择 Performance Options -> Fan -> Enable fan temperature control -> Pin -> Temperature 

raspi-config工具主界面
选择设置GPIO风扇行为
开启风扇温控设置
设置风扇使用的GPIO针脚
设置阀值温度后开启风扇进行散热

设置过程很简单不是吗?看我一顿操作猛如虎,最初是直接将风扇接口接在pin6(GND)和pin8(GPIO)两个针脚上,按照如上步骤设置好散热风扇。加电开机,随便跑一个高算力脚本,期待风扇能够如期运行。。。后来通过查阅官方文档才知道GPIO接口提供的电压无法满足5v的负载需求,风扇自然是转不起来的,第一次尝试失败!

遇事不决就得面向浏览器学习,仅有一个散热风扇是无法实现温控启动功能,另外需要简单的电路支持,直接放图(手绘的原理图不好意思摆上台面):

图片来源:https://blog.chaos.run/images/posts/MjmRXrA.jpg

对于我这样很少接触硬件电路的小白来说,还算是比较简单的电路。花个亿点点时间应该可以仿一个出来。

需要的材料有:

  1. s8050 NPN型三极管1个

  2. 公对母杜邦线2根

  3. 母对母杜邦线2根

  4. 散热风扇1个

  5. 透明胶带 绝缘胶布

参考资料 -> 三极管起到开关作用,风扇负载连接方式

https://zhidao.baidu.com/question/602167737.html

咚,花了亿点点时间,做出来了一个“工匠级艺术品”:

虽然自己也不太清楚,但是不同接线的选色不要学我,不符合规范!

接线选色很迷惑我也是知道的,手头上材料并不是很充裕,有什么就用什么,根据示意图“施工”就对了(或者按照其他方式连接,异曲同工),最后在接到树莓派板子上,发射极跳线接在5v针脚,比如说pin4(5v);基极跳线接在GPIO,比如说pin8(GPIO14);风扇负极接地,比如说pin6(GND)。这个步骤需要小心行事,接错针脚可能会烧坏板子上的GPIO接口。

在命令行中输入 pinout ,查看树莓派的GPIO针脚布局。

如果没有这个命令,随便上网搜一下也行

电路布置完成后,接下来就是按照最开始的设置操作,利用现成工具开启温控风扇功能了,而且默认还是开机自启动,非常方便。

但这就结束了吗?如果我就是想学习如何使用树莓派GPIO硬件,亲自体验一下软件与硬件相结合的编程乐趣呢?虽然现成的工具确实能够达到我们的预期,也给我们的工作带来了极大的遍历,但学习这种事情不能马虎。所以,像我这样的小白,自己亲手实现一个Python脚本来实现温控风扇还是有可能的,说干就干。

参考文献:

  1. https://shumeipai.nxez.com/2017/07/13/raspberry-pi-to-achieve-temperature-monitoring-and-control-fan-cooling.html

  2. https://blog.csdn.net/aexus/article/details/106037040

花了亿点时间,写了一段简短的脚本代码,首先是需要使用到的工具库:

RPi.GPIO == 0.7.0

接着就是祖传的获取树莓派CPU当前温度代码片段

简单地获取树莓派CPU当前温度

其实上面的代码片段,其实和我之前写的用于监测树莓派状态模块中,有关树莓派CPU温度获取方法基本上是一致的,所以导入我之前编写的监测模块直接调用也是可以的。对脚本的限制越少越好用,为了能够让脚本独立运行,索性就将代码片段整合在一个脚本中。感兴趣的朋友可以看一下这篇文章:

为了方便起见,我直接写了一个类来实现伪智能温控风扇代码,注释应该都清楚地解释了每个属性的作用。至于我为什么另外设置风扇状态属性,在某些条件下可以避免重复设置GPIO针脚状态,这取决于风扇控制代码的具体实现,但大部分实现都是八九不离十的:

使用Java的思想来编写Python脚本确实有些奇怪,但有一定的意义

重点部分来了,下面是风扇控制代码的具体实现,并不是特别复杂:

实现温控风扇功能

当上面的代码构建完成之后,就可以编写程序入口,将脚本单独地跑起来了:

编写程序入口,启用温控风扇脚本

默认情况下,风扇GPIO跳线接在了pin8(GPIO14)针脚,正极接在了pin4(5v)针脚,负极接地pin6(GND)针脚,整整齐齐地靠在一起。为了显示脚本的工作状态,我在上述代码中稍微添加了一些打印代码片段,效果如下:

定期监测树莓派CPU当前温度,控制风扇启停

风扇也按照预期设想实现了伪智能温控散热的功能。呼,突然自我感觉良好了起来!虽然看似有些舍近求远,但是在付出几根头发的代价之后,你也变强了不是吗?[doge]

脚本源代码我已经提交到了Gitee公开仓库中,有需要的朋友可以自取研究或调整

https://gitee.com/greaterunoob/raspberry-pi-monitor

文章或脚本中出现的各类疏漏、错误或者代码不规范的地方,欢迎各位大佬在评论区批评指正!如果有更为简便、高效的代码片段,也欢迎在评论区分享交流,相互学习。

Raspberry Pi 伪智能散热风扇控制脚本的评论 (共 条)

分享到微博请遵守国家法律