ラズパイ冷却ファンの制御

raspi-config > Performance Options > Fan で設定する方法だと、
設定温度の範囲が 60℃~120℃ で結構あちちなので、自分で制御するよ。

$ sudo raspi-config

GPIO14を使う

40℃を設定してみるも…

60℃未満を設定できない

Error…

60℃で設定した場合

1分ごとにCPU温度を監視して、FANを動かすか止めるか制御する。

/home/$USER/FAN.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import time
import RPi.GPIO as GPIO
import subprocess
from datetime import datetime

# GPIO設定
FAN_GPIO = 14
GPIO.setmode(GPIO.BCM)
GPIO.setup(FAN_GPIO, GPIO.OUT)

# 温度閾値とインターバル
TEMP_THRESHOLD = 40.0   # 摂氏40度
INTERVAL = 60           # 1分ごとに監視
USER = os.getenv('USER') or 'default_user'  # systemdなどでUSERが設定されていない場合は'default_user'を使用
LOG_FILE = f'/home/{USER}/FAN.log'  # ログファイルパス

def log_fan_status(status, temp):
    # ログに記録
    with open(LOG_FILE, 'a') as f:
        f.write(f"{datetime.now()}: FAN {'ON ' if status else 'OFF'} temp={temp}°C\n")

def get_temp():
    # 温度取得
    result = subprocess.run(['vcgencmd', 'measure_temp'], stdout=subprocess.PIPE)
    temp_str = result.stdout.decode('utf-8')
    temp_value = float(temp_str.split('=')[1].split("'")[0])
    return temp_value

def fan_control():
    # 温度に応じてFANを制御する
    while True:
        current_temp = get_temp()
        print(f"Current Temperature: {current_temp}°C")

        if current_temp >= TEMP_THRESHOLD:
            # 温度が閾値以上ならFANをON
            onoff = True
        else:
            # 温度が閾値未満ならFANをOFF
            onoff = False

        log_fan_status(onoff, current_temp)
        GPIO.output(FAN_GPIO, GPIO.HIGH if onoff else GPIO.LOW)
        time.sleep(INTERVAL)

if __name__ == '__main__':
    try:
        fan_control()
    except KeyboardInterrupt:
        print("プログラム終了")
    finally:
        GPIO.cleanup()

温度監視とFANの制御を自動起動するための設定。

/etc/systemd/system/FAN.service

[Unit] 
Description=FAN control script
StartLimitInterval=60s
StartLimitBurst=10
After=multi-user.target

[Service]
Type=simple
KillMode=process
ExecStart=/home/ユーザ名/FAN.sh
WorkingDirectory=/home/ユーザ名
User=ユーザ名
StandardOutput=journal
StandardError=journal
Restart=on-failure

[Install]
WantedBy=multi-user.target

sudo systemctl daemon-reload
sudo systemctl enable FAN.service
sudo systemctl start FAN.service
sudo systemctl status FAN.service
(output)● FAN.service - FAN control script
(output)     Loaded: loaded (/etc/systemd/system/FAN.service; enabled; vendor preset: enabled)
(output)     Active: activating (auto-restart) since Mon 2024-09-16 18:12:55 JST; 6s ago
(output)    Process: 14918 ExecStart=/home/ユーザ名/FAN.py (code=exited, status=0/SUCCESS)
(output)   Main PID: 14918 (code=exited, status=0/SUCCESS)
(output)        CPU: 409ms