Controlador inteligente de ventilador para mueble AV con Arduino Nano, DHT11 y relé
Componentes y materiales
| Componente | Cantidad |
|---|---|
| Arduino Nano R3 | 1 |
| Sensor temperatura/humedad DHT11 (4 pines) | 1 |
| Módulo relé 5V DC | 1 |
| Ventiladores de PC (80mm y 120mm, adaptados a 5V USB) | 3 |
| Cargador USB viejo (fuente 5V) | 1 |
| LEDs de estado (verde, naranja, rojo) | 4 |
| Buzzer piezoeléctrico | 1 |
| Caja de proyecto pequeña | 1 |
Sobre el proyecto
Mi receptor AV se calentaba demasiado (¡109°F dentro del mueble con 75°F ambiente!). Quería un sistema automático que encendiera ventiladores solo cuando fuera necesario, funcionara con 5V USB y tuviera alarma por sobrecalentamiento.

Los controladores comerciales costaban más de 30€, pero yo ya tenía todos los componentes. Monté un prototipo en protoboard y funcionó a la primera.

Funcionamiento
- El Arduino Nano lee la temperatura cada 30 segundos (promedio de 10 lecturas).
- Si la temperatura media supera 95°F (35°C), enciende los ventiladores durante 5 minutos.
- Si supera 120°F (49°C), suena la alarma (buzzer) cada 30 segundos hasta que baje.
- Tras apagar el equipo, los ventiladores siguen girando hasta que la temperatura baja de 95°F (mínimo 5 min).
- Test de autoencendido (POST) al arrancar: verifica ventiladores, LEDs y buzzer.



LEDs de estado
- Verde superior izquierdo: alimentación
- Verde inferior izquierdo: temperatura OK
- Naranja central: ventiladores encendidos
- Rojo derecho: sobrecalentamiento (alarma)
Código (FanTempController)
// Controlador de temperatura para gabinete A/V
// Ventilador controlado por relé 10A (12V PC o 5V USB)
// Alarma piezo para sobrecalentamiento
int FANTEMP = 95; // Temp. encendido ventilador (°F)
int ALARMTEMP = 120; // Temp. alarma (°F)
int FANLED = 2; // LED ventilador encendido
int TEMPOK = 3; // LED temp. normal
int ALARMLED = 4; // LED alarma
int ALARMPIN = 7; // Buzzer
#define DHTPIN 8
int FANPIN = 9; // Relé ventilador
#include "DHT.h"
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
const int numReadings = 10;
float avetemp = 0, temp = 0;
unsigned long 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);
// Apagar todo (relé activo en LOW)
digitalWrite(FANPIN, HIGH);
digitalWrite(FANLED, HIGH);
digitalWrite(ALARMLED, HIGH);
digitalWrite(TEMPOK, HIGH);
// Test alarma
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); // °F
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;
}
// Alarma sobrecalentamiento
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; // Revisar cada 30 seg
} else {
digitalWrite(ALARMLED, LOW);
Serial.print("Temperature under "); Serial.print(ALARMTEMP); Serial.println(", Alarm OFF");
checkdelay = 300000; // 5 min
}
// Control ventilador
if (avetemp > FANTEMP) {
digitalWrite(FANPIN, HIGH); digitalWrite(FANLED, HIGH); digitalWrite(TEMPOK, LOW);
Serial.print("Temperature over "); Serial.print(FANTEMP);
Serial.print(", Fan ON for "); Serial.print(checkdelay / 60000); Serial.println(" minutes");
delay(checkdelay);
} else {
digitalWrite(FANPIN, LOW); digitalWrite(FANLED, LOW); digitalWrite(TEMPOK, HIGH);
Serial.print("Temperature under "); Serial.print(FANTEMP); Serial.println(", Fan OFF");
}
Serial.println(); Serial.println();
}
Esquemático

Mejoras futuras
Sustituir Arduino Nano por ATtiny85 y el relé por un MOSFET para reducir tamaño y permitir control PWM de velocidad de ventiladores.
Proceso de manufactura
- Eliminación de vibración de ventiladores: Solución práctica de balanceo in situ
- Archivador: Diseño, Fabricación y Uso Moderno
- Ventilador controlado por temperatura: sistema DIY con relé para refrigeración de muebles multimedia
- Sistema de Iluminación DMX Controlado por Web – Controlador Maestro Arduino
- Asistente de juego automatizado: Dispositivo inteligente de automatización de tareas para gamers
- Mando USB para juegos DIY con Arduino – Construye tu propio gamepad de alto rendimiento
- Unopad: Controlador MIDI Arduino para Ableton Live sin complicaciones
- Kit controlador para display fluorescente al vacío (VFD) basado en Arduino
- Controlador doméstico Arduino con Alexa: Automatización inteligente simplificada
- Construye tu propio controlador de brazo robótico MK2 Plus
- Controlador de Potencia PWM: Construye un Driver de Lámpara con Modulación por Ancho de Pulso