Medición lineal con encoder

Buen día, tengo una duda con mi programa y las lecturas que hace.
Mi intención es hacer un dispositivo para medir metros lineales, mas especifico el largo de rollos de papel, aproximadamente miden 4000 metros.
Estoy utilizando un encoder rotativo con nomenclatura 153-020-1000-180SCJ de la marca Dynamic Resource Corp., un arduino uno y un LCD 16x2 para visualizar los datos.

El encoder tiene canal A+A- B+B-, solamente estoy conectando A+ y B+ para la lectura, lo cual tampoco se si estoy en lo correcto ya que no se mucho de encoders. En el programa que hice es el siguiente:

#include <LiquidCrystal.h>

LiquidCrystal lcd(5, 6, 7, 8, 9, 10);

int pin1 = 2;
int pin2 = 3;

int Pos = 0; 
int State;
int LastState;  

const float pi = 3.14; 

const float R =5.3; //DIAMETRO 5.3 , rADIO 2.26
const int N = ; // Numero de pasos 

float distancia = 0;
float dist = 0;

void setup() { 
  pinMode (pin1 ,INPUT_PULLUP);
  pinMode (pin2 ,INPUT_PULLUP);

  lcd.begin(16, 2);
  lcd.print("LARGO DE BOBINA");
  
  LastState = digitalRead(pin1);   
   
} 

void loop() { 
  State = digitalRead(pin1);
   if (State != LastState){     
     if (digitalRead(pin2) != State) { 
       Pos ++;
     } 
     
     
   } 

  distancia = ((pi*R)/N) * Pos ; //Longitud de la rueda sobre le numero de pasos del encoder por la posicion del encoder 
  dist = distancia * .01;

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

  lcd.setCursor(10, 1);
  lcd.print("mts");
   
  LastState = State;
  
}

Este código lo habia usado para un encoder en cuadratura, pero tuve que cambiarlo ya que a altas velocidades perdía la lectura. Mi duda es si el mismo código puede ser aplicado para este nuevo encoder, y si la formula que estoy utilizando para determinar la distancia de la rueda esta correcta y sobre todo si la lectura del encoder la estoy haciendo bien. Ojala alguien me pueda ayudar, ya que tambien el motor encuentro cuantos pasos posee o que hacer

Moderador
Por favor edita tu post usando etiquetas de código.

Normas del foro

Existe una librería Encoder que funciona usando interrupciones para justamente no perderse nada.
Porque no la usas?

si la formula que estoy utilizando para determinar la distancia de la rueda esta correcta

Un simple prueba de una distancia conocida te dará la respuesta.

int Pos = 0;

Para mi esta mal, si no hago mal las cuentas quiere decir que para 32656 cuentas o sea

distancia = 3.14 * 5.3 * 32768/400 (supongo 400 no lo he buscado).

distancia = 1341.84 cm = 13.418 mts

Si ese rango es suficiente estará bien pero.... mira que cambios simples puedes lograr.
Primero en lugar de int usa unsigned int y pasas al doble

unsigned int Pos;

2^16 = 65536
Entonces distancia = 27.26 mts

Y si usas unsigned long = 2^32 = 4.294.967.296 => el número es enorme.

No se mucho sobre arduino, investigue sobre lo que dices de la librería de Encoder y encontré una función llamada attachInterrupt, no se si te refieras a esa? Pero no se como introducirla a mi codigo ya que en varios ejemplos solo usan un canal, pero yo uso 2.

Con el encoder en cuadratura que había utilizado antes si me daba la medida que quería medir, pero cuando pase a este nuevo encoder no me muestra valores reales.
Y por su matricula quiero creer que son 1000 pulsos por revolución.

Hola, la funcion attachInterrupt() es propia de arduino no necesitas una libreria. Yo estoy muy atento a este hilo que abriste pues me pasa lo mismo, tal vez tu solucion sea la mia. En mi caso estoy usando un motorcito de escaner de una HP que viene con un encoder en su eje. Te muestro el programa que use (que como dije saltea pasos, no es un ejemplo a seguir) pero es un poco para que veas como esta usada la funcion de interrupcion sobre el canal A y fijate que el canal B se usa tambien en la funcion encoder() simplemente para preguntar cual el el estado de B cuando el canal A se interrumpe de esta manera sabemos el sentido del giro. (FALLING, significa que hace interrupcion solo en los flancos de bajada)
Saludos.
EDITO: Bueno cuando dije que me pasa lo mismo es porque me parecio haber leido que te salteaba pasos en la lectura pero ahora que lo releo un poco mejor en ningun lugar dice eso!! jaja

/*
  Encoder, motorcito de escaner hp
  pines 1 y 2 (del conector que le solde)a pines 2 y 3 de arduino
  pin 3--->3.3v y pin 4--->GND  
  pines 5 y el suelto 6 van directo al motor

*/

int A = 2;      
int B = 3;
int C = 4;        

unsigned long ANTERIOR = 0;    
volatile unsigned long POSICION = 0; 
void setup() {
  pinMode(A, INPUT);    
  pinMode(B, INPUT);    
  pinMode(C,OUTPUT);
  digitalWrite(C,LOW);
  Serial.begin(9600);   

  attachInterrupt(digitalPinToInterrupt(A), encoder, FALLING);
 
  // ESperamos 10 seg y arrancamos el motor
  delay(10000);
  Serial.println("YA!");
  digitalWrite(C,HIGH); // a la base del transistor que activa el motor.
}

void loop() {

  ANTERIOR = POSICION ; 
   
  if (POSICION != ANTERIOR and POSICION > (13600)) {  //1 vuelta corona aprox 13600
        digitalWrite(C,LOW);
    if (digitalRead(C) == LOW) Serial.println(POSICION); // imprime valor de POSICION
  }
 
}

void encoder()  {    

//--------------------------------------------------------

    if (digitalRead(B) == LOW)     // aqui pregunta por B pues se supone que a esta funcion se llega con A en FALLING
    {
      POSICION++ ;        // incrementa POSICION en 1
    }                                                      
    else {          // 
      POSICION-- ;        // decrementa POSICION en 1
    }
//--------------------------------------------------------

En este mundo de Arduino lo primero que debes hacer es preguntar a tu buscador en este caso: Arduino Encoder

Y recibes por ejemplo esto: Luis Llamas Medir angulo y sentido de giro

Y acá la Página oficial de Arduino con los Rotary Enconders

@surbyte, no te das una idea de todo lo que busque, primero tratando de averiguar los pines del encoder y luego la programacion en principio esas 2 cosas las obtuve de aqui:

su programa funciona tal como alli se muestra, pero girando a mano,y girando a mano tranquilo, si le doy con entusiasmo se saltea numeros, la pag. de Luis LLamas ya la habia visitado pero, sinceramente, no es que cada sitio que visito lo pongo a prueba. Buscar e investigar es lo mas entretenido mas si uno lo hace de puro hobby.

EDITO: me olvidaba!, gracias de todas formas.

Con la librería enconder (entiéndase usando interrupciones) no deberías tener problemas.
Usar interrupciones asegura el modo rápido. El modo lento no debería fallar.