Calcular produccion Kg/h

Hola gente mi nombre es Miguel estoy aprendiendo arduino asi que soy nuevo en esto, estoy queriendo calcular los Kilogramos hora de producto que pasan por una balanza, La balanza tiene una clapeta que abre cae la mercaderia a un balde cuando llego a 20Kg cierra la clapeta y abre el balde para descargar. Tomando el tiempo del ciclo desde que cerró el balde abrió y volvió a cerrar puedo saber los Kg/h que estan pasando. Tengo dos balanzas en una el ciclo dura 19 segundos y en la otra 87 segundos.
Para medir el tiempo estoy usando pulseIn, y este me arroja un resultado despues de 3 ciclos nose si la función es asi o porque está pasando esto, otro problema es que los resultados nunca son iguales actualmente estoy simulando los ciclos con un 555 y tengo resultados aleatorios 3127 kg/h, 3132kg/h, 3116kg/h, 3129kg/h.
Y también quiero hacer un contador para saber los Kg totales al final del dia pero al usar pulseIn el contador no me funciona, dejo los códigos para que los vean son muy sencillos. Posiblemente hay otras formas de medir tiempo pero como soy nuevo nose.

Gracias de antemano.

Calculador Kg/h

unsigned long duracion1;
unsigned long duracion2;
float tiempo;
float tiempo1;
float duraciontot;
int seg =60;
int hora =60;
int peso =20; 

float balmin ;
float balhora ;
int kgh ;

#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 8, 9, 10, 11, 12); 
void setup ()
{
lcd.begin(16, 2); 
lcd.setCursor(8, 0);
lcd.print ("Kg/h");
}

void loop ()
{
duracion1 = pulseIn (2, HIGH,100000000);
duracion2 = pulseIn (2, LOW,100000000);

duraciontot =duracion1+duracion2; 
tiempo = duraciontot/1000;
tiempo1=tiempo/1000;


balmin = seg/tiempo1;
balhora = balmin*hora;
kgh = balhora*peso;

lcd.setCursor(4, 0);
lcd.print(kgh);
}

Contador Kg total

int contador = 0;
bool dato = LOW;
bool datoAnterior = LOW;

#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 8, 9, 10, 11, 12); 

void setup() {
lcd.begin(16, 2);   
lcd.setCursor(8, 1);
lcd.print ("Kg/tot");
pinMode(2,INPUT);

}

void loop() {
 dato = digitalRead(2);
 if (dato == HIGH && datoAnterior == LOW)
 {
  contador+=20;
 }
 datoAnterior = dato;
 lcd.setCursor(4, 1);
lcd.print(contador);
}

mvvs35:
estoy queriendo calcular los Kilogramos hora de producto que pasan por una balanza, La balanza tiene una clapeta que abre cae la mercaderia a un balde cuando llego a 20Kg cierra la clapeta y abre el balde para descargar. Tomando el tiempo del ciclo desde que cerró el balde abrió y volvió a cerrar puedo saber los Kg/h que estan pasando. Tengo dos balanzas en una el ciclo dura 19 segundos y en la otra 87 segundos.

Segun esta explicacion debes tener 2 contactos uno en la clapeta de la balanza y otro de la tapa del balde. Si es asi porque usas solo el pin 2 ?

duracion1 = pulseIn(2, HIGH, 100000000);
duracion2 = pulseIn(2, LOW, 100000000);

Quizas debas consultar punseIn()

mvvs35:
Tengo dos balanzas en una el ciclo dura 19 segundos y en la otra 87 segundos.

Olvidaste explicar la función de la segunda balanza.

Si tu cliclo toma aprox 19 segundos yo tomaria la suma de los ultimos 9 o 10 ciclos para sacar un promedio y calcular kg/h. Te recomiendo implementar un buffer circular.[/code]

Hola Kike gracias por responder mido solo el tiempo que demora en llenar el balde con 20kg no hace falta medir que hace la clapeta, tengo dos balanzas de producción que son iguales una para un tipo de producto y la otra para otro, por eso mencione los tiempos que demora una y la otra, estoy usando un Arduino NANO y estoy estudiando la funcion millis () para medir el tiempo en vez de pulsein () porque esta nose si funciona asi o que pero recién me da una medición después de 3 ciclos y se pone lento el calculo mas si quiero promediar varios tiempos o el resultado Kg/h.

Lo que ocurre es que no has leído como funciona PulseIn(). Hasta que no termina de ver un cambio en el pulso o se termina el tiempo indicado al final.
Con millis() puedes medir las dos cosas simultáneamente.

Si vas a documentación => INdice de temas tutoriales => millis() encontraràs como usarla.

Entiendo que lo que quieres medir es el tiempo total de ciclo y por eso intentas medir el pulso en HIGH mas el LOW con pulseIn(). float obliga a un redondeo (recuerda que solo manejan una precisión de 6 dígitos).

Ademas tus operaciones con float no son correctas. Cuando divides hay que poner también un float algo así 20.0

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

unsigned long duracion1;
unsigned long duracion2;
float kgh;                  //Error poner int

void setup (){
   lcd.begin(16, 2);
   lcd.setCursor(8, 0);
   lcd.print ("Kg/h");
}

void loop (){
   duracion1 = pulseIn(2, HIGH, 100000000);
   duracion2 = pulseIn(2, LOW, 100000000);
   //1h = 60 min * 60 seg * 1000 mili * 1000 micro
   kgh = 20.0 * 3600000000.0 / (duracion1 + duracion2);
   lcd.setCursor(4, 0);
   lcd.print(kgh, 2);      //Mostrar 2 decimales
}

Como dice Surbyte, bastara identificar el momento en que el pin 2 pasa de LOW a HIGH (RISSING) para identificar el ciclo completo y usar millis().

Mira este ejemplo:

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

unsigned long t1,t2;
bool actual,anterior;
float kgh;

void setup (){
   lcd.begin(16, 2);
   lcd.setCursor(10, 0);
   lcd.print ("Kg/h");
}

void loop (){
   actual = digitalRead(2);
   if (actual && !anterior){
       t2 = t1;
       t1 = millis();
   }
   anterior = actual;
   //Para que no muestre el primero que estará errado
   if (t2>0){
      kgh = 20.0 * 3600000000.0 / (t1 - t2);
      lcd.setCursor(4, 0);
      lcd.print(kgh, 2);
   }
}

Gracias Surbyte y gracias KiKe :smiley: !! usando el ejemplo que me pasaste pude hacer que ande y tambien agregue el contador, voy a probar en la balanza como se comporta y si hace falta voy a promediar 5 lecturas. el codigo quedo asi

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

unsigned long t1,t2;
bool actual,anterior;
float duraciontot;   // tiempo alto + bajo
int seg =60;    //60 segundos
int hora =60;   //60 minutos
int peso =20;   // 20kg
float ciclo;    // 
float balmin ; // balanzadas minuto
float balhora ; // balanzadas hora 
unsigned long contador = 0;
bool dato = LOW;
bool datoAnterior = LOW;
float kgh;

void setup (){
   lcd.begin(16, 2);
   lcd.setCursor(10, 0);
   lcd.print ("Kg/H");
   lcd.setCursor(10, 1);
   lcd.print ("Kg/Tot");
}

void loop (){
   actual = digitalRead(2);
   if (actual && !anterior){
       t2 = t1;
       t1 = millis();
   }
   anterior = actual;
   //Para que no muestre el primero que estará errado
   if (t2>0){
      duraciontot =(t1 - t2);

      ciclo=duraciontot/1000;   // paso de mili a segundos

      balmin = seg/ciclo;    // calculo balanzadas minuto
      balhora = balmin*hora;  // calculo balanzadas hora
      kgh = balhora*peso;  //calculo los Kg/H

      lcd.setCursor(1, 0);
      lcd.print(kgh);

       dato = digitalRead(2);
 if (dato == HIGH && datoAnterior == LOW)
 {
  contador+=20;
 }
 datoAnterior = dato;
 lcd.setCursor(3, 1);
lcd.print(contador);
   }
}

Ves como cambia todo, pasas de leer mal a poder leer varias mediciones y hasta promediarlas.
El cambio es notable y el programa fluye con velocidad.

Ahora que leiste y entendiste el uso de millis() te recomiendo que leas las máquinas de estado. Es mas complejo pero verás varios ejemplos en el foro que tendras que buscar porque tanto Kike, otros foreros y yo la hemos sugerido muchas veces.
El conjunto maquina de estados y millis() te brinda lo que necesitas para tener un programa veloz y que hace las cosas cuando quieres.