Lampada RGB con Apple Remote

Buongiorno a tutti :slight_smile:
da buon utente neofita di Arduino (da circa un mese), mi sono messo in testa di farmi la classica lampada rgb telecomandata con Apple Remote.
Dopo varie letture e configurazioni suggerite ho optato per comandare le strip rgb(anodo comune) con 1 ULN2003 (allego schema Fritzing, per schemi con Eagle devo ancora capire :D).

Considerato che non mi piace avere la pappa pronta ho scritto un pò di codice che compila, ma non funziona come dovrebbe.
Il codice che allego non è completo delle funzionalità che vorrei per la lampada, ma per gestire meglio il tutto faccio delle prove in corso d’opera per verificarne il funzionamento e correggere eventuali errori.
Ecco lo sketch

/*
                  PeenieLamp v0.1
 Lampada RGB con telecomando Apple
 
 Codici Apple Remote
+ 	        	2011287595
- 	          	2011279403
<< 		        2011238443
play pause	2011242539
>>	                2011291691
menu		2011250731
tenuti premuti	4294967295
 
 
 ¬į Play/Pause accende e spegne
 ¬į "+" e "-" regolano luminosit√†
 ¬į "<<" e ">>" Cambiano modalit√†
 ¬į "menu" luce bianca
 
 
 Modalità:
 0 - luce bianca
 1 - Dissolvenza
 2 - Arcobaleno
 3 - 
 4 - 
 5 - 
 
 ultima modifica 02-05-2012
 */


#include <IRremote.h>

int r1=3;         //pin dei colori
int g1=5;
int b1=6;
int r2=9;
int g2=10;
int b2=11;
int RECV_PIN=12;   // pin del ricevitore

IRrecv irrecv(RECV_PIN);
decode_results results;

int PP = 0 ;      //conteggio di quanto volte è stato premuto "Play/Pausa"
int lumi = 100;   //luminosità iniziale
int modo = 0;     // inizio da modo 0
int passo=3;      //aumento per cambio colori
int vel=10;       //velocità cambio colori

///SETUP///

void setup()
{

  irrecv.enableIRIn();// attiva il ricevitore

  pinMode (r1,OUTPUT);
  pinMode (g1,OUTPUT);
  pinMode (b1,OUTPUT);
  pinMode (r2,OUTPUT);
  pinMode (g2,OUTPUT);
  pinMode (b2,OUTPUT);

  analogWrite (r1, lumi);
  analogWrite (g1, lumi);
  analogWrite (b1, lumi);
  analogWrite (r2, lumi);
  analogWrite (g2, lumi);
  analogWrite (b2, lumi);
}

///MODALITA'///

void modo0(){
  analogWrite (r1, 255);
  analogWrite (g1, 255);
  analogWrite (b1, 255);
  analogWrite (r2, 255);
  analogWrite (g2, 255);
  analogWrite (b2, 255);
}


void modo1()  {
  for (int fadevalue=0; fadevalue<= lumi; fadevalue +=5){       
    analogWrite (r1, fadevalue);
    analogWrite (g1, fadevalue);
    analogWrite (b1, fadevalue);
    analogWrite (r2, fadevalue);
    analogWrite (g2, fadevalue);
    analogWrite (b2, fadevalue);
    delay(50);
  }
  for ( int fadevalue=lumi;fadevalue>=0; fadevalue -=5){
    analogWrite (r1, fadevalue);
    analogWrite (g1, fadevalue);
    analogWrite (b1, fadevalue);
    analogWrite (r2, fadevalue);
    analogWrite (g2, fadevalue);
    analogWrite (b2, fadevalue);
    delay(50);
  }
}


void modo2 () {
  for (int L=0;L<256;L+=passo) {
    analogWrite(r1,255-L);
    analogWrite(g1,L);
    delay(100);
  }

  for (int L=0;L<256;L+=passo) {
    analogWrite(g1,255-L);
    analogWrite(b1,L);
    delay(100);
  }

  for (int L=0;L<256;L+=passo) {
    analogWrite(b1,255-L);
    analogWrite(r1,L);
    delay(100);
  } 
}


///MAIN LOOP///

void loop()  {

  if (irrecv.decode(&results)) {

    //play/pausa premuto
    if(results.value == 2011242539) {
      if(PP==LOW){
        PP=HIGH;
      }
      else  {
        PP=LOW;
      }
    }

    //tasto + premuto
    if (results.value ==2011287595 && lumi<240){
      lumi=lumi +20;
    }

    //tasto - premuto
    if (results.value == 2011279403 && lumi>0){
      lumi=lumi -20;
    }

    // tasto << premuto
    if (results.value==2011238443){
      if(modo>0) {
        modo =modo-1;
      }
      else{
        modo = 2;
      }
    }

    // tasto>>premuto
    if (results.value==  2011238443){
      if(modo <2){
        modo = modo +1;
      }
      else{
        modo = 0;
      }
    }
    irrecv.resume();
  }
  switch (modo) {
  case 0:
    if (PP==HIGH){
      analogWrite (r1, lumi);
      analogWrite (g1, lumi);
      analogWrite (b1, lumi);
      analogWrite (r2, lumi);
      analogWrite (g2, lumi);
      analogWrite (b2, lumi);
    }
    else {
      analogWrite (r1, 0);
      analogWrite (g1, 0);
      analogWrite (b1, 0);
      analogWrite (r2, 0);
      analogWrite (g2, 0);
      analogWrite (b2, 0);
    }
    break;
  case 1:
    if(PP==HIGH){
      modo1();
    }
    break;
  case 2 :
    if(PP==HIGH){
      modo2();
    }
    break;
  }
}

Il problema è che dopo aver premuto i tasti per la luminosità si impalla tutto il sistema, inoltre non riesco a gestire le varie modalità di accensione della lampada.
Sono sicuro di aver commesso un sacco di errori ed infatti vi chiedo aiuto e suggerimenti per l’avanzamento del mio progetto.
Avrei anche bisogno di qualche idea per giochi di luci da implementare nella lampada :D.
Insomma mi farebbe piacere completarla con il vostro aiuto e la vostra esperienza.

Andrea

Cosa intendi con "si impalla" ?

Quando sei in modalità 1 o 2 Arduino esegue delle funzioni con dei cicli for e parecchi delay. In tutto quel tempo di certo l'Arduino non può anche leggere i comandi dal telecomando. Prova a mettere nel modo1 e modo2 solo accensione di 2 colori a scelta senza quei for/delay per vedere se è quello il problema.

Alcuni consigli per il codice. 1. farei una funzione anche per il modo0 (hai una funzione modo0 non usata) per rimpicciolire lo switch. 2. per i pin è meglio dichiarare

const byte r1=3;
  1. crea delle costanti per i codici Apple ed usa quelle nel codice, esempio
  #define K_PLUS 2011287595

oppure meglio ancora

  const unsigned long K_PLUS=2011287595;

Intanto per grazie per i consigli :slight_smile: che ho subito messo in pratica assegnando le costanti per i codici del ricevitore e per i pin dei colori.
Per quel che riguarda il modo0 credo di avere sistemato rimpicciolendo lo switch.
Per " si impalla" intendo che non riceve pi√Ļ nessun comando dal ricevitore e si blocca a luce bianca fissa fino al reset manuale del micro, dopo le modifiche al codice questo non succede pi√Ļ.
Ho anche provato a mettere solo due colori nei modo1 e modo2 togliendo i ‚Äėfor‚Äô e i ‚Äėdelay‚Äô come suggerito ed in effetti i colori funzionano.
Segue sketch modificato

/*
                  PeenieLamp v0.2
 Lampada RGB con telecomando Apple
 
 Codici Apple Remote
 + 		2011287595
- 		2011279403
frw 		2011238443
play pause	2011242539
ffw		2011291691
menu		2011250731
tenuti premuti	4294967295
 
 
 ¬į Play/Pause accende e spegne
 ¬į "+" e "-" regolano luminosit√†
 ¬į "<<" e ">>" Cambiano modalit√†
 ¬į "menu" luce bianca
 
 
 Modalità:
 modo0 - Bianco
 modo1 - Viola
 modo2 - Verde
 modo3 - Rosso
 modo4 - 
 modo5 - 
 
 ultima modifica 02-05-2012
 */


#include <IRremote.h>

const byte r1=3;         //pin dei colori
const byte g1=5;
const byte b1=6;
const byte r2=9;
const byte g2=10;
const byte b2=11;
int RECV_PIN=12;   // pin del ricevitore

            ///Costanti per codici ricevitore

const unsigned long Kpiu  = 2011287595;
const unsigned long Kmeno = 2011279403;
const unsigned long Krew  = 2011238443;
const unsigned long Kplay = 2011242539;
const unsigned long Kffw  = 2011291691;
const unsigned long Kmenu = 2011250731;

IRrecv irrecv(RECV_PIN);
decode_results results;

int PP = 0 ;      //conteggio di quanto volte è stato premuto "Play/Pausa"
int lumi = 100;   //luminosità iniziale
int modo = 0;     // inizio da modo 0
int passo=3;      //aumento per cambio colori
int vel=10;       //velocità cambio colori

///SETUP///

void setup()
{

  irrecv.enableIRIn();// attiva il ricevitore

  pinMode (r1,OUTPUT);
  pinMode (g1,OUTPUT);
  pinMode (b1,OUTPUT);
  pinMode (r2,OUTPUT);
  pinMode (g2,OUTPUT);
  pinMode (b2,OUTPUT);

  analogWrite (r1, LOW);
  analogWrite (g1, LOW);
  analogWrite (b1, LOW);
  analogWrite (r2, LOW);
  analogWrite (g2, LOW);
  analogWrite (b2, LOW);
}

///MODALITA'///

void modo0(){
  analogWrite (r1, 255);
  analogWrite (g1, 255);
  analogWrite (b1, 255);
  analogWrite (r2, 255);
  analogWrite (g2, 255);
  analogWrite (b2, 255);
}


void modo1()  {
         
    analogWrite (r1, 255);
    analogWrite (g1, 0);
    analogWrite (b1, 255);
    analogWrite (r2, 255);
    analogWrite (g2, 0);
    analogWrite (b2, 255);
   
  }



void modo2 () {
  
    analogWrite(r1,0);
    analogWrite(g1,255);
    analogWrite (b1,0);
    analogWrite(r2,0);
    analogWrite(g2,255);
    analogWrite (b2,0);
    
}
void modo3 (){
  analogWrite(r1,255);
    analogWrite(g1,0);
    analogWrite (b1,0);
    analogWrite(r2,255);
    analogWrite(g2,0);
    analogWrite (b2,0);
}

///MAIN LOOP///

void loop()  {

  if (irrecv.decode(&results)) {

    //play/pausa premuto
    if(results.value == Kplay) {
      if(PP==LOW){
        PP=HIGH;
      }
      else  {
        PP=LOW;
      }
    }

    //tasto + premuto
    if (results.value == Kpiu && lumi<240){
      lumi=lumi +20;
    }

    //tasto - premuto
    if (results.value == Kmeno && lumi>0){
      lumi=lumi -20;
    }

    // tasto << premuto
    if (results.value == Krew){
      if(modo>0) {
        modo = modo-1;
      }
      else{
        modo = 3;
      }
    }

    // tasto>>premuto
    if (results.value==  Kffw){
      if(modo <3){
        modo = modo +1;
      }
      else{
        modo = 0;
      }
    }
    irrecv.resume();
  }
  switch (modo) {
  case 0:
    if (PP==HIGH){
      modo0();
    }
     
    break;
  case 1:
    if(PP==HIGH){
      modo1();
    }
    break;
  case 2 :
    if(PP==HIGH){
      modo2();
    }
    break;
    case 3 :
    if(PP==HIGH){
      modo3();
    }
  }
}

Ci sono delle cose che non capisco :slight_smile: :

con i tasti + e - non aumenta ne diminuisce la luminosita mentre prima lo faceva ma si ‚Äúimpallava‚ÄĚ :slight_smile: dopo un paio di pressioni del tasto

con il tasto play che dovrebbe accendere/spegnere le luci , riesco solo ad accendere ma non a spegnere, mentre con lo sketch di prima riuscivo (era l’unica cosa che funzionava).

Beh, per il +/- √® normale, perch√® ora lumi non lo usi pi√Ļ.

Per quanto riguarda lo spegnere, non hai pi√Ļ nessun modox che mette tutto a 0, se non sbaglio.

modo0 modificalo cosi:

void modo0()
{ if (PP==HIGH)
  {   analogWrite (r1, lumi);
      analogWrite (g1, lumi);
      analogWrite (b1, lumi);
      analogWrite (r2, lumi);
      analogWrite (g2, lumi);
      analogWrite (b2, lumi);
  } 
  else 
  { analogWrite (r1, 0);
    analogWrite (g1, 0);
    analogWrite (b1, 0);
    analogWrite (r2, 0);
    analogWrite (g2, 0);
    analogWrite (b2, 0);
  }
}

anche con la modifica fatta non spegne

non capisco il discorso della luminosità (lumi), se io l’ho definita all’inizio, nel momento che la richiamo dovrebbe funzionare, o no? :smiley:
chiedo ‚Äėlumi‚Äô :):):slight_smile: in merito

P.S.: scusate il pessimo gioco di parole :smiley:

Nella seconda versione che hai postato, lumi la inizializzi, la aumenti/diminuisci a seconda del tasto del remote.
Ma poi NON la usi, non c‚Äôe‚Äô pi√Ļ nessun analogWrite (r1, lumi); !!! :grin:

un consiglio, per fare debug e vedere da te dove stai passando nel programma.
Nella setup, come prime istruzioni aggiungi:

delay(1000);
Serial.begin(9600);

Questo permette di inviare dei dati al monitor di arduino IDE
Ora nel modo0:

void modo0()
{ if (PP==HIGH)
  {   analogWrite (r1, lumi);
      analogWrite (g1, lumi);
      analogWrite (b1, lumi);
      analogWrite (r2, lumi);
      analogWrite (g2, lumi);
      analogWrite (b2, lumi);
      Serial.print("Modo 0: lumi="); Serial.println(lumi);
  } 
  else 
  { analogWrite (r1, 0);
    analogWrite (g1, 0);
    analogWrite (b1, 0);
    analogWrite (r2, 0);
    analogWrite (g2, 0);
    analogWrite (b2, 0);
    Serial.print("Modo 0: spento"); 
  }
}

Altro suggerimento, creati anche una costante per il numero di modi:

  const K_MAXMODI=3;

nel codice:

  if(modo <3)   => diventa      if(modo<K_MAXMODI)

anche nell’altro punto

  modo = 3;    => diventa     modo=K_MAXMODI;

in effetti hai ragione nel secondo sketch postato non c'è

analogWrite (r1, LOW);
  analogWrite (g1, LOW);
  analogWrite (b1, LOW);
  analogWrite (r2, LOW);
  analogWrite (g2, LOW);
  analogWrite (b2, LOW);

ma nell'IDE l'avevo messa

  analogWrite (r1, lumi);
  analogWrite (g1, lumi);
  analogWrite (b1, lumi);
  analogWrite (r2, lumi);
  analogWrite (g2, lumi);
  analogWrite (b2, lumi);

ecco il perchè della mia domanda, cmq la luminosità non funziona lo stesso

EDIT: aggiunto il monitor seriale, lumi comincia da 255 si abbassa di 20 come da sketch, arriva a 235 e poi si 'impalla' fino al reset manuale quando ripremo play per spegnere, nel monitor seriale non mi scrive spento però smette di trasmettere il valore di lumi

Io ti ho fatto aggiungere solo 2 punti in cui mandare valori/segnali al monitor. Ti conviene aggiungerne in ogni funzione modex e non solo

  if (irrecv.decode(&results)) 
  { //play/pausa premuto
    if(results.value == Kplay) 
    { if(PP==LOW)
      { PP=HIGH;
        Serial.println("remote: PLAY  ACCESO");
      }
      else  
       {  PP=LOW;
           Serial.println("remote: PLAY  SPENTO");
      }
 ...
    }

Stavo pensando la stessa cosa, ora vedo di aggiungerli :D grazie per i suggerimenti

EDIT: aggiunto ed in effetti nel monitor da spento, ma le luci non si spengono

Anche con il primo sketch non ti si spegnevano, vero?

Quello non credo sia un problema di software ma di hardware. Non so bene come consigliarti. Mi sembra di aver letto che per spegnere non basta portare a 0.

Prova comunque a fare i vari analogWrite (r1, 1); non proprio a 0 ma quasi per spegnere. E' una prova.

Dopo i vari suggerimenti, sarebbe meglio allegassi di nuovo la tua ultima versione. Mi sono un pò perso, forse ho visto un errore ma non son sicuro.

Con il primo sketch era l’unica cosa che funzionava :smiley:

ecco la nuova versione del codice

/*
                  PeenieLamp v0.4
 Lampada RGB con telecomando Apple
 
 Codici Apple Remote
 + 		2011287595
- 		2011279403
frw 		2011238443
play pause	2011242539
ffw		2011291691
menu		2011250731
tenuti premuti	4294967295
 
 
 ¬į Play/Pause accende e spegne
 ¬į "+" e "-" regolano luminosit√†
 ¬į "<<" e ">>" Cambiano modalit√†
 ¬į "menu" luce bianca
 
 
 Modalità:
 modo0 - Bianco
 modo1 - Viola
 modo2 - Verde
 modo3 - Rosso
 modo4 - 
 modo5 - 
 
 ultima modifica 02-05-2012
 */


#include <IRremote.h>

const byte r1=3;         //pin dei colori
const byte g1=5;
const byte b1=6;
const byte r2=9;
const byte g2=10;
const byte b2=11;
int RECV_PIN=12;   // pin del ricevitore

int K_MAXMODI=3; //costante per i modi

            ///Costanti per codici ricevitore

const unsigned long Kpiu  = 2011287595;
const unsigned long Kmeno = 2011279403;
const unsigned long Krew  = 2011238443;
const unsigned long Kplay = 2011242539;
const unsigned long Kffw  = 2011291691;
const unsigned long Kmenu = 2011250731;

IRrecv irrecv(RECV_PIN);
decode_results results;

int PP = 0 ;      //conteggio di quanto volte è stato premuto "Play/Pausa"
int lumi = 255;   //luminosità iniziale
int modo = 0;     // inizio da modo 0
int passo=3;      //aumento per cambio colori
int vel=10;       //velocità cambio colori

///SETUP///

void setup()
{
  
delay(1000);
Serial.begin(9600);

  irrecv.enableIRIn();// attiva il ricevitore

  pinMode (r1,OUTPUT);
  pinMode (g1,OUTPUT);
  pinMode (b1,OUTPUT);
  pinMode (r2,OUTPUT);
  pinMode (g2,OUTPUT);
  pinMode (b2,OUTPUT);

  analogWrite (r1, lumi);
  analogWrite (g1, lumi);
  analogWrite (b1, lumi);
  analogWrite (r2, lumi);
  analogWrite (g2, lumi);
  analogWrite (b2, lumi);
}

///MODALITA'///

void modo0()
{ if (PP==HIGH)
  {   analogWrite (r1, lumi);
      analogWrite (g1, lumi);
      analogWrite (b1, lumi);
      analogWrite (r2, lumi);
      analogWrite (g2, lumi);
      analogWrite (b2, lumi);
      Serial.print("Modo 0: lumi="); Serial.println(lumi);
      delay(500);
  } 
  else 
  { analogWrite (r1, 0);
    analogWrite (g1, 0);
    analogWrite (b1, 0);
    analogWrite (r2, 0);
    analogWrite (g2, 0);
    analogWrite (b2, 0);
    Serial.print("Modo 0: spento");
  }
}


void modo1()  {
         
    analogWrite (r1, 255);
    analogWrite (g1, 0);
    analogWrite (b1, 255);
    analogWrite (r2, 255);
    analogWrite (g2, 0);
    analogWrite (b2, 255);
   
  }



void modo2 () {
  
    analogWrite(r1,0);
    analogWrite(g1,255);
    analogWrite (b1,0);
    analogWrite(r2,0);
    analogWrite(g2,255);
    analogWrite (b2,0);
    
}
void modo3 (){
  analogWrite(r1,255);
    analogWrite(g1,0);
    analogWrite (b1,0);
    analogWrite(r2,255);
    analogWrite(g2,0);
    analogWrite (b2,0);
}

///MAIN LOOP///

void loop()  {

  if (irrecv.decode(&results)) {

    //play/pausa premuto
    if(results.value == Kplay) {
      if(PP==LOW){
        PP=HIGH;
        Serial.println("remote: PLAY ACCESO");
      }
      else  {
        PP=LOW;
        Serial.println("remote: PLAY SPENTO");
      }
    }

    //tasto + premuto
    if (results.value == Kpiu && lumi<255){
       lumi = lumi+20;
    }

    //tasto - premuto
    if (results.value == Kmeno && lumi>0){
      lumi=lumi -20;
    }

    // tasto << premuto
    if (results.value == Krew){
      if(modo>K_MAXMODI) {
        modo = modo-1;
      }
      else{
        modo = K_MAXMODI;
      }
    }

    // tasto>>premuto
    if (results.value==  Kffw){
      if(modo< K_MAXMODI ){
        modo = modo +1;
      }
      else{
        modo = 0;
      }
    }
    irrecv.resume();
  }
  switch (modo) {
  case 0:
    if (PP==HIGH){
      modo0();
    }
     
    break;
  case 1:
    if(PP==HIGH){
      modo1();
    }
    break;
  case 2 :
    if(PP==HIGH){
      modo2();
    }
    break;
    case 3 :
    if(PP==HIGH){
      modo3();
    }
  }
}

Bene, allora avevo visto giusto:

...
switch (modo) {
  case 0:
    if (PP==HIGH){
      modo0();
    }...

Dai, dimmi dove hai scritto la strunzata… prova a ragionartela
sta in quelle righe, ricorda come è fatta la modo0() :zipper_mouth_face:

Anche questo non mi risulta molto:

if(modo>K_MAXMODI) 
{ modo = modo-1;
}
else
{ modo = K_MAXMODI;
}

invece cosi si:

  modo = modo-1;
  if(modo<0) modo = K_MAXMODI;     // puoi anche scrivere tutti su riga senza {} se solo 1 istruzione
if(modo< K_MAXMODI )
{ modo=modo+1;     
}
else
{ modo=0;
}
modo=modo+1;      // puoi anche scrivere:           modo++;
if(modo>K_MAXMODI) modo=0;

Grandioso, cos√¨ mi piace. Si impara meglio, si allena il cervello a ragionare ed √® molto pi√Ļ divertente :D:D:D

.....nello switch devo dirgli di spegnere, e così per tutti i colori giusto?

No, ti aiuto.

La modo0 cosa fa per prima cosa?

void modo0()
{ if (PP==HIGH)
  {   analogWrite (r1, lumi);
      ...
  } 
  else 
  { analogWrite (r1, 0);
     ...
  }
}

...
switch (modo) {
  case 0:
    if (PP==HIGH)
   { modo0();
   }
...

Metti tutto insieme, cioè prova a pensare che tutto quello scritto in modo() stà nel if di quel case... e ....

la modo0 per prima cosa verifica lo stato del tasto play
poi se è HIGH, cioè premuto, accende tutti i colori
altrimenti (else) li spegne

nello switch rimanda al modo0 se PP è premuto

con questo codice accende e spegne tutti i modox

/*
                  PeenieLamp v0.6
 Lampada RGB con telecomando Apple
 
 Codici Apple Remote
 + 		2011287595
 - 		2011279403
 frw 		2011238443
 play pause	2011242539
 ffw		2011291691
 menu		2011250731
 tenuti premuti	4294967295
 
 
 ¬į Play/Pause accende e spegne
 ¬į "+" e "-" regolano luminosit√†
 ¬į "<<" e ">>" Cambiano modalit√†
 ¬į "menu" luce bianca
 
 
 Modalità:
 modo0 - Bianco
 modo1 - Viola
 modo2 - Verde
 modo3 - Rosso
 modo4 - 
 modo5 - 
 
 ultima modifica 02-05-2012
 */


#include <IRremote.h>

const byte r1=3;         //pin dei colori
const byte g1=5;
const byte b1=6;
const byte r2=9;
const byte g2=10;
const byte b2=11;
int RECV_PIN=12;   // pin del ricevitore

int K_MAXMODI=3; //costante per i modi

///Costanti per codici ricevitore

const unsigned long Kpiu  = 2011287595;
const unsigned long Kmeno = 2011279403;
const unsigned long Krew  = 2011238443;
const unsigned long Kplay = 2011242539;
const unsigned long Kffw  = 2011291691;
const unsigned long Kmenu = 2011250731;

IRrecv irrecv(RECV_PIN);
decode_results results;

int PP = 0 ;      //conteggio di quanto volte è stato premuto "Play/Pausa"
int lumi = 255;   //luminosità iniziale
int modo = 0;     // inizio da modo 0
int passo=3;      //aumento per cambio colori
int vel=10;       //velocità cambio colori

///SETUP///

void setup()
{

  delay(1000);
  Serial.begin(9600);

  irrecv.enableIRIn();// attiva il ricevitore

  pinMode (r1,OUTPUT);
  pinMode (g1,OUTPUT);
  pinMode (b1,OUTPUT);
  pinMode (r2,OUTPUT);
  pinMode (g2,OUTPUT);
  pinMode (b2,OUTPUT);

  analogWrite (r1, 0);
  analogWrite (g1, 0);
  analogWrite (b1, 0);
  analogWrite (r2, 0);
  analogWrite (g2, 0);
  analogWrite (b2, 0);
}

///MODALITA'///

void modo0()
{ 
  if (PP==HIGH)
  {   
    analogWrite (r1, lumi);
    analogWrite (g1, lumi);
    analogWrite (b1, lumi);
    analogWrite (r2, lumi);
    analogWrite (g2, lumi);
    analogWrite (b2, lumi);
    Serial.print("Modo:");
    Serial.println(modo);
    Serial.print("lumi="); 
    Serial.println(lumi);
    delay(500);
  } 

}


void modo1()  {

  analogWrite (r1, lumi);
  analogWrite (g1, 0);
  analogWrite (b1, lumi);
  analogWrite (r2, lumi);
  analogWrite (g2, 0);
  analogWrite (b2, lumi);
  Serial.print("Modo:");
  Serial.println(modo);
  Serial.print("lumi="); 
  Serial.println(lumi);
  delay(500);

}



void modo2 () {

  analogWrite(r1,0);
  analogWrite(g1,255);
  analogWrite (b1,0);
  analogWrite(r2,0);
  analogWrite(g2,255);
  analogWrite (b2,0);
  Serial.print("Modo:");
  Serial.println(modo);
  Serial.print("lumi="); 
  Serial.println(lumi);
  delay(500);

}
void modo3 (){
  analogWrite(r1,255);
  analogWrite(g1,0);
  analogWrite (b1,0);
  analogWrite(r2,255);
  analogWrite(g2,0);
  analogWrite (b2,0);
  Serial.print("Modo:");
  Serial.println(modo);
  Serial.print("lumi="); 
  Serial.println(lumi);
  delay(500);
}

///MAIN LOOP///

void loop()  {

  if (irrecv.decode(&results)) {

    //play/pausa premuto
    if(results.value == Kplay) {
      if(PP==LOW){
        PP=HIGH;
        Serial.println("remote: PLAY ACCESO");
      }
      else  {
        PP=LOW;
        Serial.println("remote: PLAY SPENTO");
      }
    }

    //tasto + premuto
    if (results.value == Kpiu && lumi<255){
      lumi = lumi+15;
    }

    //tasto - premuto
    if (results.value == Kmeno && lumi>0){
      lumi=lumi -15;
    }

    // tasto << premuto
    if (results.value == Krew){
      modo = modo-1;

      if(modo<0) modo = K_MAXMODI;
    }

    // tasto>>premuto
    if (results.value==  Kffw){
      modo=modo+1;      // puoi anche scrivere:           modo++;

      if(modo>K_MAXMODI) modo=0;
    }


    irrecv.resume();

    switch (modo) {
    case 0:
      if (PP==HIGH){
        modo0();
      }
      else 
      { 
        analogWrite (r1, 0);
        analogWrite (g1, 0);
        analogWrite (b1, 0);
        analogWrite (r2, 0);
        analogWrite (g2, 0);
        analogWrite (b2, 0);

      }
      break;
    case 1:
      if(PP==HIGH){
        modo1();
      }
      else 
      { 
        analogWrite (r1, 0);
        analogWrite (g1, 0);
        analogWrite (b1, 0);
        analogWrite (r2, 0);
        analogWrite (g2, 0);
        analogWrite (b2, 0);

      }
      break;
    case 2 :
      if(PP==HIGH){
        modo2();
      }
      else 
      { 
        analogWrite (r1, 0);
        analogWrite (g1, 0);
        analogWrite (b1, 0);
        analogWrite (r2, 0);
        analogWrite (g2, 0);
        analogWrite (b2, 0);

      }
      break;
    case 3 :
      if(PP==HIGH){
        modo3();
      }
      else 
      { 
        analogWrite (r1, 0);
        analogWrite (g1, 0);
        analogWrite (b1, 0);
        analogWrite (r2, 0);
        analogWrite (g2, 0);
        analogWrite (b2, 0);

      }
    }
  }
}

Ovvero a questo punto nella modo0() è inutile ri-verificate il valore di PP :grin:

Per semplificare,

...
switch (modo) {
  case 0:
    if (PP==HIGH)
   { /// modo0();
        if (PP==HIGH)
          {   analogWrite (r1, lumi);
              ...
          } 
          else 
          { analogWrite (r1, 0);
             ...
          }  
   }

Non potrai mai spegnere i led, perch√® l'if pi√Ļ interno ovvero quello dentro alla modo0() non verr√† mai testato Facevi troppe volte il test di PP. Se il test viene fatto dentro la modo0(), non serve farlo anche prima di chiamare la modo0()

Anzi, io metterei il test su PP=HIGH dentro a tutte le varie modox() e lo toglierei dallo switch

Ecco fatto :sweat_smile:
ci ho messo un pochino a capire ma alla fine ho sistemato con i tuoi suggerimenti

/*
                  PeenieLamp v0.7
 Lampada RGB con telecomando Apple
 
 Codici Apple Remote
 + 		2011287595
 - 		2011279403
 frw 		2011238443
 play pause	2011242539
 ffw		2011291691
 menu		2011250731
 tenuti premuti	4294967295
 
 
 ¬į Play/Pause accende e spegne
 ¬į "+" e "-" regolano luminosit√†
 ¬į "<<" e ">>" Cambiano modalit√†
 ¬į "menu" luce bianca
 
 
 Modalità:
 modo0 - Bianco
 modo1 - Viola
 modo2 - Verde
 modo3 - Rosso
 modo4 - 
 modo5 - 
 
 ultima modifica 02-05-2012
 */


#include <IRremote.h>

const byte r1=3;         //pin dei colori
const byte g1=5;
const byte b1=6;
const byte r2=9;
const byte g2=10;
const byte b2=11;
int RECV_PIN=12;   // pin del ricevitore

int K_MAXMODI=3; //costante per i modi

///Costanti per codici ricevitore

const unsigned long Kpiu  = 2011287595;
const unsigned long Kmeno = 2011279403;
const unsigned long Krew  = 2011238443;
const unsigned long Kplay = 2011242539;
const unsigned long Kffw  = 2011291691;
const unsigned long Kmenu = 2011250731;

IRrecv irrecv(RECV_PIN);
decode_results results;

int PP = 0 ;      //conteggio di quanto volte è stato premuto "Play/Pausa"
int lumi = 255;   //luminosità iniziale
int modo = 0;     // inizio da modo 0
int passo=3;      //aumento per cambio colori
int vel=10;       //velocità cambio colori

///SETUP///

void setup()
{

  delay(1000);
  Serial.begin(9600);

  irrecv.enableIRIn();// attiva il ricevitore

  pinMode (r1,OUTPUT);
  pinMode (g1,OUTPUT);
  pinMode (b1,OUTPUT);
  pinMode (r2,OUTPUT);
  pinMode (g2,OUTPUT);
  pinMode (b2,OUTPUT);

  analogWrite (r1, 0);
  analogWrite (g1, 0);
  analogWrite (b1, 0);
  analogWrite (r2, 0);
  analogWrite (g2, 0);
  analogWrite (b2, 0);
}

///MODALITA'///

void modo0()
{ 
  if (PP==HIGH)
  {   
    analogWrite (r1, lumi);
    analogWrite (g1, lumi);
    analogWrite (b1, lumi);
    analogWrite (r2, lumi);
    analogWrite (g2, lumi);
    analogWrite (b2, lumi);
    Serial.print("Modo:");
    Serial.println(modo);
    Serial.print("lumi="); 
    Serial.println(lumi);
    delay(500);
  }
  else{
    analogWrite (r1, 0);
    analogWrite (g1, 0);
    analogWrite (b1, 0);
    analogWrite (r2, 0);
    analogWrite (g2, 0);
    analogWrite (b2, 0);
  }


}


void modo1()  {

  if (PP==HIGH){
    analogWrite (r1, lumi);
    analogWrite (g1, 0);
    analogWrite (b1, lumi);
    analogWrite (r2, lumi);
    analogWrite (g2, 0);
    analogWrite (b2, lumi);
    Serial.print("Modo:");
    Serial.println(modo);
    Serial.print("lumi="); 
    Serial.println(lumi);
    delay(500);
  }
  else{
    analogWrite (r1, 0);
    analogWrite (g1, 0);
    analogWrite (b1, 0);
    analogWrite (r2, 0);
    analogWrite (g2, 0);
    analogWrite (b2, 0);
  }
}



void modo2 () {
  if (PP==HIGH){
    analogWrite(r1,0);
    analogWrite(g1,255);
    analogWrite (b1,0);
    analogWrite(r2,0);
    analogWrite(g2,255);
    analogWrite (b2,0);
    Serial.print("Modo:");
    Serial.println(modo);
    Serial.print("lumi="); 
    Serial.println(lumi);
    delay(500);
  }
  else{
    analogWrite (r1, 0);
    analogWrite (g1, 0);
    analogWrite (b1, 0);
    analogWrite (r2, 0);
    analogWrite (g2, 0);
    analogWrite (b2, 0);
  }
}
void modo3 (){
  if (PP==HIGH){
    analogWrite(r1,255);
    analogWrite(g1,0);
    analogWrite (b1,0);
    analogWrite(r2,255);
    analogWrite(g2,0);
    analogWrite (b2,0);
    Serial.print("Modo:");
    Serial.println(modo);
    Serial.print("lumi="); 
    Serial.println(lumi);
    delay(500);
  }
  else{
    analogWrite (r1, 0);
    analogWrite (g1, 0);
    analogWrite (b1, 0);
    analogWrite (r2, 0);
    analogWrite (g2, 0);
    analogWrite (b2, 0);
  }
}

///MAIN LOOP///

void loop()  {

  if (irrecv.decode(&results)) {

    //play/pausa premuto
    if(results.value == Kplay) {
      if(PP==LOW){
        PP=HIGH;
        Serial.println("remote: PLAY ACCESO");
      }
      else  {
        PP=LOW;
        Serial.println("remote: PLAY SPENTO");
      }
    }

    //tasto + premuto
    if (results.value == Kpiu && lumi<255){
      lumi = lumi+15;
    }

    //tasto - premuto
    if (results.value == Kmeno && lumi>0){
      lumi=lumi -15;
    }

    // tasto << premuto
    if (results.value == Krew){
      modo = modo-1;

      if(modo<0) modo = K_MAXMODI;
    }

    // tasto>>premuto
    if (results.value==  Kffw){
      modo=modo+1;      // puoi anche scrivere:           modo++;

      if(modo>K_MAXMODI) modo=0;
    }


    irrecv.resume();

    switch (modo) {
    case 0:

      modo0();

      break;
    case 1:

      modo1();

      break;
    case 2 :

      modo2();

      break;
    case 3 :

      modo3();

    }
  }
}

Ora devo sistemare la questione luminosità :smiley:

Per semplificare ancora: fai una unica funzione Spegni() e la chiami dove serve

...
void Spegni()
{   analogWrite (r1, 0);
    analogWrite (g1, 0);
    analogWrite (b1, 0);
    analogWrite (r2, 0);
    analogWrite (g2, 0);
    analogWrite (b2, 0);
    Serial.println("Spento");
}
...
void modo3 ()
{ if (PP==HIGH){
    analogWrite(r1,255);
    analogWrite(g1,0);
    analogWrite (b1,0);
    analogWrite(r2,255);
    analogWrite(g2,0);
    analogWrite (b2,0);
    Serial.print("Modo:");
    Serial.println(modo);
    Serial.print("lumi="); 
    Serial.println(lumi);
    delay(500);
  }
  else
  { Spegni();
  }
}
...