Caso práctico: alarma de nevera abierta con Arduino UNO

Caso práctico: alarma de nevera abierta con Arduino UNO — hero

Objetivo y caso de uso

Qué construirás: Un prototipo de monitor ambiental y sistema de alarma que rastrea el estado de la puerta del refrigerador y la temperatura interna para evitar el deterioro de los alimentos y el desperdicio de energía.

Por qué es importante / Casos de uso

  • Almacenamiento comercial y de laboratorio: Evita que las cámaras frigoríficas queden entreabiertas y garantiza que las muestras químicas sensibles a la temperatura permanezcan dentro de umbrales térmicos estrictamente definidos.
  • Conservación de energía doméstica: Elimina el desperdicio de energía y evita el quemado del compresor causado por puertas abiertas de forma prolongada en entornos residenciales.
  • Educación sobre máquinas de estado de hardware: Demuestra código de microcontrolador práctico sin bloqueo utilizando millis() para manejar múltiples sensores independientes simultáneamente sin bloqueo de subprocesos.

Resultado esperado

  • El sistema consulta continuamente el sensor de temperatura LM35 cada 2000ms (0.5 Hz) y transmite los datos al Monitor Serie para su registro.
  • Un interruptor de láminas magnético detecta con precisión los estados de puerta abierta/cerrada con una latencia cercana a cero, activando transiciones inmediatas de la máquina de estados y alarmas temporales.

Audiencia: Desarrolladores de sistemas embebidos, Educadores STEM; Nivel: Intermedio

Arquitectura/flujo: LM35 (Analógico) & Interruptor de láminas (GPIO Digital) → Microcontrolador (Máquina de estados sin bloqueo) → Registro en Monitor Serie & Disparadores de alarma

Nota educativa de validación

Antes de publicar este caso, el contenido pasó la puerta automática de validación de Prometeo con estado PASS. El validador comprobó los bloques de código, la estructura del artículo, los comandos copiables y la coherencia con el catálogo de dispositivos soportados.

Evidencia de validación publicada

  • Resultado automático: PASS.
  • Estructura parseada: 3 apartados, 1 tablas y 2 bloques de código detectados antes de publicar.
  • Código comprobado: 1 Arduino/arduino-cli compile, 1 Bash/copy-paste checks.
  • Catálogo soportado: el texto se contrastó contra los perfiles de dispositivo validables de Prometeo y los stacks no soportados bloquean la publicación.
  • Hallazgos del informe: sin hallazgos bloqueantes.

Esta validación confirma compatibilidad sintáctica y de herramientas para el material publicado, pero no sustituye la prueba física sobre tu hardware, cableado y entorno exactos.

Nota educativa de seguridad

Este proyecto es un prototipo educativo de bajo voltaje, no un producto certificado. Antes de encender la configuración, verifique el cableado de su Arduino UNO R3, evite cortocircuitar los 5 V, GND o los pines digitales, desconecte la alimentación antes de cambiar las conexiones y use módulos de interfaz adecuados para relés, motores o cargas externas.

Diagrama de bloques conceptual

Vista de alto nivel: qué entra, qué procesa cada bloque y qué sale del sistema.

Arquitectura funcional

LM35 (Analógico) & Interruptor de láminas…

Microcontrolador (Máquina de estados sin…

Registro en Monitor Serie & Disparadores…

Flujo conceptual de señales y responsabilidades entre bloques del dispositivo.

Ruta de validación

Sketch

arduino-cli compile

Upload

Prueba funcional

Resumen conceptual de las herramientas usadas para comprobar el material publicado.

Método de validación y precisión

Para validar la precisión de las lecturas del sensor LM35, coloque un termómetro digital comercial calibrado exactamente en la misma ubicación que el LM35 dentro del refrigerador.
* Evidencia esperada: La salida serie del Arduino debería informar temperaturas dentro de ±0.5°C del termómetro calibrado a las temperaturas estándar del refrigerador (2.0°C a 8.0°C) después de permitir 10 minutos para que la carcasa del sensor alcance el equilibrio térmico.

Requisitos previos

Antes de comenzar este tutorial, asegúrese de tener listas las siguientes herramientas y conocimientos:
* Una computadora host con Linux, macOS o Windows.
* Arduino CLI instalado y agregado al PATH de su sistema.
* Un cable USB Tipo-A a Tipo-B para conectar el Arduino UNO a su computadora.
* Comprensión básica de cómo usar una protoboard y cables puente.

Materiales

Necesitará los componentes exactos enumerados a continuación para construir este prototipo.

ComponenteModelo exacto / EspecificaciónCantidadPapel en el prototipo
MicrocontroladorArduino UNO R3 (ATmega328P)1La unidad central de procesamiento que evalúa la lógica de los sensores.
Sensor de temperaturaLM35 (Paquete LM35DZ TO-92)1Sensor analógico de precisión que proporciona una salida lineal de 10mV/°C.
Sensor magnéticoInterruptor de láminas estándar (Normalmente abierto)1Detecta la presencia de un imán para determinar el estado de la puerta.
ImánPequeño imán de neodimio o cerámica1Montado en la puerta para accionar el interruptor de láminas.
Actuador de audioZumbador piezoeléctrico (Pasivo o Activo)1Emite tonos de alarma audibles.
CableadoCables puente macho a macho~10Conecta los componentes en la protoboard al Arduino.
ProtoboardProtoboard estándar de tamaño medio1Proporciona una base de creación de prototipos sin soldadura.

Nota: No requerimos una resistencia pull-up externa para el interruptor de láminas porque utilizaremos la resistencia pull-up interna del ATmega328P mediante software.

Configuración/Conexión

Siga estas instrucciones cuidadosamente. Asegúrese de que su Arduino esté desconectado de la alimentación USB mientras realiza el cableado.

1. Cableado del sensor de temperatura LM35

Sostenga el LM35 de modo que la cara plana con el texto impreso quede frente a usted y los tres pines apunten hacia abajo.
* Pin izquierdo (VCC): Conéctelo al pin de 5V en el Arduino.
* Pin central (OUT): Conéctelo al pin A0 (Analógico 0) en el Arduino.
* Pin derecho (GND): Conéctelo a un pin GND en el Arduino.

2. Cableado del interruptor de láminas

Un interruptor de láminas tiene dos terminales y no está polarizado (la orientación no importa).
* Terminal 1: Conéctelo al pin digital 2 en el Arduino.
* Terminal 2: Conéctelo a un pin GND en el Arduino.
* Nota lógica: Configuraremos el pin 2 como INPUT_PULLUP. Cuando el imán está cerca (puerta cerrada), el interruptor se cierra, conectando el pin 2 a GND (leyendo LOW). Cuando la puerta se abre, el interruptor se abre y la resistencia interna eleva el pin 2 a 5V (leyendo HIGH).

3. Cableado del zumbador piezoeléctrico

Si su zumbador piezoeléctrico tiene una pata más larga (positiva) y una pata más corta (negativa), siga esta polarización.
* Terminal positivo (Pata más larga / Cable rojo): Conéctelo al pin digital 8 en el Arduino.
* Terminal negativo (Pata más corta / Cable negro): Conéctelo a un pin GND en el Arduino.

Sketch de Arduino

Cree un nuevo directorio llamado FridgeAlarm y cree el siguiente archivo dentro de él llamado FridgeAlarm.ino.

Vista pública parcial del archivo validado. El código completo se muestra a miembros y en PDF/Print.

/*
 * Fridge Door and Temperature Alarm
 * Architecture: Arduino UNO R3 (ATmega328P)
 * Sensors: Reed Switch (Pin 2), LM35 (Pin A0)
 * Actuator: Piezo Buzzer (Pin 8)
 */

// Hardware Pin Definitions
const int REED_PIN = 2;
const int BUZZER_PIN = 8;
const int LM35_PIN = A0;

// Configuration Thresholds
const float TEMP_THRESHOLD_C = 8.0;          // Alarm triggers if temperature exceeds 8.0 Celsius
const unsigned long DOOR_TIMEOUT_MS = 20000; // Alarm triggers if door is open for 20,000 ms (20 seconds)
const unsigned long TEMP_READ_INTERVAL = 2000; // Read temperature every 2,000 ms (2 seconds)

// State Tracking Variables
unsigned long doorOpenedAt = 0;
unsigned long lastTempRead = 0;

bool isDoorOpen = false;
bool tempAlarmActive = false;
bool doorAlarmActive = false;
float currentTemp = 0.0;

void setup() {
    // Initialize serial communication for data logging
    Serial.begin(115200);

    // Configure pins
    // INPUT_PULLUP applies an internal 20k-50k ohm resistor to 5V.
    pinMode(REED_PIN, INPUT_PULLUP);
    pinMode(BUZZER_PIN, OUTPUT);

    Serial.println("--- Fridge Monitor Initialized ---");
    Serial.print("Temp Threshold: ");
    Serial.print(TEMP_THRESHOLD_C);
    Serial.println(" C");
    Serial.print("Door Timeout: ");
    Serial.print(DOOR_TIMEOUT_MS / 1000);
    Serial.println(" seconds");
}

void loop() {
    // Capture current time once per loop iteration
    unsigned long currentMillis = millis();

    // ---------------------------------------------------------
    // 1. Evaluate Door State
    // ---------------------------------------------------------
    // Switch is closed (LOW) when magnet is present (door closed).
    // Switch is open (HIGH) when magnet is removed (door open).
    bool currentDoorState = (digitalRead(REED_PIN) == HIGH);

    // Detect state change: Door just opened
    if (currentDoorState && !isDoorOpen) {
        isDoorOpen = true;
        doorOpenedAt = currentMillis;
        Serial.println("[EVENT] Door Opened.");
    } 
    // Detect state change: Door just closed
    else if (!currentDoorState && isDoorOpen) {
        isDoorOpen = false;
        doorAlarmActive = false;
        Serial.println("[EVENT] Door Closed.");
        noTone(BUZZER_PIN); // Silence any active door alarms
    }
// ...

🔒 Este contenido es premium. Con la suscripción mensual (7 días gratis) podrás desbloquear el material didáctico completo y el pack PDF listo para imprimir.🔓 Desbloquéalo — 7 días gratis
/*
 * Fridge Door and Temperature Alarm
 * Architecture: Arduino UNO R3 (ATmega328P)
 * Sensors: Reed Switch (Pin 2), LM35 (Pin A0)
 * Actuator: Piezo Buzzer (Pin 8)
 */

// Hardware Pin Definitions
const int REED_PIN = 2;
const int BUZZER_PIN = 8;
const int LM35_PIN = A0;

// Configuration Thresholds
const float TEMP_THRESHOLD_C = 8.0;          // Alarm triggers if temperature exceeds 8.0 Celsius
const unsigned long DOOR_TIMEOUT_MS = 20000; // Alarm triggers if door is open for 20,000 ms (20 seconds)
const unsigned long TEMP_READ_INTERVAL = 2000; // Read temperature every 2,000 ms (2 seconds)

// State Tracking Variables
unsigned long doorOpenedAt = 0;
unsigned long lastTempRead = 0;

bool isDoorOpen = false;
bool tempAlarmActive = false;
bool doorAlarmActive = false;
float currentTemp = 0.0;

void setup() {
    // Initialize serial communication for data logging
    Serial.begin(115200);

    // Configure pins
    // INPUT_PULLUP applies an internal 20k-50k ohm resistor to 5V.
    pinMode(REED_PIN, INPUT_PULLUP);
    pinMode(BUZZER_PIN, OUTPUT);

    Serial.println("--- Fridge Monitor Initialized ---");
    Serial.print("Temp Threshold: ");
    Serial.print(TEMP_THRESHOLD_C);
    Serial.println(" C");
    Serial.print("Door Timeout: ");
    Serial.print(DOOR_TIMEOUT_MS / 1000);
    Serial.println(" seconds");
}

void loop() {
    // Capture current time once per loop iteration
    unsigned long currentMillis = millis();

    // ---------------------------------------------------------
    // 1. Evaluate Door State
    // ---------------------------------------------------------
    // Switch is closed (LOW) when magnet is present (door closed).
    // Switch is open (HIGH) when magnet is removed (door open).
    bool currentDoorState = (digitalRead(REED_PIN) == HIGH);

    // Detect state change: Door just opened
    if (currentDoorState && !isDoorOpen) {
        isDoorOpen = true;
        doorOpenedAt = currentMillis;
        Serial.println("[EVENT] Door Opened.");
    } 
    // Detect state change: Door just closed
    else if (!currentDoorState && isDoorOpen) {
        isDoorOpen = false;
        doorAlarmActive = false;
        Serial.println("[EVENT] Door Closed.");
        noTone(BUZZER_PIN); // Silence any active door alarms
    }

    // Check if door has been open longer than the timeout
    if (isDoorOpen && (currentMillis - doorOpenedAt >= DOOR_TIMEOUT_MS)) {
        if (!doorAlarmActive) {
            Serial.println("[ALARM] Door Open Timeout Exceeded!");
            doorAlarmActive = true;
        }
    }

    // ---------------------------------------------------------
    // 2. Evaluate Temperature
    // ---------------------------------------------------------
    if (currentMillis - lastTempRead >= TEMP_READ_INTERVAL) {
        lastTempRead = currentMillis;

        // Read 10-bit ADC value (0-1023)
        int adcValue = analogRead(LM35_PIN);

        // Convert ADC value to voltage (5V reference)
        // Note: 1024.0 is the correct divisor for a 10-bit AVR ADC
        float voltage = (adcValue / 1024.0) * 5.0;

        // LM35 outputs 10mV (0.01V) per degree Celsius
        currentTemp = voltage / 0.01;

        Serial.print("[DATA] Current Temp: ");
        Serial.print(currentTemp);
        Serial.println(" C");

        // Trigger temperature alarm if threshold is exceeded
        if (currentTemp > TEMP_THRESHOLD_C) {
            if (!tempAlarmActive) {
                Serial.println("[ALARM] Temperature Critical!");
                tempAlarmActive = true;
            }
        } else {
            if (tempAlarmActive) {
                Serial.println("[RESOLVED] Temperature returned to normal.");
                tempAlarmActive = false;
                noTone(BUZZER_PIN); // Silence temp alarm
            }
        }
    }

    // ---------------------------------------------------------
    // 3. Actuate Alarms (Non-blocking Buzzer Logic)
    // ---------------------------------------------------------
    // Priority 1: Door Alarm (Fast high-pitched beep)
    if (doorAlarmActive) {
        // Toggle tone every 250ms
        if ((currentMillis / 250) % 2 == 0) {
            tone(BUZZER_PIN, 1200); // 1200 Hz
        } else {
            noTone(BUZZER_PIN);
        }
    } 
    // Priority 2: Temperature Alarm (Slow lower-pitched beep)
    // Only sound if the door alarm isn't already sounding
    else if (tempAlarmActive && !doorAlarmActive) {
        // Toggle tone every 1000ms
        if ((currentMillis / 1000) % 2 == 0) {
            tone(BUZZER_PIN, 600); // 600 Hz
        } else {
            noTone(BUZZER_PIN);
        }
    }
    // No alarms active
    else if (!doorAlarmActive && !tempAlarmActive) {
        noTone(BUZZER_PIN);
    }
}

Comandos de compilación y subida

Navegue hasta el directorio justo por encima de su carpeta FridgeAlarm en su terminal. Asegúrese de que su Arduino UNO R3 esté conectado a su computadora por USB. Identifique su puerto serie (por ejemplo, COM3 en Windows, /dev/ttyACM0 en Linux o /dev/cu.usbmodem14101 en macOS) y ejecute los siguientes comandos exactos para preparar el entorno, compilar y subir el sketch.

# Update the core index
arduino-cli core update-index

# Install the AVR core for Arduino UNO
arduino-cli core install arduino:avr

# Compile the sketch for the Arduino UNO R3
arduino-cli compile --fqbn arduino:avr:uno FridgeAlarm

# Upload the compiled code to the board (replace <PORT> with your actual port)
arduino-cli upload --fqbn arduino:avr:uno --port <PORT> FridgeAlarm

Encuentra este producto y/o libros sobre este tema en Amazon

Ir a Amazon

Como afiliado de Amazon, gano con las compras que cumplan los requisitos. Si compras a través de este enlace, ayudas a mantener este proyecto.

Quiz rápido

Pregunta 1: ¿Cuál es el objetivo principal del prototipo descrito en el artículo?




Pregunta 2: ¿Qué problema busca evitar este sistema en el almacenamiento comercial y de laboratorio?




Pregunta 3: ¿Qué consecuencia negativa previene el sistema en entornos residenciales?




Pregunta 4: ¿Qué función de programación se utiliza para manejar múltiples sensores sin bloqueo de subprocesos?




Pregunta 5: ¿Qué tipo de sensor de temperatura se menciona en el resultado esperado?




Pregunta 6: ¿Con qué frecuencia el sistema consulta el sensor de temperatura?




Pregunta 7: ¿A dónde se transmiten los datos de temperatura para su registro?




Pregunta 8: ¿Qué componente se utiliza para detectar con precisión los estados de la puerta?




Pregunta 9: ¿Qué concepto educativo de hardware demuestra este proyecto?




Pregunta 10: Además del desperdicio de energía, ¿qué otro problema principal busca evitar el monitoreo de la temperatura interna?




Carlos Núñez Zorrilla
Carlos Núñez Zorrilla
Electronics & Computer Engineer

Ingeniero Superior en Electrónica de Telecomunicaciones e Ingeniero en Informática (titulaciones oficiales en España).

Sígueme:
Scroll al inicio