夏天到了,气温越来越高了,小小树莓派的温度也快能烤肉了,我们得给树莓派增加一个主动扇热方式了。对了,就是给它安装一个 PWM 风扇。
什么是PWM风扇?
如果你的树莓派装的是 2 pin 的风扇,那么通电即开启,时间长了风扇的噪音也会很大,比较烦人。所以我这里使用 PWM 风扇。
PWM 是脉冲宽度调制的意思,可以通过数字输出来对模拟电路进行控制,从而达到控制风扇的目的。PWM 风扇有很多,大家可以自行选择。
这种一体变速式的 PWM 风扇(左),或者 4 pin 的 PWM 风扇(右),都是树莓派可用的 PWM 风扇。
控制PWM风扇
安装好后,我们需要给 PWM 风扇进行一些控制设置,以控制它什么时候转、什么时候停止。通常有如下几种方法,可以方便的控制 PWM 风扇。
1. Raspiberry OS 控制方法
如果你的树莓派使用的是 Raspiberry OS(原 Raspbain),那么可以使用系统自带的控制方式。进入到树莓派的桌面,打开树莓派的设置,在 Performance 下找到 Fan GPIO,设置你使用的 GPIO 控制编号,以及风扇的起转温度。
值得注意的是,Raspiberry OS 自带的这个温度控制,最低起转温度为 60℃,不支持设置为 60℃ 一下。风扇的停止条件是,温度降低 5℃,即当 CPU 温度为 55℃以下,风扇才会停止转动。
2. 手动设置 config.txt 配置
因为 Raspiberry OS 自带的温度控制,最低起转温度为 60℃,如果我们想要更低的起转温度,就要手动进行设置。config.txt 是 Raspiberry OS 的一个配置文件,当每次启动系统时会进行读取和设置。
首先,我们现在设置中关闭 Fan 的控制,设置为 Disable。我们打开终端,输入:
sudo nano /boot/config.txt # 你可能需要切换为 root 用户 su root
此时会打开这个配置文件,然后我们加入一下配置信息:
# Raspi pwm fan dtoverlay=gpio-fan,gpiopin=18,temp=52000 # gpiopin 是引脚编号,temp 是起转温度,52000 表示 52 ℃
按 Ctrl + O 写入,然后按 Ctrl + X 退出,然后重启设备即可。
此时树莓派风扇的起转温度为你设置的温度,停止温度为你设置的温度 -5℃
3. Shell 终端手动控制方法
如果你想通过 Shell 来手动控制 PWM 的转动,那可以这样:
# 进入 Python 模式 python # 引入库 import RPi.GPIO as GPIO # GPIO 设置 GPIO.setmode(GPIO.BCM) GPIO.setup(18,GPIO.OUT) # 高电平,开风扇 GPIO.output(18,GPIO.HIGH) # 低电平,关风扇 GPIO.output(18,GPIO.LOW) # 退出并清理 GPIO.cleanup()
4. Python GPIO 库控制方法
我们还可以利用 Python 脚本,并且进行服务的创建,达到开机自动启动并运行的目的。我写了一个 autofan.py 的脚本文件如下:
# -*- coding: utf-8 -*- import RPi.GPIO as GPIO import time # 控制风扇的 GPIO FAN_GPIO = 18 # 低温阈值,低于它则关闭风扇 MIN_TEMP = 48 # 高温阈值,高于它则全速运转 MAX_TEMP = 52 # 多长时间读取一次CPU温度,单位秒 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.BCM) 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()
将上述代码保存为 autofan.py 文件,放到 /pi/fan/autofan.py。然后创建一个 Service,放到 /etc/systemd/system,用于开机自动启动这个脚本:
sudo nano /etc/systemd/system/autofan.service
[Unit] Description=auto fan control After=syslog.target After=network.target [Service] RestartSec=2s User=pi Group=pi WorkingDirectory=/home/pi/fan/ ExecStart=/usr/bin/python3 /home/pi/fan/autofan.py [Install] WantedBy=multi-user.target
然后刷新并加载:
# 重新加载配置 sudo systemctl daemon-reload # 开机启动 sudo systemctl enable autofan # 启动 sudo systemctl start autofan # 状态 sudo systemctl status autofan
这样做的好处是,你可以随时通过手机连接 smb 协议,然后随时修改 autofan.py 文件的内容,随时调整起转和停止温度的脚本文件。