我的树莓派3B放在客厅,估计是长期磨损加上灰尘的原因,最近小散热扇声音特别大,逼得我必须做一个智能风扇了。
大家也想做的话跟着我的步骤即可实现,不用再去网上研究各种细节问题了。
采购
杜邦线
为了避免焊接,我们要用杜邦线:
杜邦线 母对母 公对母公对公40P彩色排线连接线10/15/30/20/40CM
大家把”公母”,”母母”,”公公”都买一下,以后都会用到的。
40P的意思就是40根,不是什么连起来的意思,都可以拆成1根1根的用。
电阻
我们会在电路里串联一个电阻降低电流,避免三极管发热,大家照做即可:
Quason 1K 1/4W金属膜电阻 1% 五色环0.25W 编带装100只1.5元
电阻是1K欧姆的。
三极管
三极管顾名思义有3个插头,其中2个是走正负极电的,中间1个是GPIO控制三极管是否开关的,从而可以GPIO编程控制电流的流通与断开,实现智能风扇。
三极管 S9012 9012 PNP小功率晶体管 封装TO-92 50只
大家一定要买PNP的,和我的教程才能完全吻合,型号照着买就行,我也是随便选了一个小功率的,应该都能用。
硬件安装
这是我的安装结果:
先用杜邦线,把树莓派的5V和风扇的红线(正极)连到一起,这样电就走到风扇正极了,但此时电路还没接地,没有电流通过。
再拿一个杜邦线,把风扇的黑线(负极)和三极管的e极(发射)接到一块,这样电就从风扇走到了三极管了。
这里的问题就是三极管的3个针脚,哪个是e啊?
把扁平的一边面向自己,照着图看就行。
再拿一根杜邦线,把三极管的c极(集电)和树莓派的GND地线接到一起,这样电就流经三极管到达地面了,电通路就完整了。
此时风扇是不会转的,因为PNP三极管默认是断开的,除非给向它的b极(基极)输出低电平,而我们知道树莓派上的GPIO口就是拿来输出高或者低电平的。
但是别急,这里咱不能让b极直接接GPIO口,这样运行的时候电流太大对三极管不好。
拿出一根杜邦线,再拿1个1k欧姆的电阻,把三极管b极和电阻接起来。
拿出一根杜邦线,把电阻另一头和某个GPIO针脚连起来,我用的是18号GIPO针脚。
不知道GPIO引脚布局? 看下图:
现在三极管b极就和GPIO联通了,并且中间有个电阻来降低电流。
整个硬件安装结束,下图是电路的一个示意图:
连接的位置很松动,我用绝缘胶随便缠了一下,因为杜邦线太长放不到外壳里面了,所以就露在外面拉倒。
软件
我们写个常驻的程序,检测树莓派温度,如果高于某个温度就输出低电平,三极管就通电了,否则输出高电平,风扇就不转了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# -*- coding: utf-8 -*- from RPi import GPIO import time # 超过50度启动 upper_temp = 50 # 低于40度关闭 lower_temp = 40 # 采用BCM引脚编号 GPIO.setmode(GPIO.BCM) # 关闭警告 GPIO.setwarnings(False) # 控制三级管的GPIO编号 channel = 18 # 初始GPIO输出高电平, 风扇不转 GPIO.setup(channel, GPIO.OUT, initial = GPIO.HIGH) # 获取树莓派温度的函数 def get_temp(): with open('/sys/class/thermal/thermal_zone0/temp') as fp: return int(fp.read()) / 1000 # 进入检测 try: while True: # 获取当前温度 temp = get_temp() # 如果大于上限, 则给低电平, 闭合三极管 if temp >= upper_temp: GPIO.output(channel, GPIO.LOW) elif temp < lower_temp: # 低于下限, 则给高电平, 断开三极管 GPIO.output(channel, GPIO.HIGH) # 每隔10秒检测1次 time.sleep(10) except Exception, e: print(e) # 重置GPIO状态 GPIO.cleanup() |
开机启动
为了开机启动,以及脚本异常重启,我们利用systemctl来实现守护进程。
编辑文件: /etc/systemd/system/pi-temp.service,其中pi-temp是服务的名字,你可以起自己喜欢的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[Unit] # 服务描述 Description=smart fan [Service] # 简单服务 Type=simple # 运行用户与用户组 User=pi Group=pi # 进程退出立即重启 Restart=always # 执行命令 ExecStart=/usr/bin/python /home/pi/pi-temp/daemon.py [Install] # 在系统启动后加载UNIT WantedBy=multi-user.target |
你根据脚本位置,修改执行命令即可。
现在让这个service生效:
1 |
sudo systemctl enable pi-temp.service |
立即启动服务:
1 |
sudo systemctl start pi-temp.service |
现在无论是强制杀死python脚本还是重启机器,脚本都会重新拉起,确保始终工作。
有问题欢迎留言交流,我不懂电路但我也一次成功了,说明还是很简单的。
如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~

放个金鱼片,用导热系数1左右的导热胶,不要用自带的胶片.室温20时,CPU温度基本保持在40-45之间,没必要用风扇,这种小风扇实测功率1w,一年的电费刚好买金鱼片和导热胶.
骚
按照大神的方法做了一个,很好用,10多块解决大问题。还过了一把DIY 的瘾。感谢分享。
打赏一下我!
呵呵 通俗易懂,博主是电子专业的吗,想咨询一下,要像你这么优秀应该掌握哪几门基本课程
我是软件工程师,我只是研究明白了分享出来。
问一下 杜邦线是母对母吗
我好像写了。
看到了🤔
我家三极管没接电阻 测下温度 87摄氏度
npn管高电平导通,pnp管低电平导通.
自闭中 买错npn 捣鼓半天
可惜
GPIO高电平就是3.3V,接PNP怎么样跟E极5V都有压差,那不是永远都是在通路了么?为啥你的能工作,感觉这种要用 NPN才行啊。
知道了,你的风扇流过之后,做了降压了
我的文章借鉴了一下你的博客,请批准
文章链接http://yyuzh.xyz/2020/02/25/raspi_smart_fan/
我看了一下你画的灵魂接图,算了一下,是不是只要母对母的杜邦线就可以了?电阻是不是可以直接插到杜邦线母头里面?
搞定了,事实证明只需母对母的杜邦线就可以搞定。但是碰上另外一个问题惹,Raspbian里面运作正常。可是我用的Openfans的Deepin,脚本不起作用….
1