#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Definir las constantes para el sensor de ultrasonido 1 (Tinaco)
const int TRIG_PIN = 9;
const int ECHO_PIN = 10;
//Umbrales estan definidos al 90% y 10%
// Definir las constantes para el segundo sensor de ultrasonido 2 (Cisterna)
const int TRIG_PIN_2 = 7;
const int ECHO_PIN_2 = 6;
// Definir las constantes para la pantalla LCD I2C
const int LCD_COLS = 20;
const int LCD_ROWS = 4;
const int LCD_ADDR = 0x27;
// Inicializar la pantalla LCD I2C
LiquidCrystal_I2C lcd(LCD_ADDR, LCD_COLS, LCD_ROWS);
// Definir la constante para el pin del botón
const int BOTON_PIN = 2;
// Definir variable para el estado del botón
bool boton_pulsado = false;
bool boton_previo = false;
// Definir variable para la pantalla actual
int pantalla = 0;
// Definir la constante para la pantalla 3
void setup() {
// Inicializar el pin del botón
pinMode(BOTON_PIN, INPUT);
// Inicializar los pines del sensor de ultrasonido
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Inicializar los pines del sensor 2 de ultrasonido
pinMode(TRIG_PIN_2, OUTPUT);
pinMode(ECHO_PIN_2, INPUT);
// Inicializar la pantalla LCD
lcd.init();
lcd.backlight();
// Mostrar mensaje de inicio en la pantalla LCD
lcd.setCursor(2, 1);
lcd.print("Sistema de Agua");
lcd.setCursor(2, 2);
lcd.print("Inicializando...");
delay(2000);
}
void loop() {
// Leer el estado del botón
boton_pulsado = digitalRead(BOTON_PIN);
// Si el botón está pulsado, cambiar de pantalla
if (boton_pulsado && !boton_previo) {
// Incrementar el valor de pantalla al pulsar el botón
pantalla++;
// Si hemos alcanzado la tercera pantalla, reiniciar a la primera
if (pantalla > 2) {
pantalla = 0;
}
// Esperar un momento para evitar rebotes
delay(200);
}
// Actualizar el estado previo del botón
boton_previo = boton_pulsado;
// Mostrar la pantalla adecuada
switch (pantalla) {
case 0:
// Mostrar la pantalla habitual
mostrar_pantalla_inicio();
break;
case 1:
// Mostrar la pantalla de distancia
mostrar_pantalla_datos();
break;
case 2:
// Mostrar la pantalla 3
mostrar_pantalla_fecha();
break;
}
}
void mostrar_pantalla_datos() {
// Medir la distancia con el sensor de ultrasonido 1
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
int distance = duration / 58;
// Convertir la distancia a porcentaje
int percentage = map(distance, 95, 18, 0, 100);
//Mapear distance guarda, 95cm valor max o 0%(Vacio), 18cm o 100%(Lleno)
if (percentage < 0) {
percentage = 0;
}
if (percentage > 100) {
percentage = 100;
}
// Medir la distancia con el sensor de ultrasonido 2
digitalWrite(TRIG_PIN_2, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN_2, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN_2, LOW);
long duration_2 = pulseIn(ECHO_PIN_2, HIGH);
int distance_2 = duration_2 / 58;
int percentage_2 = map(distance_2, 103, 9, 0, 100);
//Mapear distance guarda, 103cm valor max o 0%(Vacio), 9cm o 100%(Lleno)
if (percentage_2 < 0) {
percentage_2 = 0;
}
if (percentage_2 > 100) {
percentage_2 = 100;
}
// Mostrar la distancia y porcentaje en la pantalla LCD
lcd.clear();
// lcd.setCursor(12, 0);
// lcd.print("Estado :");
// lcd.setCursor(14, 1);
// lcd.print("OFF");
//Sensor 1
lcd.setCursor(0, 0);
lcd.print("Medida 1:");
lcd.setCursor(2, 1);
lcd.print(distance);
lcd.print("cm");
lcd.setCursor(0, 2);
lcd.print("Tanque:");
lcd.setCursor(2, 3);
lcd.print(percentage);
lcd.print("%");
//Sensor 2
lcd.setCursor(11, 0);
lcd.print("Medida 2:");
lcd.setCursor(14, 1);
lcd.print(distance_2);
lcd.print("cm");
lcd.setCursor(11, 2);
lcd.print(" Aljibe :");
lcd.setCursor(14, 3);
lcd.print(percentage_2);
lcd.print("%");
delay(1000);
}
void mostrar_pantalla_inicio() {
// Medir la distancia con el sensor de ultrasonido 1
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
int distance = duration / 58;
// Convertir la distancia a porcentaje
int percentage = map(distance, 95, 18, 0, 100);
//Mapear distance guarda, 95cm valor max o 0%(Vacio), 18cm o 100%(Lleno)
if (percentage < 0) {
percentage = 0;
}
if (percentage > 100) {
percentage = 100;
}
// Medir la distancia con el sensor de ultrasonido 2
digitalWrite(TRIG_PIN_2, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN_2, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN_2, LOW);
long duration_2 = pulseIn(ECHO_PIN_2, HIGH);
int distance_2 = duration_2 / 58;
int percentage_2 = map(distance_2, 103, 9, 0, 100);
//Mapear distance guarda, 103cm valor max o 0%(Vacio), 9cm o 100%(Lleno)
if (percentage_2 < 0) {
percentage_2 = 0;
}
if (percentage_2 > 100) {
percentage_2 = 100;
}
// Mostrar la distancia y porcentaje en la pantalla LCD
lcd.clear();
// lcd.setCursor(12, 0);
// lcd.print("Estado :");
// lcd.setCursor(14, 1);
// lcd.print("OFF");
//Sensor 1
lcd.setCursor(0, 0);
lcd.print("Tanque:");
lcd.setCursor(2, 1);
lcd.print(percentage);
lcd.print("%");
//Sensor 2
lcd.setCursor(11, 0);
lcd.print(" Aljibe :");
lcd.setCursor(14, 1);
lcd.print(percentage_2);
lcd.print("%");
// Mostrar hora
lcd.setCursor(3, 2);
lcd.print("Hora: 13:00:34");
// Mostrar fecha
lcd.setCursor(1, 3);
lcd.print("Fecha: 13/23/2023");
delay(1000);
}
// Definir la función para mostrar la pantalla 3
void mostrar_pantalla_fecha() {
// Limpiar la pantalla
lcd.clear();
// Mostrar hora
lcd.setCursor(2, 1);
lcd.print("Hora:");
lcd.print("13:00:34");
// Mostrar fecha
lcd.setCursor(2, 2);
lcd.print("Fecha:");
lcd.print("13/23/2023");
delay(1000);
}