スマートAVキャビネットファンコントローラー - Arduino Nano、DHT11、リレーで最適冷却
部品と材料
| 部品 | 数量 |
|---|---|
| Arduino Nano R3 | 1 |
| DHT11 温湿度センサー(4ピン) | 1 |
| 5V DCリレーモジュール | 1 |
プロジェクト背景
AVレシーバーが発熱しすぎるため、夏場に向けてキャビネットファンを自動制御する装置を作りました。レシーバー外部から5-12Vの連動電源を取れず、また電源オフ後も余熱除去のためファンを一定時間回したいと考え、マイコン制御にしました。市販の温度制御ファンコントローラーは30ドル以上しますが、手持ちパーツで10ドル以下で自作できます。
試作と実装
Arduino Nano + DHT11 + 5Vリレーで基本動作を確認。PCファンを5V駆動できるものを選定(80mm×2、120mm×1、各200mA以下)。Molexコネクタを切ってUSB給電化し、古いスマホ充電器で全体を駆動します。
ステータスLED表示
起動時はPOST(電源投入自己テスト)として全LED、ファン、ピエゾブザーの動作確認を行います。
制御仕様
- 30秒間の平均温度を算出
- 平均温度 > 95°F (35°C) → ファンON、5分間継続後再判定
- 平均温度 > 120°F (49°C) → 過熱アラーム(ブザー鳴動)+ ファン継続、30秒ごとに再判定
- 平均温度 ≤ 95°F → ファンOFF、30秒ごとに温度チェック
実運用結果
レシーバー電源投入後約2分でファンが作動し、電源オン中は回り続けます。電源オフ後は5分以上ファンが回って余熱を排出。これまで過熱アラームは発報していません。
今後の改良案
- Arduino Nano → ATtiny85 でさらなる小型化
- リレー → MOSFET に変更し、PWMでファンカン速制御可能に
- 温度閾値を外部から設定可能に(ポテンショメーターやEEPROM)
ソースコード
// A/Vキャビネット用温度コントローラー
// ファンは10Aリレーで制御(12V PCファンまたは5V USBファン対応)
// ピエゾブザーで過熱警報
int FANTEMP = 95; // ファンON閾値 (°F)
int ALARMTEMP = 120; // 過熱警報閾値 (°F)
int FANLED = 2; // ファンON LED
int TEMPOK = 3; // 温度正常 LED
int ALARMLED = 4; // 過熱警報 LED
int ALARMPIN = 7; // ブザー
#define DHTPIN 8 // DHT11データピン
int FANPIN = 9; // リレー制御ピン
#include "DHT.h"
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
const int numReadings = 10; // 平均化サンプル数
float avetemp = 0;
float temp = 0;
float 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);
// 初期状態: すべてOFF (リレーはActive LOW想定)
digitalWrite(FANPIN, HIGH);
digitalWrite(FANLED, HIGH);
digitalWrite(ALARMLED, HIGH);
digitalWrite(TEMPOK, HIGH);
// POST: ブザーテスト
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");
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 is over "); Serial.print(ALARMTEMP);
Serial.println(", Alarm is 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 is under "); Serial.print(ALARMTEMP);
Serial.println(", Alarm is off");
checkdelay = 300000; // 5分後に再チェック
}
// ファン制御
if (avetemp > FANTEMP) {
digitalWrite(FANPIN, HIGH);
digitalWrite(FANLED, HIGH);
digitalWrite(TEMPOK, LOW);
Serial.print("Temperature is over "); Serial.print(FANTEMP);
Serial.print(", Fan is on (for "); Serial.print(checkdelay / 1000 / 60);
Serial.println(" minutes)");
delay(checkdelay);
} else {
digitalWrite(FANPIN, LOW);
digitalWrite(FANLED, LOW);
digitalWrite(TEMPOK, HIGH);
Serial.print("Temperature is under "); Serial.print(FANTEMP);
Serial.println(", Fan is off");
}
Serial.println(); Serial.println();
}
回路図

製造プロセス
- ファン振動を現場バランシングで解消:実践的ソリューション
- ファイリングキャビネット:設計、製造、現代的活用
- 温度制御ファンサーキット:メディア家具冷却用DIYリレーシステム
- Web制御DMX照明システム:Arduino Megaマスターコントローラー
- ゲーマー向け自動操作デバイス──Arduinoとサーボでコントローラのボタンを自動連打
- DIY Arduino USBゲームコントローラー - 高性能ゲームパッドを自作
- Unopad: Ableton Live連携シームレスなArduino MIDIコントローラー
- Arduinoベースの蛍光表示管(VFD)コントローラーキット
- Alexa対応Arduinoホームコントローラー:音声でスマートホーム自動化
- MK2 Plusロボットアームコントローラーの自作
- PWM電力コントローラ:パルス幅変調ランプドライバの構築