Hola, estoy intentando hacer que se me imprima en pantalla los litros suministrador por una cuba de riego, el caso es que no sé como hacer que se sumen los litros totales, ya que siempre me marca 0 litros. Los litros suministrados si me los muestra, se pone a 0 para el siguiente arbol, que es lo que quiero, pero quisiera ir sabiendo los totales para saber cuantos litros suministro.
No sé muy bien como hacerlo, soy nuevo en esto, he estado mirando por el foro, pero no llego a comprender muy bien el código.
os dejo el código que tengo a ver si me podeis orientar. Gracias de antemano.
#include <LiquidCrystal_I2C.h> // Debe descargar la Libreria que controla el I2C
#include<Wire.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
const int pulsador_ = 3; //Define la constante pulsador_ en la entrada 3
const int valvula = 12; //Define la constante bomba en la entrada 12
volatile double Litros; //Define la variable Litros como decimal volatil
float Total; //Define la variable Acumulado **
boolean state = false; //Define el valor de la lectura del caudalimetro
int pulsador;
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0); //Primera linea de la pantalla
lcd.print("Litros: "); //Imprime la palabra Litros
lcd.print(Litros); //Imprime el valor de la variable Litros
lcd.print(" L"); //Añade al final el caracter L
lcd.setCursor(0, 1); //Segunda linea de la pantalla **
lcd.print("Total: "); //Imprime la palabra Acumulado **
lcd.print(Total); //Imprime el valor de la variable Acumulado **
lcd.print(" L"); ////Añade al final el caracter L **
Litros = 0;
pinMode(pulsador_, INPUT_PULLUP); //Resistencia de pullup interna
attachInterrupt(0, pulse, RISING); //DIGITAL Pin 2: Interrupt 0
pinMode(valvula, OUTPUT);
}
void loop() {
pulsador = digitalRead(pulsador_);
if (pulsador == 0) {
digitalWrite(valvula, 1);
state = true;
}
if (state == true) {
lcd.setCursor(0, 0);
lcd.print("Litros:");
lcd.print(Litros);
}
if (pulsador != 0) {
digitalWrite(valvula, 0);
state = false;
Litros = 0;
}
}
void pulse() //measure the quantity of square wave
{
Litros += 1.0 / 12.0;
}
Cuando programes, usa la convención de que las variables no empiezan jamás con mayúsculas. No afecta el código pero si las convenciones.
Entonces Litros no, litros en cambio si.
Acá es tu problema
if (pulsador != 0) {
digitalWrite(valvula, 0);
state = false;
Litros = 0;
}
quita ese Litros = 0 y verás los incrementos.
Moderador
Si posteas en el foro en inglés usa ese idioma de lo contrario usa siempre este sitio o foro de Arduino en Español
Tenlo presente y que no se repita.
Tu falta ya quedó anotada en tu historial.
La cuestión es que en Litro hace lo que debe, lo que yo quiero es que Total vaya almacenando los litros que vierto en cada arbol. Es decir, que si yo suministro 15 en un arbol y 20 en el siguiente, Total me muestre la suma de ambos, es decir, 35. Disculparme que me haya explicado tan mal.
Creo que te estoy malentendiendo.
El total es como te dice @tresvdoble pero el total debe ser independiente de tus puestas a cero. Cuando vayas a poner a 0, previo sumas al total, o incluso podría el total incrementarse conforme lo haga Litros.
Tienes algo conectado al pin 2 que genera interrupciones y en cada interrupción la variable Litros aumenta en 0.083 (1/12). ¿Qué hay conectado ahí?
Las variables globales que se usan en las rutinas de interrupción se declaran como volatile para forzar que el compilador las lea y las escriba de memoria dentro de esas rutinas, y no las ponga en registros del CPU por alguna optimización. Eso ya lo estás haciendo
Como las interrupciones son asíncronas estas variables pueden cambiar de valor en “cualquier momento”. En el caso de variables de varios bytes, como Litros, es posible que una interrupción actualice el valor de la variable cuando el programa principal vaya a usarla pero no haya termInado de leer de la memoria algunos de los bytes de la variable. (4 en este caso). Si esto llega a pasar el valor que usaría el programa principal es completamente impredecible.
Para evitar este problema debes desactivar las interrupciones en el programa principal justo antes de usar la variable y reactivarlas inmediatamente después.