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

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

树莓派是什么?

是一个 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 条回复 时间 点赞

极客说的就是你。

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

欢迎更多的树莓派分享

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

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

0x88 回复

是树莓派的一种吗

codeskyblue 回复

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

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

0x88 回复

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

理工科生的世界好神奇啊

6666666666

会玩👍

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

steven 回复

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

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

snake 回复

手机集群管理

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

写的好棒啊

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

Mingway_Hu 回复

50 度以下其实就很好了

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

HG 回复

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

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

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

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

方法二的代码明显错了!

ddi 回复

小弟不才,愿闻其详

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

还有 channel=18 哪里来的

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