Luminosità non Funzionante

Ho provato ad aggiungere a un semplice sketch il fade manuale ma non funziona mi potrete aiutare, questo è il codice, grazie anticipatamente.

// includiamo prima di tutto la libreria IRremote
#include "IRremote.h"
// definiamo i valori che vengono passati dai pulsanti del nostro telecomando
#define power 0X80C // ACCENDI
#define prog_su 0X820
#define prog_giu 0X821
 
// Il pin del nostro ricevitore IR
int RECV_PIN = 11;
int led_green = 10;
int led_red = 8; 
int pwr_state= 0;
int led_blue = 9;      // the pin that the LED is attached to
int brightness = 0;    // how bright the LED is
int fadeAmount = 5;    // how many points to fade the LED by
//definiamo l'oggetto riceviore e i risultati
IRrecv irrecv(RECV_PIN);
decode_results results;
 
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Iniziamo la ricezione dati
  pinMode(led_green, OUTPUT);  
  pinMode(led_red, OUTPUT); 
  pinMode(led_blue, OUTPUT);
 digitalWrite(led_red, HIGH); 
}
 
void loop() {
// Se riceviamo input, allora avremo dei valori esadecimali (che abbiamo definito all'inizio del codice avendo la lettura)
  if (irrecv.decode(&results)) {
      if(results.value == power && pwr_state == 0){
      Serial.print("Dispositivo ACCESO \n");
      digitalWrite(led_green, HIGH);
      digitalWrite(led_red, LOW);
      pwr_state = 1;
    }
   else if (results.value == prog_su && pwr_state == 1 && brightness < 256){
     Serial.print("Luminosita' LED = ");
     Serial.println(brightness);
     digitalWrite(led_blue, brightness);
    brightness = brightness + fadeAmount;
}     
else if (results.value == prog_giu && pwr_state == 1 && brightness > -1){
     Serial.print("Luminosita' LED = ");
     Serial.println(brightness);
     digitalWrite(led_blue, brightness);
    brightness = brightness - fadeAmount;
}     
    else if(results.value == power && pwr_state == 1){
    Serial.print("Dispositivo SPENTO \n");
      digitalWrite(led_green, LOW);
      digitalWrite(led_red, HIGH);      
      pwr_state = 0;
    }
delay(250);    
     irrecv.resume(); // Riceviamo il prossimo valore
  }  
}

l'errore è quì:

digitalWrite(led_blue, brightness);

la digitalWrire (come dice il nome "digital") può scrivere solo uno e zero. Il trucco per il fade è accendere e spegnere le uscite abbastanaza in fretta da simulare un valore intermedio, semplicemente ingannando l'occhio umano.

Questo sistema è detto PWM, e si usa attraverso un'analogWrite, oppure puoi persino simulartela da solo usando il loop e cambiando lo stato della digitalWrite ogni tot loop o ogni tot tempo (dove tot è la luminosità che vuoi ottenere)

Però bisogna stare attenti alla compatibilità della libreria con l'analogWrite. In pratica bisogna vedere che timer usa la libreria e quali usi tu per il PWM.
Che libreria IRremote usi? questa --> IRremote Library, Send & Receive Infrared Remote Control

e allora come posso fare, cosa includo nel codice???un loop???
in quale altro modo posso risolverlo???

credo sia la stessa libreria, ma la ho scaricata da qua:

gpsd:
credo sia la stessa libreria, ma la ho scaricata da qua:
GitHub - Arduino-IRremote/Arduino-IRremote: Infrared remote library for Arduino: send and receive infrared signals with multiple protocols

Quella libreria usa di default il timer2 collegato ai pin 3 e 11.
Ti rimangono quindi i pin PWM del timer 0 (pin 5 e 6) e del timer 1 (pin 9 e 10).

P.S. il timer2 è utilizzato dalla libreria per la trasmissione, se non la usi per trasmettere, forse, potresti utilizzare il pin 3 per il controllo RGB.
Aspetta che risponda qualcuno più esperto. :wink:

probabilmente la libreria setta i timer l momento dell'inizializzazione, non al momento di una write.
Invece l'arduino tende a ripetere tutte le inizializzazioni ad ogni write.
Il risultato è che librerie impazziscono, ma i codici arduino tendono a funzionare bene.
Insomma l'unica è vedere cosa modifica la libreria e cosa vien resettato ogni analogWrite, e capire chi "vince" o se ti rimane un'accozzaglia di settaggi che incasinano tutto

grazie mille tutto risolto, è l' analogwrite e non il digital!!!