Rutina en millis() unas no las ejecuta después de 30 seg de encendido

Buenas noches quisiera saber si alguien me puede ayudar en si el siguiente proceso intentado de realizar con millis() se encuentra bien ya que cuando lo estoy corriendo y millis sobrepasa mas o menos los 30 segundos el programa cae en un bucle, si sale del bucle despues de un tiempo pero me resta muchas veces la variable l–

 te2 = millis();
        te3 = l * 4000;
        while ((millis() - te2) < te3) {
          timl = millis();


          while ((millis() - timl) < 4000) {//repite este while por mucho tiempo 


            te1 = millis();
            while ((millis() - te1) < 500) {//sin ejecutar estos
              pause();
              digitalWrite(mder, HIGH);
            }


            te1 = millis();
            while ((millis() - te1) < 500) {//sin ejecutar estos
              pause();
              digitalWrite(mder, LOW);
            }


            te1 = millis();
            while ((millis() - te1) < 500) {//sin ejecutar estos
              pause();
              digitalWrite(mizq, HIGH);
            }


            te1 = millis();
            while ((millis() - te1) < 500) {//sin ejecutar estos
              pause();
              digitalWrite(mizq, LOW);
            }
          }
          l--;//solo restando e imprimiendo en pantalla que es la siguiente linea.
          printciclo();
        }

Buen dia, no pones el codigo completo, asi va a ser muy dificil que recibas ayuda, que te hace pensar que tu problema esta en el pedazo de codigo que posteaste y no en otro lado, por ejemplo: como podemos saber si declaraste bien las variables, ¿porque te digo esto?, dices

mas o menos los 30 segundos el programa cae en un bucle

esto podría pasar si una variable en la que usas millis() la declaras con int en lugar de unsigned long, la variable se desborda pasados los 30 segundos. Por eso es importante un código completo
Mirando rápidamente la parte del código que subiste, el problema que veo, es que usas, muchos while ademas adentro de otros while.
El while es un recurso que debes usar con cuidado, si no tienes las debidas precauciones entras en bucles que pueden ser difíciles de detectar y pueden causar dolores de cabeza, yo usaría en tu lugar if()

Ahora en esta parte:

te2 = millis();
        te3 = l * 4000;
        while ((millis() - te2) < te3) {

a millis() le restas te2 y luego lo comparas con te3, nunca saldrá del while porque le dices que te2= millis() y luego le restas millis, entonces millis()-te2(que vale millis) = 0, 0 es menor que te3 porque te3= l*4000, entras al while y nunca vas a salir de ahí porque nunca cambias el valor de te2 ni de te3
Sube el código completo y danos un panorama de lo que quieres lograr y sera mas fácil ayudarte

muchas gracias por tu respuesta al parecer si es lo del int pot unsigned long, es que antes habia subido el codigo completo pero no pbtube muchas respuestas, esta vez me decidí a subir solo la parte en la que me daba lios, si me puedes ayudar, aca tengo este post con el codigo completo, aun no logro hacer que el pause regrese de su estado de pause con el mismo boton no se que hacer.

https://forum.arduino.cc/index.php?topic=606674.0

este es el hilo donde esta el codigo completo

muchas gracias por tu ayuda

Bien estoy viendo tu código, solo te quiero hacer una pregunta, ¿tu hiciste el código completo o copiaste fragmentos de otros códigos o te ayudaron a hacerlo? te hago la pregunta porque veo inconsistencia en el mismo, por un lado veo cosas como #define, uint_8, manejo de arreglos y funciones, que solo las ves en códigos de alguien con experiencia y por otro lado veo fallas como mal manejo de las variables o algunas como esta :pinMode(button[BTN_MENU], INPUT_PULLUP); que son errores que se comenten al empezar a programar.
No quiero que me tomes a mal la pregunta ni te ofendas, es solo que quiero saber como hiciste el código y cuando yo haga un cambio entiendas porque y para que, y que esto no se complique mas, espero entiendas la razón.
Pasando a tu código es un poco largo pero , rápidamente encontré varias fallas y no me compila.
Aquí ya es la 1 A:M y mañana tengo trabajo, pero por la tarde le hecho un vistazo a tu código y te paso algunas correcciones, para ir probando
saludos

Yo medio se programar, pero soy principiante, el código lo entiendo, pero si, he tomado muchos fragmentos de diferentes lugares, a mi el código me compila normal, es más, me corre en una simulación en proteus, ya que aún no me ha llegado el arduino, y ya en el cambio que realicé de unsigned long, el programa corre normal y hace lo que necesito

Ejemplo, esta parte que dices
pinMode(button[BTN_MENU], INPUT_PULLUP);
La hizo él que hizo la maquina de estados

Muchas gracias por tu ayuda

Bien, que bueno que te funcionó solo cambiando el tipo de variable, entonces damos por cerrado el hilo?

si yo creeria que ya esta cerrado creare otro para ver como hago para la pausa, muchisimas gracias, espero verte en el otro tema, muchas gracias por tu ayuda.