#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define pulsador 19
#define ledVerde 18
#define ledRojoD 22
#define ledRojoI 21
#define potenciometro 15
#define potenVel 2
#define trigPin 5
#define echoPin 17
#define pulsador1 12
#define pulsador2 14
#define pulsador3 27
#define pulsador4 26
#define ledRojo3 23
#define ledRojo4 0
#define pulsadorC1 32
#define pulsadorC2 35
#define pulsadorC3 34
unsigned long actualMillis;
unsigned long anteriorMillis;
unsigned long tiempoActual;
int estadoAnterior;
int estadoVerde;
int estadoPulsador;
int valorPot;
int valorPotVel;
int velocidad;
int alarmaActivada = 0;
int contadorAlarmas = 0;
bool apagar = false;
long duracion;
int distancia;
// Configuración del display I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); // Asegúrate de que la dirección I2C sea correcta
// Array de LEDs
const int ledArray[4][2] = {
{ledRojoI, ledRojo3},
{ledRojoD, ledRojo4}
};
int ledIndex = 0;
void setup() {
pinMode(pulsador, INPUT);
pinMode(ledVerde, OUTPUT);
pinMode(ledRojoD, OUTPUT);
pinMode(ledRojoI, OUTPUT);
pinMode(ledRojo3, OUTPUT);
pinMode(ledRojo4, OUTPUT);
pinMode(potenciometro, INPUT);
pinMode(potenVel, INPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(9600);
// Inicializar el display LCD
Wire.begin(16, 4); // Configurar los pines SDA y SCL para el ESP32
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sistema Apagado");
}
void loop() {
//---------- Pulsador -----------
estadoPulsador = digitalRead(pulsador);
if (estadoPulsador == HIGH && estadoAnterior == LOW) {
tiempoActual = millis();
if (estadoVerde == 0) {
digitalWrite(ledVerde, HIGH);
Serial.println("Sistema Encendido");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sistema Encendido");
estadoVerde = 1;
apagar = false;
} else {
apagar = true;
}
}
if (estadoPulsador == LOW && estadoAnterior == HIGH && apagar) {
if (millis() - tiempoActual >= 2000) {
digitalWrite(ledVerde, LOW);
Serial.println("Sistema Apagado");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sistema Apagado");
estadoVerde = 0;
for (int i = 0; i < 2; i++) {
digitalWrite(ledArray[i][0], LOW);
digitalWrite(ledArray[i][1], LOW);
}
alarmaActivada = 0;
contadorAlarmas = 0;
apagar = false;
}
}
estadoAnterior = estadoPulsador;
//---------- Potenciómetro -------------
valorPot = analogRead(potenciometro);
valorPotVel = analogRead(potenVel);
int distanciaDeteccion = map(valorPot, 0, 1023, 5, 110); // distancia en cm
velocidad = map(valorPotVel, 0, 1023, 50, 500);
//---------- Sensor Ultrasónico -------------
if (estadoVerde == 1) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duracion = pulseIn(echoPin, HIGH);
distancia = duracion * 0.034 / 2;
lcd.setCursor(0, 1);
lcd.print("R:");
lcd.print(distanciaDeteccion);
lcd.print("cm ");
lcd.setCursor(9, 1);
lcd.print("C:");
lcd.print(contadorAlarmas);
lcd.print(" ");
if (distancia <= distanciaDeteccion && alarmaActivada == 0) {
Serial.println("ALARMA");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ALARMA!");
alarmaActivada = 1;
contadorAlarmas++;
Serial.print("Contador de Alarmas: ");
Serial.println(contadorAlarmas);
}
if (distancia <= distanciaDeteccion) {
actualMillis = millis();
if (actualMillis - anteriorMillis >= velocidad) {
anteriorMillis = actualMillis;
// Apagar todos los LEDs
for (int i = 0; i < 2; i++) {
digitalWrite(ledArray[i][0], LOW);
digitalWrite(ledArray[i][1], LOW);
}
// Encender el siguiente par de LEDs
digitalWrite(ledArray[ledIndex][0], HIGH);
digitalWrite(ledArray[ledIndex][1], HIGH);
// Incrementar el índice del array
ledIndex = (ledIndex + 1) % 2;
}
} else {
for (int i = 0; i < 2; i++) {
digitalWrite(ledArray[i][0], LOW);
digitalWrite(ledArray[i][1], LOW);
}
alarmaActivada = 0;
lcd.setCursor(0, 0);
lcd.print(" "); // Limpiar la primera línea del display
}
}
}