Chisme 145 · La alarma de la puerta de la cueva: reed switch

Practica aquí antes de tocar la placa. Vas a montar una alarma: un imán en la puerta y un reed switch en el marco. Conectarás los cables a la ESP32 Plus, probarás qué distancia hace saltar el reed, completarás el programa y comprobarás qué es el rebote. Cada paso se desbloquea al completar el anterior.

Prototipo educativo, no un sistema de seguridad. Este simulador supone que el módulo da 1 con el imán cerca; en tu módulo puede ser al revés, y el programa está hecho para funcionar en los dos casos.

La puerta y el monitor serie

marco reed puerta imán LED 🔊zumbador
Contactos: cerradosLectura: 1Aperturas: 0 · Cambios crudos: 0
Monitor serie (115200)
cables sin conectar

1Conecta los cables

Cada módulo tiene tres pines: − (tierra), + (alimentación) y S (señal). Los del LED y del zumbador llevan también − a GND y + a 3V3. Elige a dónde va cada cable. El reed, a 3,3 V: la señal S no puede llegar a 5 V a la ESP32.

Reed switch − (GND) →
Reed switch + →
Reed switch S →
Módulo LED S →
Zumbador pasivo S →

2Qué es un reed switch

Un reed switch son dos láminas metálicas dentro de un tubo de cristal. Un imán cerca las atrae y cierra el circuito. Es un interruptor mecánico, pasivo, que no necesita programa para funcionar.

3Descubre a qué distancia salta

La placa ejecuta ahora el programa de prueba y escribe cada cambio de la lectura. Mueve el imán con la barra de arriba o con los botones: ciérralo y ábrelo al menos 4 veces y fíjate a qué distancia cambia el valor.

Cambios de lectura: 0 / 4

4Completa el programa

Este es el programa de la alarma. Completa las líneas importantes:

5Pruébalo y piensa como un científico

La alarma ya está en marcha y ha medido que la puerta estaba cerrada al arrancar. Marca «simular rebote del reed» y abre la puerta 3 veces (aleja el imán más de 12 mm y vuelve a cerrar). Compara las aperturas con los cambios crudos.

Aperturas: 0 / 3

Lee y predice

El imán está a 11 mm y se aleja a 13 mm. ¿Cuántas aperturas cuenta el programa?Una sola, aunque la lectura rebote al principio: el programa espera 30 ms estables antes de darla por buena.
Cierras la puerta y la alarma sigue sonando. ¿Qué puede pasar?Que la placa arrancó con la puerta abierta o que el imán queda a más de 10 mm del reed al cerrar.
Programa de la alarma (Arduino IDE)
// Chisme 145 - La alarma de la puerta de la cueva (reed switch + ESP32 Plus de Acebott)
// Placa en Arduino IDE: ESP32 Dev Module. Monitor serie a 115200.
//
// Conexion (con el USB desenchufado):
//   Reed switch : -  -> GND   +  -> 3V3   S -> pin 13   (el iman va en la puerta, el reed en el marco)
//   Modulo LED  : S  -> pin 5  (V y G a su sitio)
//   Zumbador    : S  -> pin 14 (V y G a su sitio)  <- zumbador PASIVO del kit
//
// IMPORTANTE: enciende la placa con la puerta CERRADA (iman pegado al reed).
// Asi el programa aprende que valor lee el reed con la puerta cerrada (calibracion).

const int PIN_REED    = 13;
const int PIN_LED     = 5;
const int PIN_ZUMBADOR = 14;

const unsigned long ESTABLE_MS = 30;   // la lectura debe durar 30 ms para darla por buena (antirrebote)

int valorCerrada;              // lo que lee el reed con la puerta cerrada (se mide al arrancar)
int estable;                   // ultimo valor ya confirmado
int anterior;                  // ultima lectura "cruda"
unsigned long tCambio = 0;     // cuando cambio la lectura cruda por ultima vez
unsigned long tAbierta = 0;    // cuando se abrio la puerta
int aperturas = 0;             // veces que se ha abierto
long cambiosCrudos = 0;        // todos los cambios de la lectura, incluidos los rebotes

void setup() {
  Serial.begin(115200);
  pinMode(PIN_REED, INPUT);    // si el valor no cambia nunca, prueba INPUT_PULLUP
  pinMode(PIN_LED, OUTPUT);
  pinMode(PIN_ZUMBADOR, OUTPUT);
  delay(500);

  valorCerrada = digitalRead(PIN_REED);   // calibracion: la puerta esta cerrada ahora
  estable = valorCerrada;
  anterior = valorCerrada;

  Serial.print("Alarma lista. Con la puerta cerrada el reed lee: ");
  Serial.println(valorCerrada);
}

void loop() {
  int v = digitalRead(PIN_REED);

  // 1) Contamos TODOS los cambios de la lectura (los buenos y los rebotes)
  if (v != anterior) {
    cambiosCrudos++;
    anterior = v;
    tCambio = millis();
  }

  // 2) Damos un cambio por bueno solo si la lectura se mantiene ESTABLE_MS
  if (v != estable && millis() - tCambio >= ESTABLE_MS) {
    estable = v;
    if (estable != valorCerrada) {            // la puerta se acaba de abrir
      aperturas++;
      tAbierta = millis();
      Serial.print("PUERTA ABIERTA. Aperturas: ");
      Serial.println(aperturas);
    } else {                                  // la puerta se acaba de cerrar
      Serial.print("Puerta cerrada. Estuvo abierta ");
      Serial.print(millis() - tAbierta);
      Serial.print(" ms. Cambios crudos hasta ahora: ");
      Serial.println(cambiosCrudos);
    }
  }

  // 3) Alarma mientras la puerta esta abierta: LED y zumbador a trompicones (200 ms)
  if (estable != valorCerrada) {
    bool encendido = (millis() / 200) % 2 == 0;
    digitalWrite(PIN_LED, encendido);
    if (encendido) tone(PIN_ZUMBADOR, 1000);  // pitido de 1000 Hz (necesita nucleo ESP32 3.x)
    else noTone(PIN_ZUMBADOR);
  } else {
    digitalWrite(PIN_LED, LOW);
    noTone(PIN_ZUMBADOR);
  }
}

Placa ESP32 Plus de Acebott, programada con Arduino IDE (ESP32 Dev Module). Módulos reed switch, LED y zumbador pasivo del kit de Keyestudio.