樹莓派 溫度監控 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會從亮到滅再到亮逐漸變化的過程即呼吸燈效果,直流電機小風扇從快到慢再到快實現了電機的調速功能。
 
 
 

參考:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM