#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
const int pir = 5;
const int trig = 8;
const int eco = 7;
const int alarma = 2; // Pin 2 para la alarma
const int mq2 = 6; // Pin digital para la salida del MQ-2
const String claveCorrecta = "912"; // Contraseña
LiquidCrystal_I2C lcd(0x27, 16, 2); // Dirección I2C del LCD
// Configuración del teclado 4x4
char teclas[4][4] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte filas[4] = {9, 10, 11, 12}; // Pines de filas
byte columnas[4] = {A0, A1, A2, A3}; // Pines de columnas (usando pines analógicos para ahorrar pines digitales)
Keypad teclado = Keypad(makeKeymap(teclas), filas, columnas, 4, 4);
void setup() {
Serial.begin(9600);
pinMode(alarma, OUTPUT);
pinMode(trig, OUTPUT);
pinMode(eco, INPUT);
pinMode(pir, INPUT);
pinMode(mq2, INPUT); // Configurar el pin del MQ-2 como entrada
Wire.begin(); // SDA y SCL son A4 y A5 en Arduino Uno
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Hola, bienvenido!"); // Mensaje inicial en el LCD
}
void loop() {
int mov = digitalRead(pir);
int gasDetectado = digitalRead(mq2); // Leer el estado digital del MQ-2
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
long duracion = pulseIn(eco, HIGH);
long distancia = duracion / 59;
// Mostrar valores en el monitor serial
Serial.print("Distancia: ");
Serial.print(distancia);
Serial.println(" cm");
if (mov == HIGH) {
Serial.println("PIR detecta movimiento");
} else {
Serial.println("PIR no detecta movimiento");
}
Serial.print("Gas detectado: ");
Serial.println(gasDetectado == HIGH ? "SI" : "NO");
delay(500); // Retardo para evitar sobrecargar el monitor serial con demasiadas lecturas
// Si el PIR, el ultrasonido o el sensor de gas detectan algo
if (mov == HIGH || distancia < 8 || gasDetectado == HIGH) {
// Si el MQ-2 detecta gas, mostrar el mensaje y activar la alarma inmediatamente
if (gasDetectado == HIGH) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Gas detectado!");
delay(1000);
activarAlarma();
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Ingrese clave");
String claveIngresada = "";
unsigned long tiempoInicio = millis();
bool claveCorrectaIngresada = false;
while (millis() - tiempoInicio < 7000) { // Tiempo total de 7 segundos
lcd.setCursor(0, 1);
lcd.print("Tiempo: ");
lcd.print(7 - (millis() - tiempoInicio) / 1000); // Mostrar tiempo restante
char tecla = teclado.getKey();
if (tecla) {
if (tecla == '#') {
break; // Salir al presionar #
} else if (tecla == '*') {
claveIngresada = ""; // Reiniciar la clave ingresada
lcd.setCursor(0, 1);
lcd.print("Tiempo: ");
lcd.print(7 - (millis() - tiempoInicio) / 1000);
} else {
claveIngresada += tecla; // Agregar tecla ingresada
}
}
// Verificar si la clave ingresada es correcta
if (claveIngresada == claveCorrecta) {
claveCorrectaIngresada = true;
break; // Salir del bucle si la clave es correcta
}
}
// Si se ingresó la clave correcta
if (claveCorrectaIngresada) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Acceso OK");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Hola, bienvenido!"); // Vuelve al mensaje inicial
} else {
activarAlarma();
}
}
}
void activarAlarma() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Alarma ON");
while (true) {
digitalWrite(alarma, HIGH);
delay(1000);
digitalWrite(alarma, LOW);
delay(1000);
}
}