基于Raspberry Pi/Arduino:如何根据Pi温度手动控制5V风扇启停?
树莓派/Arduino 基于温度控制5V直流无刷风扇启停(新手入门指南)
一、核心逻辑
- 读取树莓派CPU温度
- 设置温度阈值(例:超过55℃启动风扇,低于45℃停止)
- 通过开关元件(继电器/三极管)控制5V风扇通断
二、硬件准备(新手优先选继电器方案)
树莓派直接控制清单
- 树莓派(任意带GPIO的型号)
- 5V直流无刷风扇(注意电流,小风扇通常0.1-0.5A)
- 带光耦隔离的5V继电器模块(避免损坏树莓派)
- 杜邦线若干
- 5V独立电源(风扇电流>0.5A时使用,防止拉低树莓派电压)
接线步骤
- 继电器模块接线:
- VCC接树莓派5V引脚
- GND接树莓派GND引脚
- IN接树莓派任意GPIO(例:BCM编号GPIO17)
- 风扇接线:
- 风扇正极接继电器NO(常开)引脚
- 风扇负极接GND(与继电器GND共地)
- 继电器COM引脚接5V电源正极(小风扇可直接接树莓派5V,大风扇用独立电源)
三、树莓派端软件实现(Python脚本,新手友好)
1. 读取树莓派温度的系统命令
直接读取系统文件获取温度,返回值为千分之一摄氏度:cat /sys/class/thermal/thermal_zone0/temp
2. 温度控制风扇的Python脚本
import RPi.GPIO as GPIO import time # GPIO配置 FAN_PIN = 17 # 对应BCM编号的GPIO17 GPIO.setmode(GPIO.BCM) GPIO.setup(FAN_PIN, GPIO.OUT) GPIO.output(FAN_PIN, GPIO.LOW) # 初始状态关闭风扇 # 温度阈值设置 TEMP_ON = 55 # 风扇启动温度(℃) TEMP_OFF = 45 # 风扇停止温度(℃) def get_rpi_temp(): with open('/sys/class/thermal/thermal_zone0/temp', 'r') as f: temp_raw = f.read().strip() return int(temp_raw) / 1000.0 try: while True: current_temp = get_rpi_temp() print(f"当前温度: {current_temp:.1f}℃") if current_temp >= TEMP_ON: GPIO.output(FAN_PIN, GPIO.HIGH) print("风扇已启动") elif current_temp <= TEMP_OFF: GPIO.output(FAN_PIN, GPIO.LOW) print("风扇已停止") time.sleep(10) # 每10秒检测一次温度 except KeyboardInterrupt: GPIO.cleanup() # 退出时清理GPIO资源 print("程序已终止")
3. 设置开机自启(可选)
用systemd实现脚本开机自动运行:
- 创建服务文件:
sudo nano /etc/systemd/system/fan_control.service - 写入以下内容(替换脚本路径为你自己的):
[Unit] Description=Raspberry Pi Fan Control After=multi-user.target [Service] Type=simple ExecStart=/usr/bin/python3 /home/pi/fan_control.py Restart=always User=pi [Install] WantedBy=multi-user.target
- 启用并启动服务:
sudo systemctl daemon-reloadsudo systemctl enable fan_control.servicesudo systemctl start fan_control.service
四、Arduino配合树莓派的方案
思路
树莓派读取温度后,通过串口将数据传给Arduino,由Arduino控制风扇启停。
1. 树莓派端串口发送脚本(Python)
import serial import time # 串口配置,根据实际设备调整端口 ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1) ser.flush() def get_rpi_temp(): with open('/sys/class/thermal/thermal_zone0/temp', 'r') as f: temp_raw = f.read().strip() return int(temp_raw) / 1000.0 try: while True: temp = get_rpi_temp() ser.write(f"{temp:.1f}\n".encode()) print(f"发送温度数据: {temp:.1f}℃") time.sleep(10) except KeyboardInterrupt: ser.close() print("程序已终止")
2. Arduino端接收控制代码
#define FAN_PIN 2 #define TEMP_ON 55.0 #define TEMP_OFF 45.0 void setup() { Serial.begin(9600); pinMode(FAN_PIN, OUTPUT); digitalWrite(FAN_PIN, LOW); } void loop() { if (Serial.available() > 0) { String temp_str = Serial.readStringUntil('\n'); float current_temp = temp_str.toFloat(); if (current_temp >= TEMP_ON) { digitalWrite(FAN_PIN, HIGH); Serial.println("风扇启动"); } else if (current_temp <= TEMP_OFF) { digitalWrite(FAN_PIN, LOW); Serial.println("风扇停止"); } } delay(1000); }
3. Arduino接线
- 继电器IN接Arduino D2引脚
- 继电器VCC接Arduino 5V,GND接Arduino GND
- 风扇接线同树莓派直接控制的接法
- 树莓派通过USB转TTL模块连接Arduino:树莓派TX接Arduino RX,树莓派RX接Arduino TX,两者GND相连
五、新手注意事项
- 接线前必须断开所有电源,防止短路烧设备
- 风扇电流>0.5A时,一定要用独立5V电源供电,不要依赖树莓派的5V引脚
- 可根据实际使用场景调整温度阈值,避免风扇频繁启停
- 树莓派GPIO输出为3.3V,禁止直接接5V信号,带光耦的继电器模块更安全
内容的提问来源于stack exchange,提问作者Ward Wielockx
相关产品推荐
相关产品推荐

