通用技术 树莓派 根据 CPU 温度控制风扇起停

codeskyblue · 2017年03月22日 · 最后由 ddi 回复于 2018年06月03日 · 5925 次阅读
本帖已被设为精华帖!

树莓派是什么?

是一个 mini 版的 PC,麻雀虽小,五脏俱全,信用卡大小一般的版子,网口,USB 口,基本功能一个都不少。而价格只要 200 块钱左右。

为什么要散热

树莓派可以 24 小时开着,耗电非常少。然而还是会发热的,70 度以上就会触发它过热关机了,尤其是夏天快到了,很容易就把树莓派给烧了。
记得有一个夏天,我把树莓派放在屋里,上面运行了一个 git 服务器,等我晚上回来的时候,一股烧焦的味道就飘了过来。从那以后树莓派的散热我一定会优先考虑。

方法 1: 散热片

散热片,淘宝上的价格通常在 5 元以下,散热片基本可以解决绝大部分的散热问题。通常购买树莓派的时候,店主也会赠送。

方法 2: 散热风扇(三极管方案)

考虑到更恶劣的情况下,还需要再加一个风扇。风扇通常有两种,直径 2cm 和直径 4cm 的。实际使用时发现 2cm 的风量实在是太小,最后直接换了 4cm 的大口径风扇。
风扇开着有点吵,而且开的时间太久了的话,风扇还容易坏掉。所以研究了一下,弄出来一个根据 CPU 温度自动控制风扇起停的方案。

树莓派的 GPIO 口输出电流很低,无法带动风扇,所以还需要一个三极管来放大电流。
我用的型号是 S9012PNP,价格差不多是 3 分钱一个。

原理图大概这个样子

三极管的 E 接正极(右上角第二个),B 接 GPIO 口(建议用 21 号口,最右下方,比较好找),C 接风扇的负极(右上角第三个)。B 口建议再加上一个 1K 的电阻,防止三极管过热。

温度传感器是 CPU 内置的,通过读取系统的
/sys/class/thermal/thermal_zone0/temp文件就可以获取到温度。用 Python 代码就是

def cpu_temp():
    with open("/sys/class/thermal/thermal_zone0/temp", 'r') as f:
        return float(f.read())/1000

而 GPIO 口的电压高低可以通过 python 的 RPi.GPIO 库来控制。比如想设置 IO-21 号口为高电平,代码是

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(21, GPIO.OUT)
GPIO.output(21, GPIO.HIGH)

整合起来的代码如下

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 = 18
    GPIO.setmode(GPIO.BOARD)
    GPIO.setwarnings(False)

    # close air fan first
    GPIO.setup(channel, GPIO.OUT, initial=GPIO.HIGH)
    is_close = True
    while True:
        temp = cpu_temp()
        if is_close:
            if temp > 45.0:
                print time.ctime(), temp, 'open air fan'
                GPIO.output(channel, GPIO.HIGH)
                is_close = False
        else:
            if temp < 38.0:
                print time.ctime(), temp, 'close air fan'
                GPIO.output(channel, GPIO.LOW)
                is_close = True

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


if __name__ == '__main__':
    main()

代码中使用了双区间,从而避免了温度变化时,风扇状态的频繁变化。
实际的布线图,则是多加了一个二极灯(主要是为了方便看),面包版直接贴到外壳的侧面。

方法 3:风扇(继电器)

最近发现用继电器也很方便,简单了画了一个连线图

继电器实在淘宝上买的,才 5 块钱,挺便宜的,当时买的时候还包邮。附上购买链接,仅供参考

最后的效果图

大功告成。

当风扇转的时候,二极灯也跟着亮起来。
之后真的就可以整夜整夜的开着树莓派,而不用担心过热的问题了。每当树莓派 CPU 高速运转的时候,风扇就会转起来,其他时候,风扇就会安静下来。用手感觉一下 CPU 的温度,凉凉的,非常好。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 27 条回复 时间 点赞

我照做了才发现不对
明明说 close air fan first,setup 这里是 GPIO.HIGH
'open air fan'这里还是 HIGH,下面 close 这里却是 LOW 了,矛盾

还有 channel=18 哪里来的

ddi 回复

小弟不才,愿闻其详

方法二的代码明显错了!

lvpengbo 回复

你淘宝上搜索下 USB 风扇,那种是 5V 的也可以

仅楼主可见
codeskyblue 树莓派 显示时间 中提及了此贴 03月02日 15:35

扩展得焊板,手法太烂玩不转啊

HG 回复

我这问题不大了,其他问题基本都被我搞定了

会有关机情况么, 还没遇到过, 装了风扇就好了么

Mingway_Hu 回复

50 度以下其实就很好了

666~
感觉风扇一直开着也凉不下来,始终 35 度多,稍微搞搞就四五十度~买错了不带字库 LCD 屏,只好做实时显示温度了😂

写的好棒啊

codeskyblue 树莓派 开机自动启动应用 中提及了此贴 03月27日 13:35
snake 回复

手机集群管理

@codeskyblue 你用树莓派来做什么呢?

steven 回复

我是根本就没有入门,就直接开始了

楼主,小白类型的也想入手一个,入门级有没有什么推荐和学习资料分享?

会玩👍

6666666666

理工科生的世界好神奇啊

0x88 回复

淘宝上一大堆,挑的眼花。算了,还是整树莓派吧

简单实用,我回家也试试。

codeskyblue 回复

是的,高仿树莓派😂 以前研究过一段时间,性能什么都还不错,重点是有技术支持。据说销量很好,淘宝上面应该可以买到,或者直接去问下珠海全志。

0x88 回复

是树莓派的一种吗

全志的 cubieboard 应该有全套方案。

赞,前几天刚看到树莓派卖出 1200 万

欢迎更多的树莓派分享

恒温 将本帖设为了精华贴 03月22日 19:15

极客说的就是你。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册