Hola. Aclarar que no se trata de que el código sea más o menos "grande", sino cuánto tiempo transcurre entre se comprueba el estado de un encoder y se vuelve a comprobar de nuevo el estado de ese encoder. Porque si se tarda demasiado entre cada comprobación, es muy probable que se "pierdan" los cambios que nos indican los pasos del encoder. ¿Cuánto es "tardar demasiado"? Pues depende de la velocidad de los cambios de las señales del encoder.
Como he dicho, no depende del tamaño del programa, sino lo que tarde en "hacer el resto de cosas" entre cada verificación del estado del encoder. No sólo líneas y líneas de ejecución de programa "alargan" ese tiempo, sino que también los los delay() (que los hay en en programa aunque rara vez se ejecuten), y los bucles for. Hay unos cuantos bucles que hacen que un par de líneas de código se ejecuten como si fueran unas decenas de líneas.
Para solucionar el problema de los delay() y los for habría que orientar el código a millis() y máquinas de estados. Pero si quieres "hacer un apaño" y ver si "escapas", dispuestos ha hacer una chapuza, yo pondría el control de los encoders en una función y llamaría a esa función justo antes de cada trozo de programa que contenga un for. Pero, eso sería un apaño bastante chapucero. Lo mejor es orientar todo el código a máquinas de estados y millis(). Y aún así, tal vez, si los encoders van a "demasiada velocidad",
no garantizo que funcionen adecuadamente y sería necesario hacerlo con interrupciones. Si lo hicieras con interrupciones, tal vez no fueran tan críticos los bucles que tienes en el código.
¿Cómo nos podemos librar de los for? La idea es que en lugar de procesar todos los botones "de golpe" y en una sola pasada con bucles, procesamos un botón por cada ciclo del loop(). En cada ciclo de ejecución del loop() yo verificaría todos los encoders y luego uno de los botones. Incluso el resto de cosas no las verificaría todas en cada ciclo, sino una de ellas cada vez.
Como ejemplo de cómo "deshacerse" de un for, para que éste no "entretenga" el loop(), puedes ver este foro el hilo usar millis() junto con for() donde propongo un par de ideas.
En cuanto a las máquinas de estado, hay unos cuantos tutoriales en este mismo foro en la sección de documentación: Indice de temas Tutoriales.
Y si quieres un ejemplo de uso de máquinas de estados "paso a paso", en el hilo alarma temporizada en un mismo led al presionar un botón trato de explicar paso a paso el desarrollo de un programa usando máquinas de estados y millis().