Sustituir Delay por Millis.

Buen dia compañeros, les comento , tengo un proyecto funcionando sin problemas a travez de un webserver montado en Arduino Mega y ehternet shield v.2 w5500.
El proyecto consiste en hacer fade a un led en 3 estados (HIGH-MID-LOW) y un control para activar unos relevadores por un tiempo determinado.
El problema es que cuando la luz esta apagada y la mando encender a travez de la webpage tarda aproximadamente 10 segundos en lo que ejecuta la accion, por lo que ya no puedo ejecutar otro comando como activar alguno de los relays hasta que se termine la ejecucion.
Es por eso que necesito reemplazar la funcion Delay por Millis para que sea multitask y no tenga que esperar el tiempo del Delay.
Agradezco infinitamente su ayuda ya que por mas que he repasado el asunto de los Millis, creo que aun no me queda muy claro y tengo muchas dudas.
Adjunto el codigo ya que por espacio solo puedo poner algunas lineas.
Gracias.

                                                             // DIMMER CONTROL //

          
           if (readString1 == "DIM1=T" && state4 == "LOW" )
           {
            for (brillo = EEPROM.read(2); brillo <= EEPROM.read(0); brillo ++) {
              analogWrite(7, brillo);
              delay(d);
            }
            state4 = "HIGH";
            lcd.clear();
            lcd.setCursor(0,0);
            lcd.print("LIGHTS HIHG");
            lcd.setCursor(0,1);
            lcd.print("MASKING");
            lcd.setCursor(9,1);
            lcd.print(state5);   
          }
          else if (readString1 == "DIM1=T" && state4 == "MEDIUM" )
          {
            for (brillo = EEPROM.read(1); brillo <= EEPROM.read(0); brillo ++) { 
              analogWrite(7, brillo);
              delay(d);
            }
            state4 = "HIGH";
            lcd.clear();
            lcd.setCursor(0,0);
            lcd.print("LIGHTS HIHG");
            lcd.setCursor(0,1);
            lcd.print("MASKING");
            lcd.setCursor(9,1);
            lcd.print(state5);         
          }
          if (readString1 == "DIM2=T" && state4 == "HIGH")
          {
            for (brillo = EEPROM.read(0); brillo >= EEPROM.read(1); brillo --) { 
              analogWrite(7, brillo);
              delay(d);
            }
            state4 = "MEDIUM";
            lcd.clear();
            lcd.setCursor(0,0);
            lcd.print("LIGHTS MEDIUM");
            lcd.setCursor(0,1);
            lcd.print("MASKING");
            lcd.setCursor(9,1);
            lcd.print(state5);
          }
         else if (readString1 == "DIM2=T" && state4 == "LOW")
          {
            for (brillo = EEPROM.read(2); brillo <= EEPROM.read(1); brillo ++) { 
              analogWrite(7, brillo);
              delay(d);
            }
            state4 = "MEDIUM";
            lcd.clear();
            lcd.setCursor(0,0);
            lcd.print("LIGHTS MEDIUM");
            lcd.setCursor(0,1);
            lcd.print("MASKING");
            lcd.setCursor(9,1);
            lcd.print(state5);
          }                   
          if (readString1 == "DIM3=T" && state4 == "MEDIUM")
          {
            for (brillo = EEPROM.read(1); brillo >= EEPROM.read(2); brillo --) { 
              analogWrite(7, brillo);
              delay(d);
            }
            state4 = "LOW";
            lcd.clear();
            lcd.setCursor(0,0);
            lcd.print("LIGHTS LOW");
            lcd.setCursor(0,1);
            lcd.print("MASKING");
            lcd.setCursor(9,1);
            lcd.print(state5); 
          }
          else if (readString1 == "DIM3=T" && state4 == "HIGH")
          {
            for (brillo = EEPROM.read(0); brillo >= EEPROM.read(2); brillo --) { 
              analogWrite(7, brillo);
              delay(20);
            }
              state4 = "LOW";
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print("LIGHTS LOW");
              lcd.setCursor(0,1);
              lcd.print("MASKING");
              lcd.setCursor(9,1);
              lcd.print(state5);
          }
                                                          //MASKING CONTROL //



           if (readString1 == "REL1=T" ) 
           {
             digitalWrite(22, HIGH); 
             delay (m);
             digitalWrite(22, LOW); 
             state5 = "FLAT";
             lcd.clear();
             lcd.setCursor(0,0);
             lcd.print("LIGHTS");
             lcd.setCursor(7,0);
             lcd.print(state4);
             lcd.setCursor(0,1);
             lcd.print("MASKING");
             lcd.setCursor(9,1);
             lcd.print(state5);                       
           }
          if (readString1 == "REL2=T") 
          {
             digitalWrite(23, HIGH); 
             delay (m);
             digitalWrite(23, LOW); 
             state5 = "SCOPE";
             lcd.clear();
             lcd.setCursor(0,0);
             lcd.print("LIGHTS");
             lcd.setCursor(7,0);
             lcd.print(state4);
             lcd.setCursor(0,1);
             lcd.print("MASKING");
             lcd.setCursor(9,1);
             lcd.print(state5); 
             }

Dimmer_1_canal__ethernet_2.0.ino (25.2 KB)

Debes crear una máquina de estados. Ve a Documentación y en el primer hilo existe un índice de tutoriales.
Busca máquina de estados.

Leela y luego debatimos como implementarlo.
Al final hay un comentario mio y lleva a un hilo donde apliqué una Maquina de Estados a un problema similar al tuyo.

Hola,
Coincido con la acertada respuesta del compañero, aunque creo que te puedo ayudar para que veas la idea.
Para cambiar esos Delay, yo definiría cada retardo, y pondría un flag en cada estado posible.Luego comprobaría si hay algún flag activado y si ha pasado el tiempo necesario. El código sería algo así.

#define RETARDO1 300  //expresado en milisegundos
#define RETARDO2 800  //expresado en milisegundos

bool accion1;
bool accion2;
unsigned long tiempo1;
unsigned long tiempo2;

void AlgoActivaAccion1()
  {
   //activamos accion1, por ejemplo
  accion1 = true;
  tiempo1 = millis();
  }

void setup()
  {
  accion1 = false;
  accion2 = false;
  }

void loop
  {
  if(accion1)
    {
     if(millis()-tiempo1>RETARDO1
       {
        //desactivamos la accion
        accion1 = false;
       }
    }
        
 if(accion2)
    {
     if(millis()-tiempo2>RETARDO2
       {
        //desactivamos la accion
        accion2 = false;
       }
    }

Agradezco infinitamente su ayuda.
Ya que he estado dandole vueltas al asunto para implementar la maquina de estados en mi caso me he topado ahora con el problema que para mi sketch estoy usando "strings" que al parecer no pueden ser usadas en maquina de estados.
Ahora entonces si me seria muy util su ayuda para ver la manera de implementarla en el sketch, por lo pronto me estoy peleando para poder sustituir los delay por millis.
Saludos.

El problema que veo es que las cosas estan muy mezcladas.
haces algo luego actualizas pantalla, luego mezclas otra tarea y todo eso en acciones que son rápidas y que luego se enlentecen.

mira esta parte

if (readString1 == "DIM1=T" && state4 == "LOW" )   {
            for (brillo = EEPROM.read(2); brillo <= EEPROM.read(0); brillo ++) {
              analogWrite(7, brillo);
              delay(d);
            }
            state4 = "HIGH";
            lcd.clear();
            lcd.setCursor(0,0);
            lcd.print("LIGHTS HIHG");
            lcd.setCursor(0,1);
            lcd.print("MASKING");
            lcd.setCursor(9,1);
            lcd.print(state5);   
          }

lo primero es una acción que lees desde una EEPROM eso es lento, y luego actuas con analogWrite y aca viene el delay pero para terminar, actualizas o refrezcan LCD

Debes eliminar EEPROM, delay y el LCD
Y eso en todo el programa por lo que exige un cambio conceptual del mismo.

Imagina esto:
Debes crear tareas. Una tarea será refrezco del LCD
Otra tarea será atender las peticiones HTTP otra será ajustar el brillo
todo se hace de modo que no haya interferencias entre ellas.
Las cosas son rapidas pero no se ejecutan todo el tiempo, lo hacen en lapsos preficados o en respueta a acciones.

Para tus ordenes basadas en strings podes usar algo asi

if (readString1 == "DIM1=T") estado = 0;
		if (readString1 == "DIM2=T") estado = 1;
		if (readString1 == "DIM3=T") estado = 2;
		if (readString1 == "REL1=T") estado = 3;
		if (readString1 == "REL2=T") estado = 4;

De nuevo muchas gracias Surbyte, creo que con ese ejemplo ya entendi muchas cosas y me has abierto el panorama , y tienes mucha razon creo que tendré que rehacer de nuevo el sketch , por lo pronto les agradezco compañeros su infinita ayuda.

Inisisto con que veas y entiendas una máquina de estados en Documentación.
Verás que no será facil el cambio pero luego se verá el resultado.