#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
const int trigPin = 18;
const int echoPin = 19;
const int ledCorto = 4;
const int ledLargo = 5;
const int botonEncender = 16;
const int botonApagar = 17;
bool luzEncendida = false;
float lastDistance_cm = 0;
void setup() {
lcd.init();
lcd.noBacklight(); // Asegura que la luz de fondo esté apagada al inicio
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(ledCorto, OUTPUT);
pinMode(ledLargo, OUTPUT);
pinMode(botonEncender, INPUT_PULLUP);
pinMode(botonApagar, INPUT_PULLUP);
Serial.begin(115200);
}
void loop() {
bool estadoBotonEncender = digitalRead(botonEncender);
bool estadoBotonApagar = digitalRead(botonApagar);
// Encender la luz de fondo
if (estadoBotonEncender == LOW && !luzEncendida) {
lcd.backlight(); // Encender la luz de fondo
luzEncendida = true;
delay(200);
}
// Apagar la luz de fondo
if (estadoBotonApagar == LOW && luzEncendida) {
lcd.noBacklight(); // Apagar la luz de fondo
luzEncendida = false;
delay(200);
}
float distancia = medirDistancia();
float distancia_cm = distancia;
float distancia_m = distancia / 100.0;
float distancia_km = distancia / 100000.0;
// Imprime los datos en el monitor serial
Serial.print("Distancia: ");
Serial.print(distancia_cm);
Serial.print(" cm, ");
Serial.print(distancia_m);
Serial.print(" m, ");
Serial.print(distancia_km, 2);
Serial.println(" km");
if (abs(distancia_cm - lastDistance_cm) > 1) {
// Actualiza el LCD
lcd.setCursor(0, 0);
lcd.print("Distancia en cm: ");
lcd.setCursor(0, 1);
lcd.print(distancia_cm);
lcd.setCursor(0, 2);
lcd.print("Distancia en m: ");
lcd.setCursor(0, 3);
lcd.print("Distancia en km: ");
lcd.print(distancia_km, 2);
lastDistance_cm = distancia_cm;
}
// Controlar los LEDs según la distancia
if (distancia_cm < 40) {
digitalWrite(ledCorto, HIGH); // Prender LED para distancias cortas
digitalWrite(ledLargo, LOW); // Apagar LED para distancias largas
} else if (distancia_cm >= 40 && distancia_cm <= 200) {
digitalWrite(ledCorto, LOW);
digitalWrite(ledLargo, HIGH); // Prender LED para distancias largas
} else {
digitalWrite(ledCorto, LOW);
digitalWrite(ledLargo, LOW); // Apagar ambos LEDs si la distancia es mayor
}
delay(500);
}
float medirDistancia() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duracion = pulseIn(echoPin, HIGH);
// Calcula la distancia en cm
float distancia = duracion * 0.034 / 2;
return distancia;
}