树莓派4B性能强大,发热也大,我在上面跑可道云和aria2,在没有风扇的情况下基本都要到60-70℃了,通常都会买个外壳接一个小风扇用于散热,淘宝上有很多,挑一个自己喜欢的,我这台设备加了风扇后可以稳定在40-50之间
默认情况下,风扇是随着电源开关控制的,即使关机了,风扇也会转,这里介绍使用三极管控制风扇开关的方法
接线引脚
树莓派4B的引脚如下图
买来的风扇的正负极接4, 6引脚
通过三极管添加控制线
风扇接上树莓派引脚后就会开启,随电源开关,无法进行控制,关机的时候也会转,通常有两种方式
- 使用三极管接线从而达到控制风扇的目的
- taobao买T9温控模块(https://item.taobao.com/item.htm?id=553295324487)
这里第一种方式,添加三极管
三极管
,我这里用的是S8050(NPN型)的三极管
我是在这里买的,2.8块钱50个
杜邦线-公对母
: 2根
杜邦线-母对母
: 2根
三极管三级
接线示意图(分别接到4,6,12号引脚上)
效果图
有朋友可能买到的是S8850(PNP型)的三极管,接线和上面不一样,需要注意,可以参考这个链接,不过我没试过,https://blog.csdn.net/Xxy605/article/details/115960846
接完之后开机,会发现风扇默认是不转的,我们需要手动控制风扇的开关
通过python脚本控制开关
安装依赖文件
1 2 3 4 5
| sudo apt update sudo apt install python3-pip
sudo apt -y install python3-rpi.gpio sudo pip install RPi.GPIO
|
下面脚本控制风扇开关
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
| import RPi.GPIO as GPIO
FAN = 12
GPIO.setwarnings(False) GPIO.setmode(GPIO.BOARD)
GPIO.setup(FAN, GPIO.OUT)
GPIO.output(FAN, GPIO.HIGH)
GPIO.output(FAN, GPIO.LOW)
GPIO.setup(FAN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
isOff = GPIO.input(FAN) == GPIO.LOW;
GPIO.cleanup()
|
可以PWM
控制风扇的风速
1 2 3 4 5 6 7
| pwm = GPIO.PWM(FAN, 50)
pwm.start(100)
pwm.stop()
|
查看CPU温度
通过读取文件/sys/class/thermal/thermal_zone0/temp
获得CPU温度
1 2 3 4 5
| cat /sys/class/thermal/thermal_zone0/temp
watch -n 1 cat /sys/class/thermal/thermal_zone0/temp
|
温控风扇脚本
下面是通过温度控制风扇开关的脚本(由于我的风扇比较小,就没有考虑控制风速,只做开关)
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 48 49
| import RPi.GPIO as GPIO import time
FAN_GPIO = 12
MIN_TEMP = 45
MAX_TEMP = 50
SAMPLING = 60
def get_cpu_temp(): with open('/sys/class/thermal/thermal_zone0/temp') as f: cpu_temp = int(f.read()) return cpu_temp def main(): GPIO.setwarnings(False) GPIO.setmode(GPIO.BOARD) GPIO.setup(FAN_GPIO, GPIO.OUT) GPIO.output(FAN_GPIO, GPIO.LOW) time.sleep(5) try: while 1: temp = get_cpu_temp() print('CPU temperature:', temp) if temp < MIN_TEMP * 1000: GPIO.output(FAN_GPIO, 0) elif temp > MAX_TEMP * 1000: GPIO.output(FAN_GPIO, 1) else: GPIO.output(FAN_GPIO, 1) time.sleep(SAMPLING) except KeyboardInterrupt: pass GPIO.cleanup()
if __name__ == '__main__': main()
|
脚本保存到/home/ubuntu/server/fan/autofan.py
开机启动
创建service(/etc/systemd/system/autofan.service
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| [Unit] Description=auto fan control After=syslog.target After=network.target
[Service] RestartSec=2s User=root Group=root WorkingDirectory=/home/ubuntu/server/fan/ ExecStart=/usr/bin/python3 /home/ubuntu/server/fan/autofan.py
[Install] WantedBy=multi-user.target
|
刷新并加载
1 2 3 4 5 6 7 8
| sudo systemctl daemon-reload
sudo systemctl enable autofan
sudo systemctl start autofan
sudo systemctl status autofan
|
之后每次重启都会自动根据温度开关风扇了