zoukankan      html  css  js  c++  java
  • 树莓派 温度监控 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;

    面包板加杜邦线,或者用电烙铁。

     

    硬件接法:

    Copy of Untitled 1.png

    先把电扇直接接到树莓派上测试一下哪根线是+极,然后把风扇+极直接接在树莓派的5V上,-极接在三极管集电极Collector。

    QQ截图20160810095219.jpg

    (从三极管平的那面看)

    三极管发射极Emitter接树莓派GND,基极Base接树莓派Pin12#(GPIO18)(GPIO_GEN1),资料表明只有这个针脚可以启用软件pwm,其他针脚我也没有试过。

    92b62556-72ee-4f80-bbc4-2913bd5c7367.jpg

     

    软件需求

    安装GPIO驱动,这里使用C语言编写的wiringPi,安装步骤看这里

    在按照上面的方法连接好风扇以后,风扇是不会转的,此时可以先手动控制风扇测试一下,在终端中输入以下命令开启风扇

    gpio mode 1 pwm
    gpio pwm 1 1023

    正常情况下风扇应该会开始全速运转。

    可以使用gpio readall命令查看针脚信息,针脚模式应该显示ALT5,见下图。

    QQ截图20160810100346.jpg

     

    设置风扇自动调速:

    新建一个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

    实物图
    风扇控制脚本

    树莓派的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 语言 电机调速

    对于树莓派硬件PWM只有1脚(wiringPi)GPIO.1,那么我们单独测试此脚通过不同占空比可以实现呼吸灯或者控制电机速度。
     
    按照如下接线。
    LED正极接GPIO.1,串联一个220Ω电阻接地,ULN2003电源接入5V电源和地,输出接直流小电机暂且用D,对应GPIO.1接入IN4。
    编写控制代码如下,我们实现一个很简单的功能,PWM从小的占空比到最大然后在从小到大,实现呼吸灯的效果,电机也速度从慢到快,从快再到慢的过程。代码如下:
     
    编写完代码通过SSH文件上传到wiringPi目录下。
    输入如下命令:
    #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
    实验现象:我们执行程序,则LED会从亮到灭再到亮逐渐变化的过程即呼吸灯效果,直流电机小风扇从快到慢再到快实现了电机的调速功能。
     
     
     

    参考:

  • 相关阅读:
    Windows下的RabbitMQ安装:RabbitMQ_Service安装
    [Java]private, public,protected,friendly的区别(转载)一下子就记住了
    mysql的一些sql用法
    set(string str)变量传参为int的问题
    eclipse插件开发常见的问题及解决办法
    eclipse 内存溢出
    如何在一台机器上运行2个Tomcat
    eclipse svn使用
    eclipse遇到的异常
    oracle学习
  • 原文地址:https://www.cnblogs.com/jins-note/p/10229478.html
Copyright © 2011-2022 走看看