Problemas con proyecto contador de agua

Hola, buenas tardes

LLevo unos días con un proyecto sobre contadores de agua, y a las primeras me encuentro con un problema. Uno de los componentes claves, el sensor para contar los litros de agua, me está dando problemas.

Es este:

http://www.ebay.es/itm/271890571576?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1439.l2649

Al parecer , al contar genera una serie de impulsos proporcionales a la cantidad de agua que le atraviesa.

El problema es que no cuenta igual dependiendo del flujo de agua. Si abro medio grifo me genera muchos impulsos. Si abro el grifo a tope genera mucho menos impulsos.

No se si es debido :

--A la velocidad de repuesta del arduino uno. Pienso que poco probable. Cuando abro el grifo
a la mitad pueden ser 10 impulsos por segundo. Estando a tope calculo unos 30 por egundo

-- El sensor pone que es de efecto hall. No se si habra algun problema de incompatibilidad con arduino, o no ofrece suficiente potencia.

-- Hay algún error en el programa

#include <Wire.h>
#include <LiquidCrystal_I2C.h>


LiquidCrystal_I2C lcd(0x27,20,4);
int subida=0;
int bajada=1;
int pulso=0;
int contador=0;
void setup() {
 // put your setup code here, to run once:
 
 Serial.begin(9600);
 
lcd.backlight();
lcd.init();
pinMode(7,INPUT);
}

void loop() {
 // put your main code here, to run repeatedly:
 
 lcd.setCursor(0,0);
 int entrada= digitalRead(7);
lcd.print("CONTADOR =");
lcd.setCursor(12,0);
lcd.print(contador);

lcd.setCursor(0,1);
lcd.print("pulso");
lcd.setCursor(8,1);
lcd.print(pulso);

lcd.setCursor(0,2);
lcd.print("bajada");
lcd.setCursor(9,2);
lcd.print(bajada);

lcd.setCursor(0,3);
lcd.print("subida");
lcd.setCursor(9,3);
lcd.print(subida);


if ((digitalRead(7)== HIGH)&& bajada==1)
{
pulso=1;
bajada=0;
subida=1;
contador++;
}

if ((digitalRead(7)==LOW)&& subida==1)
{
pulso=0;
bajada=1;
subida=0;
 
 }
{


}

 
}

Es bastante sencillo. Una entrada de impulsos en la 7, y he realizado un filtro para que solo sume cuando hay un flaco ascendente.

Espero vuestros consejos

Claro pero se hace al revés, y como en tu caso la medición es importante y no puedes perder pulsos se usa una interrupción (por ejemplo) para no perder pulsos.
La configuras como flanco de subida o bajada y listo.
Incrementas un contador y superada una ventana de tiempo reseteas el contador y sabras que tienes tantos pulsos en X tiempo y por lo tanto, serán tantos Litros / minuto.

Si usas un UNO las entradas 2 y 3 son entradas que pueden programarse como interrupciones externas.
Comandas una pequeÑa rutina que incrementa el contador con cada flanco y listo.

En el loop siempre tendras la cuenta, y presentarás en el LCD

Gracias por contestar.

Estoy muy perdido, pero investigando con lo que comentas he visto algo sobre:

attachInterrupt

FALLING y RISING

Te refieres a trabajar sobre estas instrucciones?

Gracias

correcto.

Si necesitas una variable debes definirla como volatile y luego lo habitula.

volatile unsigned char contador = 0;
void setup()
{
  attachInterrupt(0, rising_CH1, RISING);
 attachInterrupt(0, falling_CH1, FALLING);  
   Serial.begin(115200);
}

void loop()
{
   Serial.print(contador)MLLL:
}

void rising_CH1(){
    Serial.println(" state on PIN_2 changed from 0 TO 1"); 
    contador++;
    }

void falling_CH1(){

    Serial.println(" state on PIN_2 changed from 1 TO 0"); 
    }

Ok, muchas gracias

Mañana pruebo y pongo los resultados

Funciona perfectamente, gracias