problemas con contador de pulsos y encoder

Hola a todos. Estoy intentando hacer un contador de metros lineales de cinta, utilizo un rodillo, una rueda dentada y un final de carrera óptico. El problema que tengo es que si hago girar el rodillo lentamente me mide una cantidad de centímetros y si lo hago girar más rápido me mide una cantidad diferente.

He probado a quitar los posibles “rebotes” por software, he puesto un capacitador de 0,1uf entre el GND y la salida de datos, he probado varios sketch que me he encontrado por ahí y no funciona nada…

Este es el sketch que estoy utilizando ahora basado en uno de Profe Garcia.

volatile int contador=0;

#include <LiquidCrystal_I2C.h>


LiquidCrystal_I2C lcd(0x3F, 16, 2);

int centimetros = 0;

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
attachInterrupt(1,interrupcion0,RISING);
lcd.begin();

}

void loop() {
 
  centimetros = (((contador * 0.107 * 3.141592) * (19 / 2) / 10)); 

//delay(999);
Serial.print(contador/**30*/);
Serial.println("RPM");
//contador=0;
lcd.setCursor(0, 0);   
    lcd.print(centimetros); 

}

void interrupcion0()
{contador++;
}

Soy autodidacta en esto de la electrónica y programación, no me metáis mucha caña por favor :smiley:

A ver si me podéis orientar un poco, porque estoy desesperao ya.

Muchisimas gracias de antemano!!

¿Que Arduino estas utilizando?

Sin valorar las formulas que utilizas.

davidrummer:
centimetros = (((contador * 0.107 * 3.141592) * (19 / 2) / 10));

a) Aquí sobran paréntesis.

b) mientras se hacen cálculos con variables que son modificadas por una interrupción, lo adecuado es desactivar dicha función.
detachinterrupt(xxxxxxxxx);
centimetros = (((contador * 0.107 * 3.141592) * (19 / 2) / 10));
atachinterrupt(xxxxxxxxxxx)

c) Como nos interesa que la interrupción este inactiva el menor tiempo posible, nos conviene aligerar el cálculo, en tu caso 3 multiplicaciones y 2 divisiones, puedes cambiarlo por una sola multiplicación

detachinterrupt(xxxxxxxxx);
centimetros = contador * 0.31934;
atachinterrupt(xxxxxxxxxxx)

davidrummer:
He probado a quitar los posibles “rebotes” por software, he puesto un capacitador de 0,1uf entre el GND y la salida de datos,

Salida de datos, supongo que te refieres a la salida del final de carrera óptico, el cual no conocemos, pero que intuyo que ya tiene una salida trigger-schmidt o similar, sin rebotes, con lo que poner este condensador es contraproducente.