Shell實現樹莓派通過風扇自動調節CPU溫度(附源碼與原理圖)

背景

樹莓派因爲性能和自身散熱能力,容易在做一些複雜工作時溫度升高,例如看個在線視頻。而長期高溫工作自然是不好的。淘寶上買來的小風扇,有很明顯的降溫效果,但是結構簡單,兩根線一根接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
####################################

至此,這個溫度自動控制的簡單系統搭好了,後續如果增加其他功能,比如根據土壤溼度傳感器檢測來自動控制澆花的系統,也可以在這個基礎上添加,擴展方便。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章