背景
樹莓派因爲性能和自身散熱能力,容易在做一些複雜工作時溫度升高,例如看個在線視頻。而長期高溫工作自然是不好的。淘寶上買來的小風扇,有很明顯的降溫效果,但是結構簡單,兩根線一根接5V,一根接地,所以插上之後只能一直運行。而且風扇聲音很吵,比較煩。所以需要搞一個基於溫度自動調整風扇轉動的功能。
原理
樹莓派:
+5v/0v 和一個引腳作爲輸出,用來控制風扇的開關即可。這裏用到的是21號引腳(BCM列)
可以使用gpio readall命令查看對應的引腳編號與功能。實物設備右下角的最後一個引腳。
繼電器:
1.選擇高電平觸發
2.輸入三個端口:DC+/DC- 分別接樹莓派的直流+5v/0v. 樹莓派輸出21引腳接繼電器IN端口
3.輸出選擇公共端COM和常開端口NO,兩個端口之間正常情況下處於斷開狀態,IN端口輸入爲高點平時,兩個端口可以看做是一根導線的兩端。將其與電扇串聯構成電扇工作電路。
原理圖
略醜。
爲什麼不直接用pin引腳接到風扇?
pin引腳電壓輸出3.3v,達不到風扇的標準工作電壓,風扇雖然能轉,但是基本沒有風量,轉速極慢。看到網上有人是用三極管不是繼電器實現的,這裏繼電器本身價格不貴,而且電路結構稍微簡單點,所以用繼電器就好。
實物圖:
我這裏用的繼電器是2路5v的。
代碼目錄結構:
目錄設計的稍微複雜了一點是爲了日後的可擴展性。真正涉及編寫的只有用紅線標明的四個文件。
1.detector.c
這個實現的功能是爲了在後臺持續運行,定時調用mainShell.sh進行溫度檢查,並做相應處理。定時的最小週期是1分鐘,具體多久檢查一次,還可以在腳本里用環境變量控制爲1分鐘的倍數。detector是這個.c文件編譯出來的可執行文件。
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
void main()
{
while (1) {
sleep(60);//檢測最小時間單位:1分鐘
system("~/work/script/mainShell.sh");
}
return;
}
2.mainShell.sh
腳本側總入口,後續有其他新增的檢測功能,直接修改這個腳本即可。不需要改C碼,作爲解釋型語言,省去重新編譯的麻煩。調用的autoCtrlTemp.sh即爲真正的風扇調溫處理。
#!/bin/bash
#監控系統腳本側總入口
cd ~/work/script
#1.風扇溫度檢測自動調節
./autofan/autoCtrlTemp.sh
3.autoCtrlTemp.sh
這裏設計的邏輯也很簡單。
a.獲取當前cpu溫度。
b.溫度高於55度,開啓風扇,溫度低於45度,關閉風扇。這裏如果低於55度就關閉風扇的話,風扇會反覆開啓關閉次數太頻繁,所以關閉溫度設置爲45度。
c.如果風扇狀態發生了變化,則用日誌記錄發生變化時的溫度與時間。
#!/bin/bash
temp=$(cat /sys/class/thermal/thermal_zone0/temp)
#echo $temp
let temp=temp/1000
#echo $temp
fanPath="/sys/class/gpio/gpio21/value"
if [ ! -e $fanPath ];
then
cd /sys/class/gpio
echo 21 > export
fi
beforeValue=$(cat $fanPath)
if [ $temp -gt 55 ]; #如果溫度高於55,開啓風扇
then
echo out > /sys/class/gpio/gpio21/direction
echo 1 > /sys/class/gpio/gpio21/value
elif [ $temp -lt 45 ]; #如果溫度低於45,關閉風扇
then
echo out > /sys/class/gpio/gpio21/direction
echo 0 > /sys/class/gpio/gpio21/value
fi
afterValue=$(cat $fanPath)
if [ $beforeValue -ne $afterValue ];
then
cd ~/work/script/autofan
if [ $beforeValue -eq 0 ];
then
echo -e "\n####################################" >> autofan.log
echo Start Time: $(date) >> autofan.log
echo Current Temperature:$temp >> autofan.log
else
echo End Time: $(date) >> autofan.log
echo Current Temperature:$temp >> autofan.log
echo -e "####################################\n" >> autofan.log
fi
fi
4.start.sh
a.啓動該功能,需要作爲後臺程序運行,日誌也需要按照我們的預期來記錄,所以啓動命令有一點小麻煩,所以放到了腳本中,省力些。
b.如果修改C碼,那麼還需要重新編譯,所以把這些麻煩的工作都封裝到腳本中,省力高效。
c.順便記錄了啓動日誌。
#!/bin/bash
cd ~/work
if [ ! -e "./detector" ];
then
cd c_code
gcc detector.c -o detector
mv detector ../detector
fi
cd ~/work
nohup ./detector 1> /dev/null &
echo -e "\n################################" >> log.log
date >> log.log
echo ProcessId: $(pgrep detector) >> log.log
echo -e "################################\n" >> log.log
5.日誌文件效果:
log.log 記錄了啓動時間與進程ID,方便kill。
################################
2018年 12月 31日 星期一 19:48:38 CST
ProcessId: 13945 14480
################################
################################
2018年 12月 31日 星期一 20:06:27 CST
ProcessId: 15010
################################
################################
2018年 12月 31日 星期一 20:58:50 CST
ProcessId: 1390
################################
autofan.log
記錄狀態發生變化的時間與溫度。
####################################
Start Time: 2018年 12月 31日 星期一 19:07:50 CST
Current Temperature:52
End Time: 2018年 12月 31日 星期一 19:08:41 CST
Current Temperature:47
####################################
####################################
Start Time: 2018年 12月 31日 星期一 19:41:40 CST
Current Temperature:70
End Time: 2018年 12月 31日 星期一 19:52:00 CST
Current Temperature:44
####################################
####################################
Start Time: 2018年 12月 31日 星期一 19:57:40 CST
Current Temperature:61
End Time: 2018年 12月 31日 星期一 19:59:33 CST
Current Temperature:47
####################################
至此,這個溫度自動控制的簡單系統搭好了,後續如果增加其他功能,比如根據土壤溼度傳感器檢測來自動控制澆花的系統,也可以在這個基礎上添加,擴展方便。