Problemas con Millis()

Hola comunidad tengo un problema al implementar millis por delay, en el siguiente codigo tengo que a una cierta hora encienda un led gradualmente y a otra hora de apage, eso funciona perfecto pero al querer sacar el delay del analogWrite ay empiezan los problemas no logro hacerlo andar con millis. Les dejo el codigo como esta funcionando ahora, si me pueden echar una mano se los agradeceria…
Se que debe ser una pavada pero por mas que lo intente el millis no logro entenderlo.

Desde ya muchas gracias…

#include <Wire.h> 
#include "RTClib.h"
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 

RTC_DS1307 RTC;

#define hora_ON	   	        20
#define minuto_ON	 	00
#define segundo_ON	   	00

#define hora_OFF	   	8
#define minuto_OFF	 	00
#define segundo_OFF	        00 	

#define pin_blanco		6
        

byte segundo        =   0;
bool activado       =   false;
bool desactivado    =   false;
int  fadeValue      =   0;
// -------------



void iniciar(){
    DateTime now = RTC.now(); 
    int hora    =     now.hour();
    int minuto  =   now.minute();
    if(hora>= hora_ON ) {
        if(minuto >= minuto_ON ) ;
        digitalWrite(pin_blanco, HIGH);
        digitalWrite(pin_azul, HIGH);
    }
    else {
      digitalWrite(pin_azul, LOW);
      digitalWrite(pin_blanco,LOW);
    }
       
}


void setup () {
    lcd.begin(20, 4);
	Wire.begin(); 
	RTC.begin(); 
	RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));
	Serial.begin(9600); 
	pinMode(pin_blanco, OUTPUT);
	pinMode(pin_azul, OUTPUT);
    iniciar();
  

}

void loop(){
  

	DateTime now = RTC.now(); 
	if(segundo!= now.second()){
		segundo = now.second();
		lcd.setCursor(1, 0);
                lcd.print(now.day(), DEC); 
		lcd.print('/');
		lcd.print(now.month(), DEC); 
		lcd.print('/');
		lcd.print(now.year(), DEC); 
		lcd.print(' ');
		if (now.hour()<10) 
                lcd.print('0'); 
                lcd.print(now.hour(), DEC); 
                lcd.print(':'); 
                if (now.minute()<10) 
                lcd.print('0'); 
                lcd.print(now.minute(), DEC); 
                lcd.print(':'); 
                if (now.second()<10) 
                lcd.print('0'); 
                 lcd.print(now.second(), DEC);
		
	}    
	if (hora_ON == now.hour()  && minuto_ON == now.minute() && !activado ) {
        encendido();
        }
        
        if (hora_OFF == now.hour()  && minuto_OFF == now.minute() && !desactivado ) {
        apagado();
        }
}




void encendido(){

  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) { 
    analogWrite(pin_blanco, fadeValue);    
    delay(100);      
    if (fadeValue == 255){

activado = true;
desactivado = false;
}
  }
    } 


void apagado(){
  
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) { 
    analogWrite(pin_blanco, fadeValue);    
    delay(100);      
    if (fadeValue == 0){

desactivado = true;
activado = false;
}
  }
    }

Hola que tal.. si entiendo bien.. quieres quitar el delay(100) por un softdelay como pudieramos llamarlo.

Se requieren tres partes; la funcion millis, que vamos a usar para ver cuanto tiempo a pasado desde la ultima vez que revisamos, y dos variables unsigned long, una para almacenar el "delay" o retraso en el encendio y otra para "anotar" la hora.

Se requiere que lo hagas en un orden especifico;

unsigned long timmer = 0;           // esta variable "anota la hora"
unsigned long softdelay  = 100;     //este es el valor de tu delay

void setup()
{

timmer = millis (); // anotamos la hora actual.    //anotamos la hora aqui... 

}

void loop ()
{

//En esta funcion revisamos... si la hora actual, menos la hora pasada es mayor
//que nuestro valor de delay, entonces activamos lo que quieras hacer. 

if(millis() - timmer  > softdelay)  // Si las millis actuales menos el valor de 
                                    //timmer del inicio es mayor al delay significa que
                                    //han pasado mas de 100ms 
   
   timmer = millis();               //Anotamos la hora en que hicimos algo, asi puede 
                                    //ser recurrente, digamos cada 100ms, 200ms, o lo que sea.
  {

  }

//Ahora si quieres hacer algo digamos al encenido de algun switch o funcion; 

if( button1 == press)       //puedes agregar un "candado aqui"
  {                         // de manera que el delay solo se ejecute cuando algo pase
  
  if(millis() - timmer  > softdelay)  
     {                          
                                    
   
   timmer = millis();               
     }                               
  
}

Espero que el ejemplo te sirva de ayuda... en realidad no es tan complicado, pero estoy de acuerdo que al principio es bastante tedioso uno no sabe que va donde...

Puedes simplemente agregar el if y comprar contra tu delay... copiando las variables tal cual, debe funcionar.

Lo que si... tienes que agregar una guarda booleana, si quieres que se ejecute solo una vez, pero veo que ya tienes una...

Así que adelante.

-Alex.

Una pregunta. Si funciona perfecto, ¿por qué lo quieres cambiar?. Evitar el uso del delay, es para situaciones en las que nos puede hacer funcionar mal el código, por dejar el micro-controlador en un estado de espera, en el que no responde a otros procesos, pero si el código cumple con nuestras expectativas, no veo la necesidad de cambiarlo.

Saludos

Por este post y por otros iguales aqui esta Funcion Millis()