为树莓派制作个简单温控系统

树莓派 · 2021-04-25 · 66 人浏览
由于之前在树莓派上安排了不少东西,如frp、网盘等,又因为树莓派4B的功耗增加不少,导致整体散热偏高...(网盘这个坑后面填)59570-o7xe7u5bmu.png

温控原理

使用树莓派小风扇对其风冷散热,并且在三极管组成的简单电路下通过树莓派GPIO口输出PWM进行不同阶段温度的控制,使其可以在温度过高情况下减少PWM占空比加速散热、温度较低时静音慢速散热,减少因为长期高速运转产生的噪声,也同时增加了风扇寿命。


硬件准备

1、树莓派及优质电源线(推荐使用官方电源,第三方电源在风扇运转时容易出现低电压警告)
37037-bc14to444b8.png

2、树莓派小风扇 x1
3、三极管NPN8050 x1
4、电解电容100μF x1(理论上大部分电容都支持,起到稳定风扇作用,减少因风扇突然加速等产生的异响)
5、接插件 x5
6、杜邦线(母对母) x3


电路原理图

27324-bvr6ev9k4e6.png

三极管8050三个管脚顺序从平面、从左到右依次是发射极E基极B集电极C
本图中,风扇负极接入三极管的发射极E,树莓派上任意一个GPIO引脚接入三极管的基极B,树莓派上的GND接入三极管的集电极C
电容C1并联到风扇的两段,或者直接并联到接插件的1、3处,如果使用电解电容需要注意正负极

本电路无需焊接至电路板上,直接通过接线即可使用,且因为体积较小可以直接放入树莓派壳内,方便移动


程序控制

通过树莓派的GPIO引脚输出高电平以导通三极管,且通过PWM控制树莓派的转速,代码如下:

程序参考:https://blog.csdn.net/vince025/article/details/103749006
#!/usr/bin/python3
# encoding: utf-8
import RPi.GPIO
import time
RPi.GPIO.setwarnings(False)
RPi.GPIO.setmode(RPi.GPIO.BCM)
#下面多处14是我使用的BCM编码为14的GPIO,根据实际情况修改
RPi.GPIO.setup(14, RPi.GPIO.OUT)
pwm = RPi.GPIO.PWM(14, 75)
duty = 0
lastDuty = 0
try:
        while True:
            tmpFile = open('/sys/class/thermal/thermal_zone0/temp')
            temp = int(tmpFile.read())
            tmpFile.close()
            duty = 100;
            #以下内容可自由修改,duty为占空比,值越大速度越慢
            if temp < 40000:
                duty = 100
            if lastDuty >= 40000:
                duty = 75
            if temp >= 42000:
                duty = 60
            if temp >= 45000:
                duty = 50
            if temp >= 50000:
                duty = 25
            if temp >= 55000:
                duty = 10
            #----------------
            if duty == 100:
                pwm.stop()
                time.sleep(.2)
                RPi.GPIO.output(14, RPi.GPIO.LOW)
            if duty == 0:
                pwm.stop()
                time.sleep(.2)
                RPi.GPIO.output(14, RPi.GPIO.HIGH)
            if duty > 0 and duty < 100:
                if lastDuty == 0 or lastDuty == 100:
                    pwm.start(0)
                    time.sleep(1)
                pwm.ChangeDutyCycle(duty)
            lastDuty = duty
            #print(duty,temp)
            time.sleep(5)
except KeyboardInterrupt:
    pass
pwm.stop()
time.sleep(1)
RPi.GPIO.output(14, RPi.GPIO.LOW)
程序二参考:https://tieba.baidu.com/p/4238265567?red_tag=2276462921
#!/usr/bin/env python3
# encoding: utf-8
import RPi.GPIO
import time
RPi.GPIO.setwarnings(False)
RPi.GPIO.setmode(RPi.GPIO.BCM)
#下面多处14是我使用的BCM编码为14的GPIO,根据实际情况修改
RPi.GPIO.setup(14, RPi.GPIO.OUT)
pwm = RPi.GPIO.PWM(14, 75)
speed = 0
prv_temp =0
try:
    while True:
        tmpFile = open( '/sys/class/thermal/thermal_zone0/temp' )
        cpu_temp = int(tmpFile.read())
        tmpFile.close()
        if cpu_temp>=35000:
            if prv_temp<35000 :
                pwm.start(0)
                pwm.ChangeDutyCycle(100)
                time.sleep(.1)
            speed = min( cpu_temp/125-257 , 100 )
            pwm.ChangeDutyCycle(speed)
        else :
            pwm.stop()
        prv_temp = cpu_temp
        print(speed,cpu_temp)
        time.sleep(5)
except KeyboardInterrupt:
    pass
pwm.stop()

以上为python3代码,树莓派中运行需要使用python3 fan.py运行


开机自动运行

方法同上一篇文章用云服务器搭建自己的Frp服务

cd /lib/systemd/system
sudo nano fan.service

编辑启动项:

[Unit]
Description=frp service
After=network.target

[Service]
TimeoutStartSec=30
ExecStart=python3 #文件完整路径,如/home/pi/fan.py
ExecStop=/bin/kill $MAINPID

[Install]
WantedBy=multi-user.target

保存并退出后,使用systemctl start fan即可在后台启动温控程序
使用systemctl status fan可以查看运行状态,如果前面代码中print未被注释可以看到实时温度以及占空比
使用systemctl enable fan即可开机启动该程序

85536-wnbpibab4jj.png


本篇文章到此结束,需要更多内容请持续关注本博客!

树莓派 电子 手工
Theme Jasmine by Kent Liao
皖公网安备34122202000364号