为了防止树莓派长时间开机运转温度过高导致触发过热关机,很多人都给装了散热风扇,但某宝买的风扇插上之后是随着开机一直运转的,不能随温度变化而自动开闭,很多时候做无用功浪费电且产生噪音。本文将以一个硬件小白的程序员视角详细讲述如何用三极管扩展普通的树莓派散热风扇从而实现温控功能。

三极管与风扇组装与编写python脚本

在制作自己的温控风扇前,本人也查阅了网上其他资料,最终选用了三极管方案,在接线方式中选择了自制杜邦线连接三极管和风扇,这样的好处是线材的长度可以随自己需要裁剪,而且可以轻松塞进树莓派的外壳中。全程无焊接,以后不用也可方便拆卸线材、杜邦头、三极管元件等用作其他用途。

准备材料

以下材料均可某宝购买,为了省事其中杜邦头和杜邦胶壳是买的套件,一盒里边有公母端子各200个,以及各种类型的胶壳。
1.树莓派散热风扇
2.杜邦线
3.三极管S8550

第一步:接线


第二步:写驱动程序

执行驱动脚本前需要安装相关依赖yum install -y python-devel,以及RPi.GPIO模块
wget https://link.segmentfault.com/?enc=icmzpVF96GFYqsyL2oI8vw%3D%3D.NZ%2F%2Bh1fHum%2Flz7bmUPouwTHUsHE6HZ962%2BlYNkkVZJO4ZQnbTDjCfiTIKb1hy7lctpbNeYIuOK7ZU3w%2BWfj1eb0TEBBqXw1GgLcPh%2FqT5vc%2BOk%2F2sqjwULL7bdZUk8jY

附上驱动代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/usr/bin/python3
import sys
import time
try:
import RPi.GPIO as GPIO
except RuntimeError:
print("Error importing RPi.GPIO! This is probably because you need superuser privileges. You can achieve this by using 'sudo' to run your script")


def cpu_temp():
with open("/sys/class/thermal/thermal_zone0/temp", 'r') as f:
return float(f.read())/1000


def main():
channel = 14
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

# open air fan first
GPIO.setup(channel, GPIO.OUT, initial=GPIO.LOW)
is_close = False
while True:
temp = cpu_temp()
if is_close == True:
if temp > 60.0:
# print("open air fan")
GPIO.output(channel, GPIO.LOW)
is_close = False
else:
if temp < 55.0:
# print time.ctime(), temp, 'close air fan'
# print("close air fan")
GPIO.output(channel, GPIO.HIGH)
is_close = True

time.sleep(15.0)
#print time.ctime(), temp, is_close


if __name__ == '__main__':
main()

保存到/usr/local/scripts/目录下
注意:因为这里使用的三极管为PNP型三极管,基极施加低电平时才导通电路,如果是用的NPN型三极管则与之相反。

本人的启动脚本:nohup python -u /usr/local/scripts/pi_fan.py >/usr/local/scripts/tempctl.log 2>&1 &
如有需要可自己注册为服务并设置开机自启,这里不再赘述。

最终成果:

设置脚本后台运行和开机自动启动

添加脚本到 init.d 目录,这个目录包含在引导过程中启动的脚本(这里的所有程序都是在关闭或重新引导系统时执行的)。

修改程序文件的权限

1
sudo chmod 777 pi_fan.py

进入 init.d 目录

1
cd /etc/init.d

创建一个文件名为pi_fan

1
sudo touch pi_fan

编辑pi_fan文件

1
vi pi_fan

添加以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/sh
### BEGIN INIT INFO
# Provides: test
# Required-Start: $remote_fs
# Required-Stop: $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start or stop the HTTP Proxy.
### END INIT INFO
case $1 in
start)
nohup python3 /usr/local/scripts/pi_fan.py &
;;
stop)
;;
*)
echo "Usage: $0 (start|stop)"
;;
esac

保存退出,然后修改此文件的权限

1
sudo chmod 777 pi_fan

设置开机自启

1
sudo update-rc.d pi_fan defaults

启动服务

1
sudo service pi_fan start

重启

1
sudo reboot

停止服务

1
sudo service pi_fan stop

取消开机自动运行

1
sudo update-rc.d pi_fan remove

参考:https://segmentfault.com/a/1190000017225701