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