Acumulacion valores

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;
}

Su publicacion se MUEVE a su ubicacion actual ya que es mas adecuada.

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.

1 Like

¿Será por esto?

Borro el hilo, o ya continuo??

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.

He probado a poner Total = Litros; antes de inicializar a 0 Litros, pero no me toma el valor, no sé por qué, como ya he dicho, soy nuevo en esto...

Quizás deberías poner

total = total + litros

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.

Hay varias cosas que no están muy claras.

Primero la interrupción.

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 :+1:

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.

—-

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.