problema con accensione led pwm

ciao a tutti, non riesco a far accendere gradualmente un led... in poche parole il led deve arrivare all'intensità de me impostata nel tempo che desidero io..non so propio come fare, ho il cervello fuso a forza di pensarci..ho bisogno di idee fresche...

#include <ShiftLCD.h>  //libreria shift register
#include <math.h>  // libreria calcoli matematici
#include <swRTC.h>  //libreria rtc

//pin 13/11 non utilizzabili senza shield RTC
//pin 3 non utilizzabile come uscita analogicam
#define sens A0  //sensore temperatura NTC 5Kohm
#define pulmenu A1  //scorrimento menù
#define pulset A2  //pulsante di conferma 
#define pulpiu A3  //pulsante che incrementa il valore impostato
#define pulmeno A4  //pulsante che decrementa il valore impostato
#define ventole 3  //ventole di raffreddamento
#define led20 6  //led bianchi 20.000K° 
#define led10 5  //led bianchi 10.000K°
#define ledrb 9  //led royal blu
#define leduv 10  //led uv
#define ledm 4  //led moom
ShiftLCD lcd(0,2,1);  //lcd
swRTC rtc;  //rtc

int spulmenu=0; //stato pulsante di scorrimento menù
int spulset=0;  //stato pulsante di conferma
int contamenu=0;  //contatore pagine menù
int spulpiu=0;  //stato pulsante che incrementa il valore impostato
int spulmeno=0;  //stato pulsante che decrementa il valore impostato
int hh=12;  //valore di preset ore
int mm=0;  //valore di preset minuti
int ss=0; //valore di preset secondi
int svtemp=15;  //set della temperatura di comando ventole
int onhh20=13;  //valore di on ore led bianchi 20.000K°
int onmm20=0;  //valore di on minuti led bianchi 20.000K°
int onhh10=12;  //valore di on ore led bianchi 10.000K°
int onmm10=1;  //valore di on minuti led bianchi 10.000K°
int onhhrb=13;  //valore di on ore led rb
int onmmrb=2;  //valore di on minuti led rb
int onhhuv=13;  //valore di on ore led uv
int onmmuv=3;  //valore di on minuti led uv
int onhhm=13;  //valore di on ore led moom
int onmmm=3;  //valore di on minuti led moom
int offhh20=13;  //valore di off ore led bianchi 20.000K°
int offmm20=4;  //valore di off minuti led bianchi 20.000K°
int offhh10=13;  //valore di off ore led bianchi 10.000K°
int offmm10=5;  //valore di off minuti led bianchi 10.000K°
int offhhrb=13;  //valore di off ore led rb
int offmmrb=6;  //valore di off minuti led rb
int offhhuv=13;  //valore di off ore led uv
int offmmuv=7;  //valore di off minuti led uv
int offhhm=13;  //valore di off ore led moom
int offmmm=8;  //valore di off minuti led moom
int slum20=(slum20/2.54);  //set luminostità led bianchi 20.000K°
int slum10=(slum10/2.54);  //set luminostità led bianchi 10.000K°
int slumrb=(slumrb/2.54);  //set luminostità led rb
int slumuv=(slumuv/2.54);  //set luminostità led uv
int stimer10=1;  //set tempo di accensione led bianchi 10.000K°
int stimer20=2;  //set tempo di accensione led bianchi 20.000K°
int stimerrb=3;  //set tempo di accensione led royal blu
int stimeruv=4;  //set tempo di accensione led uv
int stimerm=5;  //set tempo di accensione led moom
int lum20=0;  // luminostità led bianchi 20.000K°
int lum10=0;  // luminostità led bianchi 10.000K°
int lumrb=0;  // luminostità led rb
int lumuv=0;  // luminostità led uv
int lumm=0;  // luminostità led moom

float val=0;           //Variabile di comodo per il calcolo della temperatura in base al proprio NTC
float NTC=5000;        //Valore dell'NTC utilizzato. 5000=5k
float vsens(int RawADC){
val=10000/NTC;
val=4.5*val;
val=NTC*val;
long resistenza; 
float Temp;  //per il calcolo della tempratura
resistenza=((1024 * val / RawADC) - val); 
Temp = log(resistenza); //Salva Log(resistance)
Temp = 1 / (0.001129148 + (0.000234125 * Temp) + (0.0000000876741 * Temp * Temp * Temp));
Temp = Temp - 273.15;  // Converte gradi Kelvin in Celsius   
return Temp;           //Ritorna la temperatura calcolata
}

byte gradi[8] = {B00111,B00101,B00111};  //simbolo gradi

void setup(){
lcd.begin(16,2); 
rtc.setTime(hh,mm,ss);
rtc.stopRTC();
rtc.startRTC();
pinMode(ventole,OUTPUT);
pinMode(led20,OUTPUT);
pinMode(led10,OUTPUT);
pinMode(ledrb,OUTPUT);
pinMode(leduv,OUTPUT);
pinMode(ledm,OUTPUT);
} 

void loop(){
  delay(150);  //ritardo risposta pulsanti
float temp;temp=vsens(analogRead(sens));temp = (temp * 9.0)/ 5.0 + 32.0;  //calcolo della temperatura
if(temp>=svtemp){digitalWrite(ventole,HIGH);}else{digitalWrite(ventole,LOW);}  //controllo ventole con la temperatura
rtc.getHours();rtc.getMinutes();rtc.getSeconds();  //orologio
 
spulmenu=analogRead(pulmenu);
spulset=analogRead(pulset);
spulpiu=analogRead(pulpiu);
spulmeno=analogRead(pulmeno);

  //scorrimento menù
if((spulmenu>10)&&(contamenu==0)){contamenu=1;lcd.clear();
}else{if((spulmenu>10)&&(contamenu==1)){contamenu=7;lcd.clear();
}else{if((spulmenu>10)&&(contamenu==7)){contamenu=0;lcd.clear();
}}}
  //scorrimento sottomenù led 10000°K
if((spulset>10)&&(contamenu==1)){contamenu=11;lcd.clear();
}else{if((spulmenu>10)&&(contamenu==11)){contamenu=12;lcd.clear();
}else{if((spulmenu>10)&&(contamenu==12)){contamenu=13;lcd.clear();
}else{if((spulmenu>10)&&(contamenu==13)){contamenu=14;lcd.clear();
}else{if((spulmenu>10)&&(contamenu==14)){contamenu=15;lcd.clear();
}else{if((spulmenu>10)&&(contamenu==15)){contamenu=11;lcd.clear();
}}}}}}
//scorrimento sottomenù orario
if((spulset>10)&&(contamenu==7)){contamenu=71;lcd.clear();
}else{if((spulmenu>10)&&(contamenu==71)){contamenu=72;lcd.clear();
}else{if((spulmenu>10)&&(contamenu==72)){contamenu=71;lcd.clear();
}}}
  //uscita menù
if((spulset>10)&&(contamenu==15)){contamenu=1;lcd.clear();
}else{if((spulset>10)&&(contamenu==72)){contamenu=7;lcd.clear();
}}
if((onhh10==rtc.getHours())&&(onmm10==rtc.getMinutes())){lum10++;}if(lum10>slum10){lum10=slum10;}  //orario di on led bianchi 10.000K°
if((offhh10==rtc.getHours())&&(offmm10==rtc.getMinutes())){lum10--;}if(lum10<1){lum10=0;}  //orario di off led bianchi 10.000K°
analogWrite(led10,lum10);

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
switch(contamenu){
  
  case 0:  //pagina iniziale
lcd.setCursor(0, 0);
if (rtc.getHours()<10){lcd.print("0");}lcd.print(rtc.getHours(), DEC);
lcd.print(":");
if (rtc.getMinutes()<10){lcd.print("0");}lcd.print(rtc.getMinutes(), DEC);
lcd.print(":");
if (rtc.getSeconds()<10){lcd.print("0");}lcd.print(rtc.getSeconds(), DEC);
lcd.print(" ");
lcd.setCursor(12,0);lcd.print(temp,0.5);  
lcd.setCursor(14,0);lcd.write(0);lcd.createChar(0,gradi);lcd.setCursor(15,0);lcd.print("C");
lcd.setCursor(0,1);
lcd.print(lum10);
break;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  case 1:  //pagina  led 10000K
  lcd.setCursor(1,0);
lcd.print("SET LED 10000K");
break;

 case 11:  //pagina ora di accensone led 10000K
   lcd.setCursor(5,0);
lcd.print("SET ON");
lcd.setCursor(4,1);
if (onhh10<10){lcd.print("0");}lcd.print(onhh10);lcd.print(":");
if (onmm10<10){lcd.print("0");}lcd.print(onmm10);lcd.print(":");
lcd.print("00");
if(spulpiu>10){onmm10++;if(onmm10>59){onmm10=0;onhh10++;}if(onhh10>23){onhh10=0;}}  //incrementa ore/minuti
if(spulmeno>10){onmm10--;if(onmm10<0){onmm10=59;onhh10--;}if(onhh10<0){onhh10=23;}}  //decrementa ore/minuti
break;

 case 12:  //pagina ora di spegnimento led 10000K
   lcd.setCursor(5,0);
lcd.print("SET OFF");
lcd.setCursor(4,1);
if (offhh10<10){lcd.print("0");}lcd.print(offhh10);lcd.print(":");
if (offmm10<10){lcd.print("0");}lcd.print(offmm10);lcd.print(":");
lcd.print("00");
if(spulpiu>10){offmm10++;if(offmm10>59){offmm10=0;offhh10++;}if(offhh10>23){offhh10=0;}}  //incrementa ore/minuti
if(spulmeno>10){offmm10--;if(offmm10<0){offmm10=59;offhh10--;}if(offhh10<0){offhh10=23;}}  //decrementa ore/minuti
break;

 case 13:  //pagina intensità led 10000K
   lcd.setCursor(2,0);
lcd.print("SET INTENSITY");
lcd.setCursor(7,1);
if(spulpiu>10){slum10++;if(slum10>99){slum10=100;}}  //aumenta intensità led 10000K
if(spulmeno>10){slum10--;if(slum10<1){slum10=0;}}  //diminuisci intensità led 10000K
if (slum10<10){lcd.print("0");}lcd.print(slum10);lcd.print("%  ");
break;

 case 14:  //pagina tempo accensione/spegnimento led 10000K
   lcd.setCursor(2,0);
lcd.print("SET TIMER ON");
lcd.setCursor(5,1);
if(spulpiu>10){stimer10++;if(stimer10>1440){stimer10=0;}}  //incrementa minuti
if(spulmeno>10){stimer10--;if(stimer10<0){stimer10=1440;}}  //decrementa minuti
if (stimer10<10){lcd.print("0");}lcd.print(stimer10);lcd.print("min.    ");

break;

 case 15:  //uscita menù
   lcd.setCursor(6,0);
lcd.print("EXIT");
break;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
}
}

questo è la parte di sketch che interessa il mio problema....

??? ma io vedo solo una digitalWrite() su ventole.
Ad esempio per led20 non c’e’ nessun codice che spedisca qualcosa sui pin, solo la pinmode a output per led20.

si si..guarda subito dopo il commento //uscita menù; li viene dichiarata l'uscita analogica per il led10

Sei sicuro dei valori nella variabile? Puoi fare un pò di debug stampando il valore di lum10 su Serial monitor?

Anche perchè tra le variabili globali scrivi:

int slum10=(slum10/2.54);

Ma slum10 in fase di partenza è zero. 0/2.54=0

Poi:

...{lum10++;}if(lum10>slum10){lum10=slum10;}

incrementi lum10 di 1 ma se maggiore di slum10 (che secondo me è 0), allora lum10 diventa slum che è zero

Slum10 lo divido con 2.54 solo per una questione di visualizzazione sul display, così che quando il valore dell'uscita pwm è 254 sul display visualizzo 100.. In poche parole io setto una percentuale d'intensita poi setto un tempo In minuti. Quindi io voglio che il led raggiunga l'intensità nel tempo che gli dico..

Ma non puoi farlo li. Avresti dovuto scrivere:

int slum10=(255/2.54);

Allora tu voi che il tuo range luminosità sia 0-100 e non 0-255 giusto? Allora slum10 devi inizializzarlo a 100 e poi (come mi sembra hai fatto) consideri solo intervalli 0-100.

Poi solo quando usi la analogWrite() devi riportare il valore tra 0-255 e puoi usare la funzione map()

int pwmval=map(lum10,0,100,0,255);   // numero tra 0-100 >= 0-255
analogWrite(led10, pwmval );

A ok.. E per il discorso dell'accensione nel tempo che imposto io?