树莓派 温度监控 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 pwm
gpio pwm
正常情况下风扇应该会开始全速运转。
可以使用gpio readall命令查看针脚信息,针脚模式应该显示ALT5,见下图。

设置风扇自动调速:
新建一个cpu_fan.sh文件,输入以下内容
#!/bin/sh #sleep
#设置运行状态文件
RUN=/var/run/cpu-fan.run
touch $RUN
chmod $RUN
#设置风扇默认运行模式,0为关闭,1为全速,2为自动,运行过程中可以直接修改/var/run/cpu-fan.run文件来生效
echo "" > $RUN
#设置开启风扇的最低温度
set_temp_min=
#设置关闭风扇温度比最低温度小1度
shutdown_temp=`expr $set_temp_min - `
#设置风扇全速运行的温度
set_temp_max= #开机风扇全速运行
#默认的pwm值范围是0~
gpio mode pwm
gpio pwm #初始化参数
fan= 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)*/($set_temp_max-$set_temp_min)+)) #设置pwm值上限
if [ $pwm -gt ] ;then
pwm=
fi #小于设置温度关闭风扇
if [ $tmp -le $shutdown_temp ] ;then
pwm=
fan=
else #第一次超过设置温度全速开启风扇,防止风扇不能启动
if [ $tmp -gt $set_temp_min ] && [ $fan -eq ] ;then
gpio pwm
fan=
sleep
fi
fi #检查run文件,为0时关闭风扇
if [ $status -eq ] ;then
pwm=
fan=
else #检查run文件,为1时持续开启风扇最高转速
if [ $status -eq ] ;then
pwm=
fi
fi gpio pwm $pwm #每5秒钟检查一次温度
sleep #输出日志,不需要的可注释掉
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
daily
compress
delaycompress
missingok
notifempty
create root root
}
由于脚本运行在一般用户下,所以对日志文件的访问会产生权限问题,第一次运行的时候需要将/var/log/cpu-fan/cpu-fan.log文件的组和拥有者改为root,文件权限改为666
mkdir /var/log/cpu-fan
chown root:root /var/log/cpu-fan
chmod /var/log/cpu-fan
touch /var/log/cpu-fan/cpu-fan.log
chown root:root /var/log/cpu-fan/cpu-fan.log
chmod /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


树莓派的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)+'')
#如果温度小于45`C,就关闭风扇
if cpu_temp <= 45.0 :
commands.getoutput('sudo gpio write '+str(FAN_GPIO)+'') 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 = ;
intstep = ;
while()
{
if(val>)
{
step = -step;
val = ;
}
else if(val<)
{
step = -step;
val = ;
} pwmWrite(PWMPin,val);
val+=step;
delay();
}
return ;
}
/*初始化配置*/
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
树莓派 温度监控 PWM 控制风扇 shell python c 语言的更多相关文章
- 剖析CPU温度监控技术【转】
转自:http://blog.csdn.net/hunanchenxingyu/article/details/46476545 迄今为止还没有一种cpu散热系统能保证永不失效.失去了散热系统保护伞的 ...
- 剖析CPU温度监控技术
转载 :剖析CPU温度监控技术 标签: CPU 温度控制技术 1805 具体温度检测调整代码(转载) 迄今为止还没有一种cpu散热系统能保证永不失效.失去了散热系统保护伞的“芯”,往 ...
- 树莓派Zero W GPIO控制
作者:陈拓 chentuo@ms.xab.ac.cn 2018.06.09/2018.07.05 0. 概述 本文介绍树莓派 Zero W的GPIO控制,并用LED看效果. 0.1 树莓派GPIO编 ...
- 【原创】控制perl和python脚本执行过程中脚本文件是否关闭的方法
引子 跟踪perl和python脚本对文件的访问,实际过程中,perl和python解析器在解析完脚本后,直接关闭了 脚本文件,在进程中查询不到是访问文件的脚本文件名称. shell.perl和pyt ...
- 树莓派3 之 pi3Robot 控制系统配置
需求 个人正在用Python写一个控制系统,技术选型是python3 + Flask + Mysql + Bootstrap.需要将这套系统直接部署到树莓派中. 代码地址:https://github ...
- amba H2平台用PWM控制LCD背光
ambarella H2系列Soc的GPIO口能作PWM使用的个数有限(GPIO0-GPIO3),从PRM里GPIO: Function Selection章节可以得到如何配置GPIO为PWM功能. ...
- PWM控制led渐变
PWM,中文释义:脉冲宽度调制.它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术. PWM 是一种对模拟信号电平进行数字编码的方法.通过高分辨率计数器的使用,方波的占空比被调制用来对 ...
- Shell Python 日期和时间戳的互相转换
一.初衷: 很多时候,时间的存储都是时间戳格式,如果需要展示就要转化成标准格式日期.也许会需要date和timestamp互转. 二.方法: 1.Shell下对date和timestamp的互转,是通 ...
- tomcat监控,自动重启shell脚本
tomcat监控,自动重启shell脚本如下,取名 monitor_tomcat.sh: #!/bin/sh # func:自动监控tomcat脚本并且执行重启操作 # 获取tomcat进程ID(其中 ...
随机推荐
- 字符、字符串和文本的处理之String类型
.Net Framework中处理字符和字符串的主要有以下这么几个类: (1).System.Char类 一基础字符串处理类 (2).System.String类 一处理不可变的字符串(一经创建,字符 ...
- 全网最详细的Hadoop HA集群启动后,两个namenode都是standby的解决办法(图文详解)
不多说,直接上干货! 解决办法 因为,如下,我的Hadoop HA集群. 1.首先在hdfs-site.xml中添加下面的参数,该参数的值默认为false: <property> < ...
- 前端通信:ajax设计方案(八)--- 设计请求池,复用请求,让前端通信快、更快、再快一点
直接进入主题,本篇文章有点长,包括从设计阶段,到摸索阶段,再到实现阶段,最后全面覆盖测试阶段(包括数据搜集清洗),还有与主流前端通信框架进行对比PK阶段. 首先介绍一下一些概念: 1. 浏览器的并发能 ...
- 解决org.apache.rat:apache-rat-plugin:0.8:check (default) on project hbase: Too many unapproved license
maven打包的时候报错: 报错信息: [ERROR] Failed to execute goal org.apache.rat:apache-rat-plugin:0.8:check (defau ...
- java json-lib配置
用法 项目中要用到json-lib,mvnrepository.com查找它的dependency时结果如下: import net.sf.json.JSONArray; import net.sf. ...
- Java控制并发线程数的Semaphore
Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源.以前我都觉得从字面上很难理解Semaphore所表达的含义,只能把它比作是控制流量的红绿 ...
- 简单实现Spring框架--注解版
自己写的Spring框架——简单实现IoC容器功能 前几天在网上看了篇帖子,是用xml的方式实现spring的ioc容器,觉得挺有意思的,这边自己试着用注解的形式造了一套轮子. 工程结构 codein ...
- Linux编辑启动停止重启springboot jar包脚本
springboot的配置文件中,配置文件的名字都有各自的意义跟用途 dev 开发环境 prod 生产环境(默认) test 测试环境 加载指定配置文件 --spring.profiles.activ ...
- linux 安装 nvm
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.1/install.sh | bash 或者 wget -qO- htt ...
- SpringMVC官方文档阅读
默认的DispatcherServlet配置 在spring-webmvc-4.3.16.RELEASE.jar/org/springframework/web/servlet/路径下的Dispatc ...