最近购买了一个树莓派4B 4G内存版,替换了旧的Model3 (强迫症犯了,就为了换成type c口,但因为电源适配问题还是老老实实地又买了官方电源适配器)
树莓派4B相对3B性能提高不少,但是随之功耗和发热也上去了。 于是给它整了个金属外壳
但是依旧烫得厉害,可能是我手动overlock了。开风扇的话,又有点吵,晚上影响睡觉。
所以又买了一些排线和一个电磁继电器来实现自动通过风扇控制CPU等芯片温度。
主要原理
- 获取GPU温度
vcgencmd measure_temp
- 获取CPU温度
cpu=$(</sys/class/thermal/thermal_zone0/temp)
echo "$((cpu/1000)) c"
代码实现
网上已经有不少python版本的实现,但作为一个go粉,当然选择用go来实现了,正好练习一下gobot包的使用
package main
import (
"time"
"gobot.io/x/gobot"
"gobot.io/x/gobot/drivers/gpio"
"gobot.io/x/gobot/platforms/raspi"
"io/ioutil"
"log"
"strconv"
"strings"
)
func main() {
low, high := 50, 58
r := raspi.NewAdaptor()
sw := gpio.NewDirectPinDriver(r, "18")
work := func() {
gobot.Every(5*time.Second, func() {
t := readCpuTemp()
log.Println("Temp", t/1000)
if t < low*1000 {
sw.Off()
}
if t > high*1000 {
// turn on only ater 7 oclock
if h, _, _ := time.Now().Clock(); h > 7 {
sw.On()
}
}
})
}
robot := gobot.NewRobot("blinkBot",
[]gobot.Connection{r},
[]gobot.Device{sw},
work,
)
robot.Start()
}
func readCpuTemp() int {
var na = -274150 // set not valid value to -274.15C
dat, err := ioutil.ReadFile("/sys/class/thermal/thermal_zone0/temp")
if err != nil {
log.Println(err)
return na
}
s := strings.TrimSuffix(string(dat), "\n")
t, err := strconv.Atoi(s)
if err != nil {
log.Println(err)
return na
}
return t
}
实现的效果是,当温度高于58度时,启动风扇;温度低于50度时关闭风扇。(风扇一直不停转,大概也只能到45度左右,可能深圳有点热)