// CÓDIGO BASE CRONÓMETRO HASTA 20 SEG.
// Funciones de encender y apagar de forma automática o manual un LED, que
// hace función de la llave de paso de un tanque para suministrar agua.
//---------------------------------------------------------------------------//
// Librerias.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
//---------------------------------------------------------------------------//
// Declaramos los pines conectados a la pantalla LCD.
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Declaramos pines (LEDs & botón).
int ledPin = 47;
int ledPin1 = 1;
int button = 5;
int button1 = 2;
// Inicialización de botón azul presionado, estado del botón azul.
int buttonPressed;
int buttonState = 1;
int ledState = 1;
// Inicialización de botón rojo presionado, estado del botón rojo.
int buttonPressed1;
int buttonState1 = 1;
int ledState1 = 1;
// Inicialización del conteo del cronómetro.
int cont = 0;
// Inicialización de la variable para controlar el modo de funcionamiento.
bool modoAuto = true;
//---------------------------------------------------------------------------//
// Creación de la función actualizar_LCD para limpiar la pantalla y poder
// reiniciar el conteo.
void actualizar_LCD() {
lcd.setCursor(0, 1);
lcd.print("Contador = ");
if(cont < 10){
lcd.print(" ");
}
lcd.print(cont);
}
// Creación de la función auto_H20 para crear de forma automática el
// encendido y apagado del LED Rojo (ledPin1), que simula ser la llave
// del tanque para suministrar agua. Tiene un tiempo de duración igual
// a 5 segundos a partir del segundo 10.
void auto_H20() {
if(cont == 10){
digitalWrite(ledPin1, HIGH); // Enciende el Led rojo.
}
if(cont == 15){
digitalWrite(ledPin1, LOW); // Apaga el Led rojo.
}
}
// Creación de la función manual_H20 para crear de forma manual el
// encendido y apagado del LED Rojo (ledPin1), que simula ser la
// llave del tanque para suministrar agua, se hace uso del botón rojo
// (button1).
void manual_H20() {
// Se lee el estado del botón rojo (presionado o no presionado).
buttonPressed1 = digitalRead(button1) == LOW;
// Comprobar si el botón rojo ha sido presionado.
if(buttonPressed1 && buttonState1 == 0){
// Cambiar el estado del LED rojo.
ledState1 = 1 - ledState1; // Alternar entre 0 y 1.
digitalWrite(ledPin1, ledState1);
}
// Actualizamos el estado del botón rojo.
buttonState1 = buttonPressed1;
}
// Cración de la función control_suministro para delimitar si el suministro
// de agua será manual (haciendo uso del botón azul (button)) o automática
// (encendido y apagado en un tiempo determinado, 5 segundos).
void control_suministro() {
// Se lee el estado del botón azul (presionado o no presionado).
buttonPressed = digitalRead(button) == LOW;
// Comprobar si el botón azul ha sido presionado.
if(buttonPressed && buttonState == 0){
modoAuto = !modoAuto; // Alternar entre el modo automático y el manual.
if(modoAuto){
auto_H20(); // Al ser modoAuto, ejecuta la función auto_H20.
}
}
// Actualizamos el estado del botón azul.
buttonState = buttonPressed;
}
// NOTA: Por defecto el suministro de agua será de forma automática. //
//---------------------------------------------------------------------------//
void setup() {
// Código que se ejecuta una sola vez.
Wire.begin(10, 8);
lcd.init(); // Inicializa pantalla.
lcd.backlight(); // Se le agrega brillo a la pantalla.
lcd.setCursor(0, 0); // El cursor se posiciona en el fila y columna 0,
lcd.print("Hello!"); // imprimen la palabra "Hello!"
// Se configura como salida los pines de los LEDs.
pinMode(ledPin, OUTPUT);
pinMode(ledPin1, OUTPUT);
// El LED Morado (ledPin) se enciende al iniciar el programa.
digitalWrite(ledPin, HIGH);
}
void loop() {
// Código principal que se repite en el loop.
cont++; // El conteo va aumentando.
if(cont > 20){
cont = 1;
}
actualizar_LCD();
if(modoAuto){
auto_H20();
}
else {
manual_H20();
}
control_suministro();
delay(200);
}