Raspberry Pi 伪智能散热风扇控制脚本
我们知道树莓派4B在各大性能方面有较大提升的同时,其发热量同样也是惊人的,普通室温环境下,树莓派空载温度都可以稳定地维持在40+℃,所以通过加装一般的2pin散热风扇,以达到温控的目的。缺点就是风扇只要加电就会一直处于启动状态,不仅会长时间产生扰人的噪音,也会浪费多余的电能、缩短风扇电机寿命等问题。
因此,能够像普通个人计算机那样、根据当前CPU温度选择是否开启风扇散热的需求就产孕育而生了。该怎么实现呢?有没有现成的解决方案呢?想起刚刚入手树莓派4B、配置开发板初始环境(Raspberry pi os)的时候,在raspi-config工具中遇到的一个风扇控制功能:
在命令行中输入: sudo raspi-config ,随即进入了一个模拟图形配置界面
选择 Performance Options -> Fan -> Enable fan temperature control -> Pin -> Temperature





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

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

对于我这样很少接触硬件电路的小白来说,还算是比较简单的电路。花个亿点点时间应该可以仿一个出来。
需要的材料有:
s8050 NPN型三极管1个
公对母杜邦线2根
母对母杜邦线2根
散热风扇1个
透明胶带 绝缘胶布
参考资料 -> 三极管起到开关作用,风扇负载连接方式
https://zhidao.baidu.com/question/602167737.html
咚,花了亿点点时间,做出来了一个“工匠级艺术品”:

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

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

但这就结束了吗?如果我就是想学习如何使用树莓派GPIO硬件,亲自体验一下软件与硬件相结合的编程乐趣呢?虽然现成的工具确实能够达到我们的预期,也给我们的工作带来了极大的遍历,但学习这种事情不能马虎。所以,像我这样的小白,自己亲手实现一个Python脚本来实现温控风扇还是有可能的,说干就干。
参考文献:
https://shumeipai.nxez.com/2017/07/13/raspberry-pi-to-achieve-temperature-monitoring-and-control-fan-cooling.html
https://blog.csdn.net/aexus/article/details/106037040
花了亿点时间,写了一段简短的脚本代码,首先是需要使用到的工具库:

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

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

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

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

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

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

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

脚本源代码我已经提交到了Gitee公开仓库中,有需要的朋友可以自取研究或调整
https://gitee.com/greaterunoob/raspberry-pi-monitor
文章或脚本中出现的各类疏漏、错误或者代码不规范的地方,欢迎各位大佬在评论区批评指正!如果有更为简便、高效的代码片段,也欢迎在评论区分享交流,相互学习。