智能影音柜风扇控制器 - Arduino Nano、DHT11 与继电器实现最优散热
组件与物料清单
| 组件 | 数量 |
|---|---|
| Arduino Nano R3 | 1 |
| DHT11 温湿度传感器 (4针) | 1 |
| 5V 直流继电器模块 | 1 |
项目背景
我的 AV 功放机运行温度过高,夏季来临前需要加装机柜风扇。最初想从功放机外部寻找仅在开机时供电的 5-12V 直流电源,但仅在内部找到几处可用点。同时希望关机后风扇延时运行,电容方案调试困难。
室温 24℃ (75℉),机柜内温 43℃ (109℉) —— 亟需散热方案。
市售温控风扇均价超 $30,核心仅是风扇、温度探头和继电器,而我零件盒里正好全有。
原型开发
基于 $2 的 Arduino Nano 编写草图,接入 DHT11 传感器和 5V 继电器,面包板验证成功。随后扩展状态指示 LED 和压电蜂鸣器过热报警,全部塞入小型项目盒。
选用两个 80mm 和一个 120mm 废旧电脑风扇,5V 供电下风量仍达 200mA 以下,剪除 Molex 接头改为 USB 供电,整套系统由废弃手机充电器供电。
最终成品
紧凑外壳大量热熔胶防短路,外观与影音设备融为一体。状态指示灯布局:左上绿灯(电源)、左下绿灯(温度正常)、中橙灯(风扇运行)、右红灯(过热报警)。
上电自检 (POST) 流程验证风扇、LED、蜂鸣器全功能正常。
控制逻辑
控制器每 30 秒采样一次温度并计算平均值:
- 平均温度 > 35℃ (95℉) → 风扇开启 5 分钟再复测
- 平均温度 > 49℃ (120℉) → 触发声光报警,风扇持续运行,每 30 秒重复报警直至温度降至阈值以下
实测:开机约 2 分钟风扇启动,全程运行;关机后风扇至少运行 5 分钟降温;过热报警暂未触发。
改进方向
若重做,将 Arduino Nano 替换为 ATtiny85,继电器换为 MOSFET,体积更小且支持 PWM 调速。
核心代码
// A/V 机柜温控风扇控制器
// 10A 继电器控制 12V(电脑)或 5V(USB) 风扇
// 压电蜂鸣器过热报警
int FANTEMP = 95; // 风扇启动温度 (℉)
int ALARMTEMP = 120; // 过热报警温度 (℉)
int FANLED = 2; // 风扇运行指示灯
int TEMPOK = 3; // 温度正常指示灯
int ALARMLED = 4; // 报警指示灯
int ALARMPIN = 7; // 蜂鸣器引脚
#define DHTPIN 8 // DHT 传感器引脚
int FANPIN = 9; // 继电器控制引脚
#include "DHT.h"
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
const int numReadings = 10;
float avetemp = 0, temp = 0, checkdelay = 0;
void setup() {
Serial.begin(9600);
Serial.println("Temp Monitor Started");
dht.begin();
pinMode(FANPIN, OUTPUT);
pinMode(ALARMPIN, OUTPUT);
pinMode(ALARMLED, OUTPUT);
pinMode(FANLED, OUTPUT);
pinMode(TEMPOK, OUTPUT);
// 继电器低电平触发,初始关闭
digitalWrite(FANPIN, HIGH);
digitalWrite(FANLED, HIGH);
digitalWrite(ALARMLED, HIGH);
digitalWrite(TEMPOK, HIGH);
// 自检:蜂鸣器测试
for (int x = 0; x < 5; x++) { tone(ALARMPIN, 220 * x, 75); delay(100); }
Serial.print("Fan Test Started (5 Seconds) ");
for (int x = 0; x < 5; x++) { Serial.print("."); delay(1000); }
Serial.println("Done");
digitalWrite(FANPIN, LOW);
digitalWrite(FANLED, LOW);
digitalWrite(ALARMLED, LOW);
digitalWrite(TEMPOK, LOW);
noTone(ALARMPIN);
}
void loop() {
delay(2000);
temp = 0;
Serial.print("Realtime Temp: \t");
// 10次采样求平均,间隔3秒
for (int x = 0; x < numReadings; x++) {
float f = dht.readTemperature(true); // 华氏度
Serial.print(f); Serial.print("\t");
temp += f;
delay(3000);
}
Serial.println();
avetemp = temp / numReadings;
Serial.print("Average Temp is "); Serial.println(avetemp);
if (isnan(temp)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// 过热报警处理
if (avetemp > ALARMTEMP) {
digitalWrite(ALARMLED, HIGH);
Serial.print("Temperature over "); Serial.print(ALARMTEMP); Serial.println(", Alarm ON");
for (int x = 0; x < 3; x++) {
tone(ALARMPIN, 660, 1000); delay(500);
tone(ALARMPIN, 440, 1000); delay(500);
}
noTone(ALARMPIN);
checkdelay = 30000; // 报警状态下30秒复测
} else {
digitalWrite(ALARMLED, LOW);
Serial.print("Temperature under "); Serial.print(ALARMTEMP); Serial.println(", Alarm OFF");
checkdelay = 300000; // 正常状态5分钟复测
}
// 风扇控制
if (avetemp > FANTEMP) {
digitalWrite(FANPIN, HIGH);
digitalWrite(FANLED, HIGH);
digitalWrite(TEMPOK, LOW);
Serial.print("Temp over "); Serial.print(FANTEMP);
Serial.print(", Fan ON for "); Serial.print(checkdelay / 60000); Serial.println(" min");
delay(checkdelay);
} else {
digitalWrite(FANPIN, LOW);
digitalWrite(FANLED, LOW);
digitalWrite(TEMPOK, HIGH);
Serial.print("Temp under "); Serial.print(FANTEMP); Serial.println(", Fan OFF");
}
Serial.println(); Serial.println();
}
原理图
电路原理图请参考项目附件。
制造工艺
- 消除风机振动:现场动平衡实战方案
- 文件柜:设计、制造与现代应用
- 温控风扇DIY:媒体柜散热的继电器驱动方案
- 基于 Web 控制的 DMX 灯光系统 – Arduino 主控制器
- 自动游戏助手:为玩家打造的智能任务自动化装置
- DIY Arduino USB 游戏手柄 — 自制高性能游戏手柄
- Unopad:基于 Arduino 的无缝 Ableton Live MIDI 控制器
- Arduino 驱动的真空荧光显示器(VFD)控制器套件
- Alexa 语音控制 Arduino 智能家居中枢:基于 Yun + PubNub + AWS Lambda 全栈实现
- 自制 MK2 Plus 机械臂控制器 - 基于 Arduino 与 CNC 扩展板
- Arduino + TEA5767 打造 FM 收音机:Nokia 5110 显频谱/信号强度/立体声
- PWM功率控制器:构建脉宽调制灯驱动器