树莓派之树莓派-差不多两年前整了个树莓派。。。
之前刚买的时候为了酷炫搞了个带灯光的有风扇有 oled 小屏幕的扩展板,上几个月风扇开始出现异响,oled 也模模糊糊的看不清了,自己动手折腾来折腾去整了整给整坏了,于是干脆直接换了,经验告诉我,我需要只是一个散热,7*24小时运行要的是稳定不需要啥花里胡哨的,就去 TB 找了下风扇,然后确实被我找到了,20块钱便宜实惠。
只是用起来还是得自己写脚本,因为说明书上的这一行在 Ubuntu 系统上不生效:
dtoverlay=gpio-fan,gpiopin=18,temp=55000
当然为了让其生效我也安装了比如 userland(https://2byt.es/post/vcgencmd/)、libraspberrypi-bin(https://command-not-found.com/dtoverlay),括号后面都是安装方法,有需要的自取,不过最后还是没整好。
于是不想再浪费时间,因为诸与此类本质都是 GPIO 的高低电平控制,便直接检索了上面的配置,找到了一位老哥的脚本,仅一个 PIN 值的差别(12 换成了 18),原版代码如下:
#!/bin/bash
GPIO_PIN=12
HIGH_TEMP=50000
SAVE_TEMP=45000
function get_temp() {
cat /sys/class/thermal/thermal_zone0/temp
}
function gpio_enable() {
echo $1 > /sys/class/gpio/export
}
function gpio_disable() {
echo $1 > /sys/class/gpio/unexport
}
function gpio_set_output() {
echo out > /sys/class/gpio/gpio$1/direction
}
function gpio_set_input() {
echo in > /sys/class/gpio/gpio$1/direction
}
function gpio_set_on() {
echo 1 > /sys/class/gpio/gpio$1/value
}
function gpio_set_off() {
echo 0 > /sys/class/gpio/gpio$1/value
}
function cleanup() {
QUIT=1
}
QUIT=0
#echo "Enable GPIO ${GPIO_PIN}"
gpio_enable $GPIO_PIN
#echo "Set GPIO ${GPIO_PIN} Output"
gpio_set_output $GPIO_PIN
#echo "set GPIO ${GPIO_PIN} on"
#gpio_set_on $GPIO_PIN
LASTSTATUS=0
trap cleanup SIGINT SIGTERM
while [ 1 ]; do
cputemp=$(get_temp)
#echo "CPU TEMP = $cputemp"
if [ $LASTSTATUS = 0 ]; then
if [ $cputemp -gt $HIGH_TEMP ]; then
echo "FAN ON"
echo "CPU TEMP = $cputemp"
gpio_set_on $GPIO_PIN
LASTSTATUS=1
fi
else
if [ $cputemp -lt $SAVE_TEMP ]; then
echo "FAN OFF"
echo "CPU TEMP = $cputemp"
gpio_set_off $GPIO_PIN
LASTSTATUS=0
fi
fi
if [ "$QUIT" = "1" ]; then break; fi
sleep 1
done
#echo "set GPIO ${GPIO_PIN} off"
gpio_set_off $GPIO_PIN
#echo "Disable GPIO ${GPIO_PIN}"
gpio_disable $GPIO_PIN当然这肯定无法直接满足我的需求,需要按需配置,最后我改成了这样(temp_montior):
#!/bin/bash
GPIO_PIN=18
HIGH_TEMP=55000
SAVE_TEMP=45000
function get_temp() {
cat /sys/class/thermal/thermal_zone0/temp
}
function gpio_enable() {
echo $1 >/sys/class/gpio/export
}
function gpio_disable() {
echo $1 >/sys/class/gpio/unexport
}
function gpio_set_output() {
echo out >/sys/class/gpio/gpio$1/direction
}
# function gpio_set_input() {
# echo in > /sys/class/gpio/gpio$1/direction
# }
function gpio_set_on() {
echo 1 >/sys/class/gpio/gpio$1/value
}
function gpio_set_off() {
echo 0 >/sys/class/gpio/gpio$1/value
}
# function cleanup() {
# QUIT=1
# }
# QUIT=0
#echo "Enable GPIO ${GPIO_PIN}"
gpio_enable $GPIO_PIN
#echo "Set GPIO ${GPIO_PIN} Output"
gpio_set_output $GPIO_PIN
#echo "set GPIO ${GPIO_PIN} on"
#gpio_set_on $GPIO_PIN
# trap cleanup SIGINT SIGTERM
function get_date() {
date +%Y-%m-%d
}
function trash_log() {
echo "" > /root/init/temp.log
}
function clean_log() {
date=$(get_date)
if [ $LAST_DATE != $date ]; then
trash_log
LAST_DATE=$date
echo "LCKISS-INIT: DATE = $LAST_DATE"
fi
}
LAST_DATE=$(get_date)
echo "LCKISS-INIT: DATE = $LAST_DATE"
LAST_STATUS=0
function format_temp() {
temp_f=$(echo "$1/1000" | bc -l)
printf "LCKISS-INIT: CPU TEMP = %.2f°C\n" $temp_f
}
while [ 1 ]; do
cputemp=$(get_temp)
clean_log
# format_temp $cputemp
if [ $LAST_STATUS = 0 ]; then
if [ $cputemp -gt $HIGH_TEMP ]; then
echo "LCKISS-INIT: FAN ON"
format_temp $cputemp
gpio_set_on $GPIO_PIN
LAST_STATUS=1
fi
else
if [ $cputemp -lt $SAVE_TEMP ]; then
echo "LCKISS-INIT: FAN OFF"
format_temp $cputemp
gpio_set_off $GPIO_PIN
LAST_STATUS=0
fi
fi
# if [ "$QUIT" = "1" ]; then break; fi
sleep 5
done
#echo "set GPIO ${GPIO_PIN} off"
gpio_set_off $GPIO_PIN
#echo "Disable GPIO ${GPIO_PIN}"
gpio_disable $GPIO_PIN再配合 nohup 后台运行:
nohup /root/init/temp_montior > /root/init/temp.log 2>&1 &
主要做了俩事儿,每天清空一次日志,以及大于55℃时开风扇,小于45℃时关风扇。
最后我再搞了个 service 丢在了 systemd (/etc/systemd/system/lckiss-init.service)
[Unit] Description=rpi-fans-server After=network.service [Service] Type=forking User=root Group=root ExecStart=/root/init/temp_montior [Install] WantedBy=multi-user.target
然后启用这个服务,就可以使用 systemctl 进行管理了。
systemctl enable/disable/start/stop/status lckiss-init.service

这不比那些花里胡哨的板子香多了?
参考:
Control a cooling fan with gpio-fan (Device Tree Overlays)
其他:
CMake错误No CMAKE_CXX_COMPILER could be found.
本站广告由 Google AdSense 提供
0条评论