#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Cambia a 0x3F si tu LCD no muestra nada
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pines
int trig = 8;
int echo = 9;
int foco = 13;
int buzzer = 7;
// Tiempos
unsigned long tiempoInicio = 0;
unsigned long tiempoBuzzer = 0;
bool activo = false;
// ---------- FUNCIÓN MEDIR DISTANCIA ----------
long medir() {
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
long duracion = pulseIn(echo, HIGH, 30000); // timeout
if (duracion == 0) return -1;
long cm = duracion * 0.034 / 2;
return cm;
}
// ---------- SETUP ----------
void setup() {
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
pinMode(foco, OUTPUT);
pinMode(buzzer, OUTPUT);
digitalWrite(foco, LOW);
digitalWrite(buzzer, LOW);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Sistema listo");
delay(1500);
lcd.clear();
}
// ---------- LOOP ----------
void loop() {
long distancia = medir();
// DETECCIÓN A 20 CM
if (distancia > 0 && distancia <= 20 && !activo) {
activo = true;
tiempoInicio = millis();
tiempoBuzzer = millis();
digitalWrite(foco, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bienvenido a");
lcd.setCursor(0, 1);
lcd.print("nuestro hogar");
}
// BUZZER INTERMITENTE POR 5 SEGUNDOS
if (activo && millis() - tiempoBuzzer <= 5000) {
if ((millis() / 200) % 2 == 0) {
digitalWrite(buzzer, HIGH);
} else {
digitalWrite(buzzer, LOW);
}
} else {
digitalWrite(buzzer, LOW);
}
// APAGAR TODO A LOS 10 SEGUNDOS
if (activo && millis() - tiempoInicio >= 10000) {
digitalWrite(foco, LOW);
digitalWrite(buzzer, LOW);
lcd.clear();
activo = false;
}
}