树莓派 温度监控 PWM 控制风扇 shell python c 语言
Mine:
图中圈出来的是三极管 和滤波电容
依赖库: wiringPi
sudo apt-get install wiringpi
Shell脚本
本文介绍使用Shell脚本在树莓派上启用软件PWM控制风扇转速。
最新版本下载地址https://github.com/tankririri/RaspberryPi_CPU_PWM
硬件需求
树莓派(这里用的3代B);
5V小风扇;
NPN三极管,我用的s8050;
面包板加杜邦线,或者用电烙铁。
硬件接法:
先把电扇直接接到树莓派上测试一下哪根线是+极,然后把风扇+极直接接在树莓派的5V上,-极接在三极管集电极Collector。
(从三极管平的那面看)
三极管发射极Emitter接树莓派GND,基极Base接树莓派Pin12#(GPIO18)(GPIO_GEN1),资料表明只有这个针脚可以启用软件pwm,其他针脚我也没有试过。
软件需求
安装GPIO驱动,这里使用C语言编写的wiringPi,安装步骤看这里。
在按照上面的方法连接好风扇以后,风扇是不会转的,此时可以先手动控制风扇测试一下,在终端中输入以下命令开启风扇
gpio mode 1 pwm gpio pwm 1 1023
正常情况下风扇应该会开始全速运转。
可以使用gpio readall命令查看针脚信息,针脚模式应该显示ALT5,见下图。
设置风扇自动调速:
新建一个cpu_fan.sh文件,输入以下内容
#!/bin/sh #sleep 5 #设置运行状态文件 RUN=/var/run/cpu-fan.run touch $RUN chmod 777 $RUN #设置风扇默认运行模式,0为关闭,1为全速,2为自动,运行过程中可以直接修改/var/run/cpu-fan.run文件来生效 echo "2" > $RUN #设置开启风扇的最低温度 set_temp_min=35000 #设置关闭风扇温度比最低温度小1度 shutdown_temp=`expr $set_temp_min - 1000` #设置风扇全速运行的温度 set_temp_max=70000 #开机风扇全速运行 #默认的pwm值范围是0~1023 gpio mode 1 pwm gpio pwm 1 1023 #初始化参数 fan=0 while true do #获取cpu温度 tmp=`cat /sys/class/thermal/thermal_zone0/temp` status=`cat $RUN` #计算pwm值,从变量set_temp_min设置的温度开始开启风扇,最低转速50% pwm=$((($tmp-$set_temp_min)*512/($set_temp_max-$set_temp_min)+511)) #设置pwm值上限 if [ $pwm -gt 1023 ] ;then pwm=1023 fi #小于设置温度关闭风扇 if [ $tmp -le $shutdown_temp ] ;then pwm=0 fan=0 else #第一次超过设置温度全速开启风扇,防止风扇不能启动 if [ $tmp -gt $set_temp_min ] && [ $fan -eq 0 ] ;then gpio pwm 1 1023 fan=1 sleep 5 fi fi #检查run文件,为0时关闭风扇 if [ $status -eq 0 ] ;then pwm=0 fan=0 else #检查run文件,为1时持续开启风扇最高转速 if [ $status -eq 1 ] ;then pwm=1023 fi fi gpio pwm 1 $pwm #每5秒钟检查一次温度 sleep 5 #输出日志,不需要的可注释掉 echo "`date` temp=$tmp pwm=$pwm status=$status" >> /var/log/cpu-fan/cpu-fan.log done
最新版本下载地址https://github.com/tankririri/RaspberryPi_CPU_PWM
配置日志自动管理:
新建/etc/logrotate.d/cpu-fan文件,输入以下内容
/var/log/cpu-fan/cpu-fan.log { su root rotate 7 daily compress delaycompress missingok notifempty create 666 root root }
由于脚本运行在一般用户下,所以对日志文件的访问会产生权限问题,第一次运行的时候需要将/var/log/cpu-fan/cpu-fan.log文件的组和拥有者改为root,文件权限改为666
mkdir /var/log/cpu-fan chown root:root /var/log/cpu-fan chmod 777 /var/log/cpu-fan touch /var/log/cpu-fan/cpu-fan.log chown root:root /var/log/cpu-fan/cpu-fan.log chmod 666 /var/log/cpu-fan/cpu-fan.log
设置开机自动运行
在/etc/rc.local文件中添加以下内容
su -c /home/xbian/cpu_fan.sh xbian
我这里装的是xbian的系统,所以用户名是xbian,如果用的是官方rasbian系统,用户名就是pi。
这里需要注意的是,如果使用root用户开机运行脚本,会发生bug,脚本不会发生作用。另外还需要关闭lirc服务,否则会导致cpu占用率100%。
如果开机完成后手动运行脚本则没有任何问题,目前尚不知道bug产生的具体原因,上述问题可能都跟gpio驱动有关系。
Python
![](https://img2018.cnblogs.com/blog/1470684/201901/1470684-20190106171858724-1397089977.jpg)
![](https://img2018.cnblogs.com/blog/1470684/201901/1470684-20190106171859105-369025407.jpg)
树莓派的15号引脚连接到了三极管的基极(引脚编号可参看这里),当温度过高时,GPIO引脚输出低电平,可以开启风扇。python程序为:
#!/usr/bin/python2 #coding:utf8 #自动风扇控制程序,使用wiringPi的gpio命令来操作GPIO import commands,time #控制风扇的GPIO FAN_GPIO = 15 commands.getoutput('sudo gpio mode '+str(FAN_GPIO)+' OUTPUT') while True: # 获取CPU温度 tmpFile = open( '/sys/class/thermal/thermal_zone0/temp' ) cpu_temp_raw = tmpFile.read() tmpFile.close() cpu_temp = round(float(cpu_temp_raw)/1000, 1) print cpu_temp #如果温度大于50`C,就启动风扇 if cpu_temp >= 50.0 : commands.getoutput('sudo gpio write '+str(FAN_GPIO)+' 0') #如果温度小于45`C,就关闭风扇 if cpu_temp <= 45.0 : commands.getoutput('sudo gpio write '+str(FAN_GPIO)+' 1') time.sleep(10)
保存为 cool.py 后,运行程序。
sudo python cool.py
当温度高于50度就开启风扇降温,温度降到45度以下时关闭风扇,这样可以防止风扇在临界点往复。
C 语言 电机调速
#include <wiringPi.h> #define PWMPin 1 //定义PWM引脚 void setup(); int main (void) { setup(); intval = 0; intstep = 2; while(1) { if(val>1024) { step = -step; val = 1024; } else if(val<0) { step = -step; val = 0; } pwmWrite(PWMPin,val); val+=step; delay(10); } return 0 ; } /*初始化配置*/ void setup() { wiringPiSetup (); //wiringPi库初始化 pinMode (PWMPin, PWM_OUTPUT); //设置1为PWM输出 }
编译
gcc -o pwm pwm.c -lwiringPi
运行:
./pwm或者sudo ./pwm
参考:
https://blog.csdn.net/lzty634158/article/details/72902803
欢迎转载,转载请保留页面地址。帮助到你的请点个推荐。