树莓派 温度监控 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(其中 ...
随机推荐
- WebForm - cookie赋值乱码问题
cookie的值为中文时候,取cookie的值会出现乱码 解决办法:存取cookie时候先解码和编码 存cookie,进行编码: cookie.Value = HttpUtility.UrlEncod ...
- python中 =、copy、deepcopy的差别
python2中,需要import copy模块 python3中,直接可以使用copy()方法,但deepcopy()还是需要导入copy模块 下面以python2为例: 对于"=&quo ...
- Grape简介
什么是Grape Grape是Ruby中的一个类REST API框架,被设计用于运行在Rack上或弥补已有的web应用框架(比如Rails或者Sinatra),Grape提供了一个简单的DSL用于方便 ...
- sql左右连接的区别
数据表的连接有: 1.内连接(自然连接): 只有两个表相匹配的行才能在结果集中出现 2.外连接: 包括 (1)左外连接(左边的表不加限制) (2)右外连接(右边的表不加限制) (3)全外连接(左右两表 ...
- 15 图-图的遍历-基于邻接矩阵实现的BFS与DFS算法
算法分析和具体步骤解说直接写在代码注释上了 TvT 没时间了等下还要去洗衣服 就先不赘述了 有不明白的欢迎留言交流!(估计是没人看的了) 直接上代码: #include<stdio.h> ...
- springboot @value和@configurationproperties注解的区别
@ConfigurationProperties @value 功能 批量注入配置文件中的属性 一个个指定 松散绑定(松散语法) 支持 不支持 SpEL 不支持 支持 JSR303数据校验 支持 ...
- springboot-31-springboot静态注入
springboot中 使用 @Autowired 注入时, 是可以为静态变量进行注入的 package com.iwhere.footmark.tools; import org.springfra ...
- 对称加密-AES
假设有一个发送方在向接收方发送消息.如果没有任何加密算法,接收方发送的是一个明文消息:“我是小灰”. 如果消息被中间人截获到,即使中间人无法篡改消息,也可以窥探到消息的内容,从而暴露了通信双方的私密. ...
- ExecutorService接口概要
ExecutorService接口继承于Executor接口,主要提供以下额外功能: 管理终结 产生Future对象,用于跟踪一个或多个任务的进度. ExecutorService可以被shut ...
- 【IT笔试面试题整理】寻找二叉树两节点的最近的公共祖先
[试题描述] 求二叉树中任意两个节点的最近公共祖先也称为LCA问题(Lowest Common Ancestor). 二叉查找树 如果该二叉树是二叉查找树,那么求解LCA十分简单. 基本思想为:从树根 ...