En qué parte del código debo ubicar el millis()?

Buenas

Tengo un código estructurado de la siguiente forma

void setup()
void secuencia 1() // Muestra Tª max y min
void secuencia 2() // Muestra Tª y H%
void secuencia 3() // Muestra  Tª2
void secuencia 4() // Muestra voltímetro

Void loop (){
secuencia 2() //empieza por defecto mostrando Tª y H%
}

Cada secuencia me muestra el valor de un sensor en una pantalla hasta que se mueve un joystick que dependiendo la dirección va a una u otra secuencia. A final de cada secuencia comprueba si hay movimiento en el eje x e Y del joystick y si no hay... repite de nuevo la misma secuencia.

Es decir, el void loop inicia en secuencia 2, pero luego puedo ir a cualquiera de las otras, donde permanecerá ejecutándola si no hay movimiento en el joystick

Tengo una duda de dónde debo colocar un millis

En la secuencia 2 se da una Temperatura y quiero que por debajo de una temperatura, un led parpadee, me encuentre en la secuencia que me encuentre.

1.- He probado a ponerlo en la secuencia 2, pero obviamente si pido otro parámetro perteneciente a otra secuencia, cuando se acaba el tiempo, deja de parpadear. Y si baja la temperatura estando en otra secuencia, no se enciende el led de nuevo.

2.- He probado a ponerlo en el void loop, pero me pasa lo mismo.

La única idea que se me ocurre es al inicio de cada secuencia, definir de nuevo el valor del termistor y hacer comprobación de temperatura y encendido de led si procede, pero me parece poco elegante repetir el mismo código en cada secuencia. Vamnos, no es por elegancia, es por no repetir cosas que seguro se pueden hacer de forma más limpia o corta

Me dais una pista?

supongo que esto es lo que quieres

define previamente esta variables antes de setup

unsigned long start = 0;
bool cambio = false;
const byte PinLed  = 13;           // lo cambias al pin que desees

void loop (){
secuencia 2() //empieza por defecto mostrando Tª y H%[/color]
 if (millis() - start > 1000UL) {
    cambio = !cambio;
   if (cambio)
     digitalWrite(PinLed, HIGH);
  else
    digitalWrite(PinLed, LOW);
   start = millis();

Bueno, a la primera no me ha salido, pero a ver si mañana tengo tiempo y le echo un rato con lo que me has puesto.

Una duda, si empiezo en el loop con secuencia2() no llegará nunca a la siguiente orden del loop, no? porque desde la secuencia 2 ira a otras secuencias, pero tal como est'a escrito el c'odigo nunca vuelve al loop.

+No se debería ejecutar primero ese millis en loop y luego continuar con secuencia 2?

tu pediste un extracto de código que accionara un led en una secuencia que no detuviera el flujo del programa. Ahora ubicalo tu, ajusta el tiempo, etc, etc, etc.

Si todo tu código de secuencias lo hubieras hecho de modo que siempre volvieran al loop sin perder tiempo, lo que te sugerí funcionaría. Como no me diste mas que un extracto de código, yo tuve que suponer cosas. Ahora esa secuencia que te di prende y apaga un led a intervalos de 1 seg, si quieres que sea cada 0.5 le pones 500UL en lugar de 1000UL. Si el resto se queda dando vueltas de secuencia en secuencia no puedo hacer mas porque tu no has puesto todo el código como dicen las normas del foro que hay que hacer, y hubiésemos evitado tu repregunta.

No te preocupes, no es una crítica. Ya sé que me corresponde a mi ajustarlo y dedicar tiempo a ello.

Lo que has dado me da para pensar y ver cómo lo aplico. Si tuviese problemas más adelante o no supiese ajustarlo volvería al tema.

El código en concreto no lo he pegado porque para mi pregunta creo que basta con la estructura de secuencias y la explicación. Si tengo problemas cuando me ponga con ello, pego el código entero. No tengo problema alguno en ello, no lo puse entero por comodidad vuestra, pensé que sería más cómodo un resumen.

Como siempre... Gracias

De nuevo y para que me entiendas. Tus secuencias pueden estar bien programadas y con ese criterio y creo haberte entendido bien, te sugerí ese extracto de código que no afecta en tiempo a ninguna secuencia. Me gustaría que describas mejor tus secuencias porque lo que pones en el setup ya mucho no me convence pero supongamos que este bien.

Deberías armar una máquina de estados. Justamente una secuencia que va cumpliendo tareas y devuelve el control a un pequeño código que distribuye que seguir haciendo. Si se cumple una tarea, se sigue con la siguiente y la siguiente a menos que un evento cualquiera obligue a atender otra tarea. Todo esto se hace sin gasto de tiempo (no mas que el que insuma ejecutar las instrucciones de cada tarea).

Supon que tienes 4 secuencias como en tu caso. Yo las voy a llamar asi

#define secuencia1 1 // Muestra Tª max y min
#define secuencia2 2 // Muestra Tª y H%
#define secuencia3 3 // Muestra  Tª2
#define secuencia4 4 // Muestra voltímetro
byte tarea = secuencia1; // lo fuerzo a comenzar con la secuencia que quiero.


void setup() {
}

void loop() {
  
  switch(tarea) {
        case secuencia1: // ejecuto la secuencia 1 

                                   tarea = secuencia2;   // la proxima vez iré por secuencia2
                                   break;
        case secuencia2: // ejecuto la secuencia 2
                                   tarea = secuencia3;   // la proxima vez iré por secuencia3
                                   break;
        case secuencia3:// ejecuto la secuencia 3
                                   tarea = secuencia4;   // la proxima vez iré por secuencia4
                                   break;
        case secuencia4: // ejecuto la secuencia 1 
                                   tarea = secuencia1;   // la proxima vez iré por secuencia1 
                                                                 // si esa fuera la idea de volver a reiniciar todo
                                   break;
        default:
  }
  if (millis() - start > 1000UL) {  // independientemente de las tareas puedes incluir esto
    cambio = !cambio;
    if (cambio)
       digitalWrite(PinLed, HIGH);
     else
       digitalWrite(PinLed, LOW);
     start = millis();    
  }             
}