#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Configuración de la pantalla LCD (16x2)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pines del sensor PIR, LED RGB y sensor ultrasónico HC-SR04
const int pinPIR = 13; // Ajusta según tu conexión
const int trigPin = 38; // Pin de disparo para HC-SR04
const int echoPin = 37; // Pin de eco para HC-SR04
const int ledR = 4; // Pin para LED rojo
const int ledG = 6; // Pin para LED verde
const int ledB = 5; // Pin para LED azul
// Variables de estado
bool sistemaIniciado = false;
void encenderLED(int colorPin) {
// Encender solo el LED correspondiente
digitalWrite(colorPin, HIGH);
}
void setup() {
Serial.begin(115200);
lcd.init(); // Cambiar de begin() a init()
lcd.backlight();
pinMode(pinPIR, INPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(ledR, OUTPUT);
pinMode(ledG, OUTPUT);
pinMode(ledB, OUTPUT);
// Apagar todos los LEDs
digitalWrite(ledR, LOW);
digitalWrite(ledG, LOW);
digitalWrite(ledB, LOW);
lcd.setCursor(0, 0);
lcd.print("Espera");
Serial.println("Ingrese 'ON' para iniciar el sistema.");
}
void loop() {
// Verificación para iniciar el sistema
if (!sistemaIniciado) {
if (Serial.available() > 0) {
String comando = Serial.readStringUntil('\n');
comando.trim();
if (comando.equalsIgnoreCase("ON")) {
sistemaIniciado = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sistema Iniciado");
delay(2000);
lcd.clear();
}
}
} else {
// Monitoreo de movimiento con el sensor PIR
int estadoPIR = digitalRead(pinPIR);
if (estadoPIR == HIGH) {
lcd.setCursor(0, 0);
lcd.print("Movimiento detect.");
Serial.println("Alerta: Movimiento detectado.");
} else {
lcd.setCursor(0, 0);
lcd.print("Sin movimiento ");
}
// Medición de distancia con el sensor HC-SR04
long duracion;
float distancia;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duracion = pulseIn(echoPin, HIGH, 30000); // Agregado un timeout para evitar bloqueos
if (duracion > 0) {
distancia = (duracion * 0.034) / 2; // Conversión a centímetros
// Respuestas del sistema según la distancia
if (distancia < 10) { // Demasiado cerca
digitalWrite(ledR, LOW);
digitalWrite(ledG, HIGH);
digitalWrite(ledB, LOW);
lcd.setCursor(0, 1);
lcd.print("ALERTA!");
Serial.println("ALERTA: Vehículo muy cerca.");
} else if (distancia >= 10 && distancia <= 50) { // Distancia segura
encenderLED(ledB);
lcd.setCursor(0, 1);
lcd.print("");
Serial.println("Distancia segura.");
} else { // No hay vehículo cerca
encenderLED(ledG);
lcd.setCursor(0, 1);
lcd.print("");
Serial.println("No se detecta vehículo.");
}
} else {
// Manejo de error si no se detecta respuesta del sensor
lcd.setCursor(0, 1);
lcd.print("Error en sensor ");
Serial.println("Error: No se detecta eco.");
}
delay(1000); // Ajusta el retraso según sea necesario
}
}