PROYECTO LLENADO Y VACIADO DE TANQUE
// LCD
#include <LiquidCrystal.h>aq // RW va siempre a negativo.
LiquidCrystal lcd (9, 8, 7, 6, 5, 4);// (RS, E, D0, D1, D3, D4).
// Sensor y llenado.
const int trigPin = 3; // Pin disparador del sensor.
const int echoPin = 2;// Pin recividor de la seal.
const int relay = 10; // Pin controlador de el llenado.
float duration; // Tiempo de regreso del eco.
float distanceCm; // Distancia medida en centimetros.
float LlenadoT;
float nivel; //Nivel de liquido registrada.
// Panel de control.
const int Start = 11; // Boton de inicio y parado.
const int Emergencia = 12; // Boton de emergencia y parado de llenado.
int ButtonState = 0 ; //Estado inicial del boton 1.
int ButtonState2 = 0 ; // Estado inicial del botno 2 .
int salida = 0; // Constante para activacin de bucle 1.
int salida2 = 0; // Constante para activacion de bucle 2.
/*
// PWM
int brightness = 0; // how bright the LED is
int fadeAmount = 2.5;
int apagado = 0;
int encendido = 5;
*/
// Medidas a CAMBIAR segun modelo utilizado.
float Tanque = 15.5; // Altura del tanque en centimetros.
float AlturaS = 23.5;// Altura a la que esta puesta el sensor.
// Medidas fijas.
float Altura;
float porcentaje; // Porcentaje de llenado.
float porciento = 100; // 100%
int percent; // 20% de el tanque
float AlturaT;
// Indicadores visuales.
int verde = 0;
int amarillo = 1;
int rojo = 13;
void setup() {
lcd.begin(16, 2); // Inicializa la pantalla LCD
// Mensaje de entrada.
lcd.print(" BIENVENIDOS ");
delay(1000);
lcd.setCursor (0, 0);
lcd.print(" ARROCERA ");
lcd.setCursor (0, 1);
lcd.print(" SAN FRANCISCO ");
delay (2000);
lcd.setCursor (0, 0);
lcd.print(" CALIBRANDO ");
lcd.setCursor (0, 1);
lcd.print(" ");
delay(500);
lcd.setCursor (0, 0);
lcd.print(" CALIBRANDO. ");
delay(500);
lcd.setCursor (0, 0);
lcd.print(" CALIBRANDO.. ");
delay(500);
lcd.setCursor (0, 0);
lcd.print(" CALIBRANDO... ");
delay(500);
lcd.setCursor (0, 0);
lcd.print(" CALIBRANDO ");
delay(500);
lcd.setCursor (0, 0);
lcd.print(" CALIBRANDO. ");
delay(500);
lcd.setCursor (0, 0);
lcd.print(" CALIBRANDO.. ");
delay(500);
lcd.setCursor (0, 0);
lcd.print(" CALIBRANDO... ");
delay(500);
lcd.setCursor (0, 0);
lcd.print(" CALIBRANDO ");
delay(500);
lcd.setCursor (0, 0);
lcd.print(" CALIBRANDO. ");
delay(500);
lcd.setCursor (0, 0);
lcd.print(" CALIBRANDO.. ");
delay(500);
lcd.setCursor (0, 0);
lcd.print(" CALIBRANDO... ");
delay(500);
// Sensor y llenado.
pinMode(trigPin, OUTPUT); // Pin controlador de sensor como salida
pinMode(echoPin, INPUT); // Pin recividor de seal en entrada.
pinMode (relay, OUTPUT); // Pin controlador de llenado como salida.
// Panel de control.
pinMode(Start, INPUT); // Estado de entrada del boton 1.
pinMode(Emergencia, INPUT); // Estado de entrada del boton 2.
pinMode (verde, OUTPUT);
pinMode (amarillo, OUTPUT);
pinMode (rojo, OUTPUT);
digitalWrite (rojo, LOW);
digitalWrite (amarillo, LOW);
digitalWrite (verde, LOW);
void loop() {
// Panel de control.
ButtonState = digitalRead (Start); // El estado del boton1 sera igual a la lectura digital.
ButtonState2 = digitalRead (Emergencia); // El estado del boton2 sera igual a la lectura digital.
// Empieza el bucle
if (ButtonState == LOW ) // Si el boton 1 esta en LOW.
salida = 1 - salida; // Salida sera igual a 1.
if (salida == 1) // Si salida es 1.
//Sensor.
digitalWrite(trigPin, LOW); // Inicializa el sensor en bajo.
delayMicroseconds(2); // por 2 microsegundos.
digitalWrite(trigPin, HIGH); // Se mantiene en alto por 10 microsegundos y luego baja.
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH); // Tiempo que tarda la seal en llegar.
// Calculos.
distanceCm = duration * 0.034 / 2; // Calculo de centimetros.
AlturaT = AlturaS - 4 ;
Altura = AlturaT - Tanque; // Calculo para altura del sensor con el tanque.
LlenadoT = Tanque - 5.0 ;
nivel = Tanque - distanceCm + 4.5 ; // Calculo de nivel de agua.
porcentaje = nivel * porciento / LlenadoT ; // Calculo de porcentaje al que esta el tanque.
percent = 20 * Tanque / 100; // Calculo del 20%
//brightness = brightness - fadeAmount;
lcd.setCursor(0, 0); // Coloca el cursor de la pantalla en la posicion "0" para empezar a escribir.
lcd.print("Nivel: "); // Coloca "Nivel; " en la pantalla.
lcd.print(nivel); // Coloca el nivel al que esta el liquido.
lcd.print("cm "); // Coloca la sigla centimetros.
delay(675); // lo hace cada 0.80 segundos.
// Condiciones de llenado.
if (nivel <= LlenadoT - percent) // Si el liquido del tanque esta por debajo del 80%.
digitalWrite (relay, HIGH); // El llenado se activa.
if (ButtonState2 == LOW) // Si boton 2 esta en bajo.
{
salida2 = 1 - salida2; // Salida 2 sera 1.
digitalWrite (rojo, HIGH);
digitalWrite (amarillo, HIGH);
digitalWrite (verde, HIGH);
delay (500);
digitalWrite (rojo, LOW);
digitalWrite (amarillo, LOW);
digitalWrite (verde, LOW);
delay (500);
digitalWrite (rojo, HIGH);
digitalWrite (amarillo, HIGH);
digitalWrite (verde, HIGH);
delay (500);
digitalWrite (rojo, LOW);
digitalWrite (amarillo, LOW);
digitalWrite (verde, LOW);
if (nivel >= LlenadoT || salida2 == 1) // Si el liquido del tanque esta al 100% o Salida 2 es igual a
1.
digitalWrite (relay, LOW); // El llenado se apaga.
// Colocacion del porcentaje presente en el tanque.
if (nivel == nivel) // Cuando se lea el nivel del liquido.
{
// Se imprimira el porcentaje de llenado.
lcd.setCursor (0, 1);
lcd.print (" Tanque: ");
lcd.setCursor(9, 1);
lcd.print(porcentaje);
lcd.setCursor (14, 1);
lcd.print (" % ");
// Si el tanque ha superado su maximo nivel, se mantiene el valor colocado al 100%
if (nivel > LlenadoT - 0.5) {
lcd.setCursor (0, 0);
lcd.print ("Nivel: ");
lcd.setCursor (0, 7);
lcd.print (LlenadoT);
lcd.setCursor (0, 1);
lcd.print ("Tanque: 100.0% ");
// Si el nivel es menor o igual que 0 el porcentaje sera siemore 0% .
if (nivel <= LlenadoT + 0.99 - LlenadoT) {
lcd.setCursor (0, 0);
lcd.print ("Nivel: ");
lcd.setCursor (0, 7);
lcd.print (LlenadoT - LlenadoT);
lcd.setCursor (0, 1);
lcd.print ("Tanque: 0.000% ");
digitalWrite (rojo, HIGH);
delay (200);
digitalWrite (rojo, LOW);
delay (200);
digitalWrite (rojo, HIGH);
delay (200);
digitalWrite (rojo, LOW);
delay (200);
if (porcentaje < 40.0) {
digitalWrite (rojo, HIGH);
digitalWrite (amarillo, LOW);
digitalWrite (verde, LOW);
if ( porcentaje > 40.0) {
digitalWrite (rojo, LOW);
digitalWrite (amarillo, HIGH);
digitalWrite (verde, LOW);
if (porcentaje > 80.0) {
digitalWrite (rojo, LOW);
digitalWrite (amarillo, LOW);
digitalWrite (verde, HIGH);
/* if (nivel >= Tanque/2) {
digitalWrite ();
*/
else // Si el boton no esta en LOW.
digitalWrite (relay, LOW); // El llenado se apaga.
digitalWrite (rojo, HIGH);
digitalWrite (amarillo, LOW);
digitalWrite (verde, LOW);
// Se imprimira un mensaje de espera e inicializacion.
lcd.setCursor (0, 1);
lcd.print ("=================");
delay (2000);
lcd.setCursor (0, 0);
lcd.print (" PAUSADO ");
delay (2000);
lcd.setCursor (0, 0);
lcd.print (" EMPEZAR? ");
delay (3000);
https://www.youtube.com/watch?v=nSbVfp--ttE