int A = 2;      //variable A a pin digital 2 (DT en modulo)
int B = 4;        //variable B a pin digital 4 (CLK en modulo)

int ANTERIOR = 50;    // almacena valor anterior de la variable POSICION

volatile int POSICION = 50; // variable POSICION con valor inicial de 50 y definida
        // como global al ser usada en loop e ISR (encoder)
void setup() {
  pinMode(A, INPUT);    // A como entrada
  pinMode(B, INPUT);    // B como entrada

  Serial.begin(9600);   // incializacion de comunicacion serie a 9600 bps

  attachInterrupt(digitalPinToInterrupt(A), encoder, LOW);// interrupcion sobre pin A con
                // funcion ISR encoder y modo LOW
  Serial.println("Listo");  // imprime en monitor serial Listo
}


void loop() {
  if (POSICION != ANTERIOR) { // si el valor de POSICION es distinto de ANTERIOR
    Serial.println(POSICION); // imprime valor de POSICION
    ANTERIOR = POSICION ; // asigna a ANTERIOR el valor actualizado de POSICION
  }
}

void encoder()  {
  static unsigned long ultimaInterrupcion = 0;  // variable static con ultimo valor de
            // tiempo de interrupcion
  unsigned long tiempoInterrupcion = millis();  // variable almacena valor de func. millis

  if (tiempoInterrupcion - ultimaInterrupcion > 5) {  // rutina antirebote desestima
              // pulsos menores a 5 mseg.
    if (digitalRead(B) == HIGH)     // si B es HIGH, sentido horario
    {
      POSICION++ ; Serial.print("AT+FREU");       // incrementa POSICION en 1
    }
    else {          // si B es LOW, senti anti horario
      POSICION-- ; Serial.print("AT+FRED");      // decrementa POSICION en 1
    }

    POSICION = min(100, max(0, POSICION));  // establece limite inferior de 0 y
            // superior de 100 para POSICION
    ultimaInterrupcion = tiempoInterrupcion;  // guarda valor actualizado del tiempo
  }           // de la interrupcion en variable static
}