根据树莓派CPU温度自动控制风扇转停

购买树莓派也有一段时日了,当然了,几乎也是处于吃灰状态。

给树莓派安装过风扇的人都知道,如果给风扇接入5V的GPIO下,风扇的声音大到像是在拆家。 所以我机智的接入了3.5V稍微柔和了那么一点,去年跑了一整个夏天。

当时有一个想法是:我们可以通过 cat /sys/class/thermal/thermal_zone0/temp获得CPU的实时温度,那么判断这个值的大小,大于设定值让风扇工作,等待CPU的温度降下来到一个设定的温度就让风扇停止工作。

但是想法总是一闪而过也没有具体去做操作。

后来也看到了树莓派实现温度监控并控制风扇散热,但当时也没时间去做。

随着时间又来到了四月,树莓派的CPU温度逐渐又攀高了。 又看了一篇文树莓派配置自动风扇才想起来这个坑还没有填,所以今年让风扇也休息一下吧。

准备材料

以下列出材料类目,打出的价格都是含邮费的(包邮呀)

  • 400孔面包板 x 1
  • 杜邦线 x 40
  • 面包板插线 x 65
  • S9014三极管 x 20

实际上用不完这些材料的,但,人家卖家就这样卖,而且还巨便宜,还能怎么办?

20180416172421.jpg

连线参考图片

这里先搬几张图片吧。

  • 树莓派40pin引脚对照图 rpi-pins-40-0.png
  • 参考的连线图1 20170713170656938-0.jpg
  • 参考的连线图2 a16f0b7d9ee46c474d55ff4eb6011915.png
  • S9014三极管结构 c4163ecc42465394e96d85734a7cd52a.jpg

三极管的E接正极,B接GPIO口,C接风扇的负极。B口建议再加上一个1K的电阻,防止三极管过热。(我使用的S9014没有使用1K电阻,看下来问题不大,反正挂了我还有19个 XD)

实际连线

  • 简版

20180416183826.jpg

  • 复杂化版

20180416183834.jpg

踩到的一些坑

  • 面包板连接线有几根有问题,导致电路不通,坑死QAQ,一根一根测试连接线。
  • 参考别人的python脚本运行有问题,还得感谢echo少年的倾情解答。

代码

代码从TesterHome抄的,我加了一些注释~

 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
44
45
46
47
#!/usr/bin/python2
#coding:utf8
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 = 40
    GPIO.setmode(GPIO.BOARD)
    GPIO.setwarnings(False)
    #GPIO物理引脚BOARD编码

    # close air fan first
    GPIO.setup(channel, GPIO.OUT, initial=GPIO.HIGH)
    #初始化风扇状态,实际测试下来,改成以下代码会更好哇?
    #GPIO.setup(channel, GPIO.OUT, initial=GPIO.LOW)
    is_close = True
    while True:
        temp = cpu_temp()
        if is_close:
            if temp > 50.0:
                #CPU温度超过50度打开风扇
                print time.ctime(), temp, 'open air fan'
                GPIO.output(channel, GPIO.HIGH)
                is_close = False
        else:
            if temp < 40.0:
                #CPU温度小于40度关闭风扇
                print time.ctime(), temp, 'close air fan'
                GPIO.output(channel, GPIO.LOW)
                is_close = True

        time.sleep(30.0)
        print time.ctime(), temp


if __name__ == '__main__':
    main()

将上面的代码复制粘贴保存为fan.py 然后运行脚本就O了python fan.py

当然了,最好的方法当然是用守护程序以及设置为开机自启动脚本了。

推荐使用PM2~

1
2
3
pm2 start fan.py -n auto-Fan
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi
pm2 save
点击刷新🚌