// Pines
const int sensorPin = 2;
const int ledPin = 8;
const int buzzerPin = 9;
// Config
const unsigned long tiempoAlarma = 60000; // 1 minuto
const unsigned long intervaloLED = 1000; // 1 segundo
const unsigned int freqBuzzerHz = 2000; // frecuencia del buzzer (Hz)
// Estado
unsigned long tInicioAbierto = 0;
unsigned long tUltLed = 0;
unsigned long tUltMsg = 0;
bool estabaAbierto = false;
bool ledState = false;
bool alarma = false;
void setup() {
pinMode(sensorPin, INPUT_PULLUP); // Abierto = HIGH, Cerrado = LOW
pinMode(ledPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
Serial.begin(9600);
Serial.println("=== SISTEMA MAGNETICO ===");
Serial.println("Estado inicial: Sensor CERRADO");
digitalWrite(ledPin, LOW);
noTone(buzzerPin);
}
void loop() {
const int estadoSensor = digitalRead(sensorPin);
const unsigned long ahora = millis();
// ---------------- SENSOR ABIERTO ----------------
if (estadoSensor == HIGH) {
// Transición: cerrado -> abierto
if (!estabaAbierto) {
estabaAbierto = true;
alarma = false;
tInicioAbierto = ahora;
tUltLed = ahora;
tUltMsg = ahora;
ledState = false;
digitalWrite(ledPin, LOW);
noTone(buzzerPin);
Serial.println("🚪 Sensor ABIERTO - Iniciando conteo...");
}
// Si la alarma ya está activa: NO seguimos conteo ni parpadeo
if (alarma) {
return; // se mantiene sonando hasta que se cierre el sensor
}
// Parpadeo del LED cada 1 segundo mientras cuenta
if (ahora - tUltLed >= intervaloLED) {
ledState = !ledState;
digitalWrite(ledPin, ledState);
tUltLed = ahora;
}
// Mensaje cada 1 segundo mientras cuenta
if (ahora - tUltMsg >= 1000) {
unsigned long segundos = (ahora - tInicioAbierto) / 1000;
Serial.print("⏱️ Tiempo abierto: ");
Serial.print(segundos);
Serial.println(" s");
tUltMsg = ahora;
}
// Si supera 1 minuto: activar alarma (y detener conteo)
if (ahora - tInicioAbierto >= tiempoAlarma) {
alarma = true;
digitalWrite(ledPin, LOW); // opcional: apaga LED al entrar en alarma
tone(buzzerPin, freqBuzzerHz); // buzzer suena continuo
Serial.println("⚠️ ALARMA: Abierto > 1 minuto. Buzzer ACTIVADO.");
Serial.println("🔁 Se reiniciará solo cuando el sensor se CIERRE.");
}
}
// ---------------- SENSOR CERRADO ----------------
else {
// Si venía abierto, reporta cierre y reinicia
if (estabaAbierto) {
Serial.println("🔒 Sensor CERRADO - Reinicio del sistema.");
}
estabaAbierto = false;
alarma = false;
digitalWrite(ledPin, LOW);
noTone(buzzerPin);
}
}