// --- ZONA DE INGREDIENTES ---
// Aquí le decimos al cerebro (Arduino) qué partes tiene conectadas.
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // Librería para la pantalla (la libreta donde escribimos)
// Creamos la pantalla (se llama 'lcd')
LiquidCrystal_I2C lcd(0x27,16,2);
// Nombramos los pines (los enchufes del Arduino)
const int Bocina_Sensor = 9; // El 'Trigger': Por aquí grita el sensor
const int Oido_Sensor = 10; // El 'Echo': Por aquí escucha el eco
const int Luz_ROJA = 2; // Peligro
const int Luz_NARANJA = 3; // Cuidado
const int Luz_VERDE = 4; // Todo bien
// ¿Qué tan alto es tu túnel? (Digamos que 9 unidades)
const int ALTO_DEL_TUNEL = 400; //estaba en 9
// --- CONFIGURACIÓN (Se hace una sola vez al encender) ---
void setup() {
// Preparamos los pines
pinMode(Bocina_Sensor, OUTPUT); // La boca es para hablar (salida)
pinMode(Oido_Sensor, INPUT); // El oído es para escuchar (entrada)
// Preparamos las luces
pinMode(Luz_ROJA, OUTPUT);
pinMode(Luz_NARANJA, OUTPUT);
pinMode(Luz_VERDE, OUTPUT);
// Encendemos la pantalla y su luz de fondo
lcd.init();
lcd.backlight();
// Saludo inicial
lcd.setCursor(0,0);
lcd.print("Hola! Iniciando");
delay(2000); // Esperamos 2 segundos
lcd.clear(); // Borramos la pantalla
}
// --- BUCLE INFINITO (Esto se repite por siempre) ---
void loop() {
long duracion_del_eco;
int distancia_aire;
int nivel_agua;
// 1. EL GRITO DEL MURCIÉLAGO 🦇
// Primero silencio, luego un grito corto, luego silencio
digitalWrite(Bocina_Sensor, LOW);
delayMicroseconds(2);
digitalWrite(Bocina_Sensor, HIGH); // ¡GRITA!
delayMicroseconds(10);
digitalWrite(Bocina_Sensor, LOW); // Calla
// 2. ESCUCHAR EL ECO 👂
// Medimos cuánto tardó en volver el sonido
duracion_del_eco = pulseIn(Oido_Sensor, HIGH);
// 3. MATEMÁTICAS MÁGICAS 🧮
// Convertimos el tiempo en distancia (espacio vacío sobre el agua)
distancia_aire = duracion_del_eco * 0.034 / 2;
// 4. CALCULAR EL AGUA 💧
// Si el túnel mide 9 y hay 2 de aire... ¡Hay 7 de agua!
nivel_agua = ALTO_DEL_TUNEL - distancia_aire;
// Corrección: Si las matemáticas dan error y sale negativo, ponemos 0
if (nivel_agua < 0) {
nivel_agua = 0;
}
// 5. ESCRIBIR EN LA PANTALLA 📝
lcd.setCursor(0,0); // Fila de arriba
lcd.print("Nivel Agua: ");
lcd.print(nivel_agua);
lcd.print("m "); // Ponemos la 'm' de metros
// 6. EL SEMÁFORO INTELIGENTE 🚦
// PREGUNTA 1: ¿Está lleno (7, 8 o 9)? -> ¡VERDE!
if (nivel_agua >= 300) {
digitalWrite(Luz_VERDE, HIGH); // Enciende Verde
digitalWrite(Luz_NARANJA, LOW); // Apaga las otras
digitalWrite(Luz_ROJA, LOW);
lcd.setCursor(0,1); // Fila de abajo
lcd.print("SI GENERA! :) "); // Mensaje feliz
}
// PREGUNTA 2: ¿Está medio lleno (4, 5 o 6)? -> ¡NARANJA!
else if (nivel_agua >= 200) {
digitalWrite(Luz_VERDE, LOW);
digitalWrite(Luz_NARANJA, HIGH); // Enciende Naranja
digitalWrite(Luz_ROJA, LOW);
lcd.setCursor(0,1);
lcd.print("ALERTA... :/ "); // Mensaje de duda
}
// PREGUNTA 3: ¿Está muy bajo (0, 1, 2 o 3)? -> ¡ROJO!
else {
digitalWrite(Luz_VERDE, LOW);
digitalWrite(Luz_NARANJA, LOW);
digitalWrite(Luz_ROJA, HIGH); // Enciende Rojo
lcd.setCursor(0,1);
lcd.print("NO GENERA! :( "); // Mensaje triste
}
delay(1000); // El murciélago descansa 1 segundo antes de volver a medir
}