夏天到了,气温越来越高了,小小树莓派的温度也快能烤肉了,我们得给树莓派增加一个主动扇热方式了。对了,就是给它安装一个 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 文件的内容,随时调整起转和停止温度的脚本文件。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Next Post

开发并上架自己的VSCode主题

周五 6 月 24 , 2022
半年前,我开发了自己的 VSCode 主题,并且上 […]