Raspberry pi

라즈베리파이 온도에 따라 냉각팬 조절하기 : nodejs

[혜안] 2022. 7. 29. 16:03
728x90

 라즈베리파이4를 중고로 영입했는데, 케이스와 냉각팬을 같이 주셨네요.

원래는 생각이 없었다가 꽁짜로 생겼으니 일단 달아보았는데요.

냉각팬이 생각보다 소음이 크더라구요.

온도가 높을 때만 잠깐씩 돌아주면 좋겠다 싶어, CPU 온도에 따라 냉각팬을 껐다 켰다 하도록 만들어보았습니다.

nodejs 기반입니다.

 

우선 CPU 온도를 가져올 수 있는지 찾아봤습니다.

아래와 같이 간단한 쉘 스크립트를 만들고,

#!/bin/sh
temp=$(cat /sys/class/thermal/thermal_zone0/temp)
temp2=$(($temp/1000))
echo $temp2

실행하면,

$ ./chk_temp.sh
51

현재 CPU 온도는 51도네요.

 

그 다음으로 필요한 건,

nodejs를 통해 온도를 받아올 수 있어야 하고,

이 온도를 기준으로 냉각팬을 제어해야 합니다.

그리고 냉각팬에 전원을 넣고빼고 하려면, 트랜지스터 1개와 저항 1개가 필요합니다.  

간단히 구성도를 그려보자면,

대략 이렇습니다.

27R은 저항값이고, NPN은 트랜지스터 타입입니다.

GPIO, 5V, GND는 아래와 같이 각각 연결했습니다.

그리고 nodejs 코딩

async function get_temp() {
    setTimeout(get_temp, 10000);

    try {
        const temp = await exe_shell("cat /sys/class/thermal/thermal_zone0/temp");

        if(temp/1000 > 55){
            fan.writeSync(1);           
        }
        else{
            fan.writeSync(0);           
        }
        i("cpu temperture", temp/1000, fan.readSync());

    }catch(error) {
        e(error.toString());
    }

}

메인 로직입니다.

10초에 한번씩 온도를 얻어와서 55도가 넘었으면 GPIO에 신호를 줘서 팬을 돌리고,

55도가 안넘었으면 팬을 멈춥니다.

 

실행시키고 로그를 확인해봅니다.

{"level":"info","message":{"contents":[["cpu temperture",53.556,0]],"timestamp":"2022-07-29 15:52:52"}}
{"level":"info","message":{"contents":[["cpu temperture",53.069,0]],"timestamp":"2022-07-29 15:53:02"}}
{"level":"info","message":{"contents":[["cpu temperture",54.53,0]],"timestamp":"2022-07-29 15:53:12"}}
{"level":"info","message":{"contents":[["cpu temperture",55.504,1]],"timestamp":"2022-07-29 15:53:22"}}
{"level":"info","message":{"contents":[["cpu temperture",55.991,1]],"timestamp":"2022-07-29 15:53:32"}}
{"level":"info","message":{"contents":[["cpu temperture",53.069,0]],"timestamp":"2022-07-29 15:53:42"}}
{"level":"info","message":{"contents":[["cpu temperture",55.017,1]],"timestamp":"2022-07-29 15:53:52"}}
{"level":"info","message":{"contents":[["cpu temperture",54.043,0]],"timestamp":"2022-07-29 15:54:02"}}
{"level":"info","message":{"contents":[["cpu temperture",54.043,0]],"timestamp":"2022-07-29 15:54:12"}}
{"level":"info","message":{"contents":[["cpu temperture",54.043,0]],"timestamp":"2022-07-29 15:54:22"}}
{"level":"info","message":{"contents":[["cpu temperture",55.017,1]],"timestamp":"2022-07-29 15:54:32"}}
{"level":"info","message":{"contents":[["cpu temperture",55.017,1]],"timestamp":"2022-07-29 15:54:42"}}
{"level":"info","message":{"contents":[["cpu temperture",53.556,0]],"timestamp":"2022-07-29 15:54:52"}}

잘 동작합니다.

다만 55도 사이를 너무 빈번히 왔다갔다해서 알고리즘 보완은 필요해보입니다.

온도가 높으면 그냥 1분은 돌리고, 낮으면 10초간격 체크 정도면 되겠네요.

 

회로는 빵판에 납땜해서 정리를 좀 하고, 

코딩한 건 상시 돌아가도록 서비스 등록해주면 될 것 같습니다.

서비스 등록은 지금까지 nodejs의 forever 라는 서비스를 사용했는데, 

얼마전에 쿠버네티스를 셋팅했으니, daemonset으로 동작을 시켜봐야 겠습니다.

 

풀 소스는 git에 올려두었습니다.

https://github.com/becans/raspberry_fan_controller.git

 

GitHub - becans/raspberry_fan_controller: nodejs

nodejs. Contribute to becans/raspberry_fan_controller development by creating an account on GitHub.

github.com

 

728x90