• Categories
  • diy

最近购买了一个树莓派4B 4G内存版,替换了旧的Model3 (强迫症犯了,就为了换成type c口,但因为电源适配问题还是老老实实地又买了官方电源适配器)

树莓派4B相对3B性能提高不少,但是随之功耗和发热也上去了。 于是给它整了个金属外壳

但是依旧烫得厉害,可能是我手动overlock了。开风扇的话,又有点吵,晚上影响睡觉。

所以又买了一些排线和一个电磁继电器来实现自动通过风扇控制CPU等芯片温度。

主要原理

  • 获取GPU温度

vcgencmd

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度左右,可能深圳有点热)

参考