Lampada RGB con Apple Remote

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();
  }
}
...

Lo switch puoi anche compattarlo un pò:

switch (modo) 
{ case 0: modo0(); break;
  case 1: modo1(); break;
  case 2: modo2(); break;
  case 3: modo3(); break;
}

:smiley:
fatto e funzionante.

EDIT:
anche lo switch.

Più problematico sarà fare gli effetti di fade-in, fade-out mentre in contemporanea leggi se arrivano comandi dal remote.

Ma per ora... :sleeping:

:smiley:
si si ora a letto anche io
domani a mente fresca provo a far andare la luminosità
grazie mille dei consigli e buonanotte

Buongiorno a tutti, con l'ultimo codice che ho postato in esecuzione, impostando la luminosità iniziale a 0, stavo notando che nei modo2 e modo3 la luminosità riesco ad aumentarla e diminuirla,
mentre negli altri modi (modo0 e modo1) no.
In aggiunta questi modo, se non porto la luminosità a 255 dai modo2 e modo3, impallano tutto fino al reset manuale.
Ovviamente ho impostato tutti i colori con lumi
allego sketch con modifiche

PeenieLampv0_1a.ino (4.34 KB)

Migliorie: metti const e byte anche questi

const byte RECV_PIN=12;   // pin del ricevitore
const byte K_MAXMODI=4; //costante per i modi

Anzi, ti allego lo sketch con alcune migliorie per semplificare il codice. Vedi se ti piace.

PeenieLampv0_1a.ino (3.87 KB)

:slight_smile: fatto

stavo notando questa cosa....
prendendo i modo() uno per uno vedo che modo1 e modo2 hanno più di un colore acceso per volta, mentre modo2 e modo3 hanno un solo colore acceso. verrebbe da pensare che il problema con modo1 e modo2 sia da attribuire a questo fatto.
Ho aggiunto anche un modo4 che pur avendo un solo colore acceso si comporta come modo1 e modo2. deduco quindi che non sia da attribuire la cosa ai colori.
Analizzando i codice dei "void modo()" vedo che sono uguali :astonished: enon riesco a capire l'errore, eppure c'è da qualche parte :smiley:

EDIT: grazie per il codice, decisamente più pulito :):):slight_smile:
notavo anche le modifiche dove si definiscono le costanti, tu hai messo byte PP = LOW
io int PP = 0
potresti dirmi la differenza? :slight_smile:
mi rimane comunque il problema descritto prima, e continuo a non vedere l'errore

Una modifica che farei è anche di inizializzare lumi a 255. Parti spento, se accendi dovresti partire con modo=0 e lumi al massimo e non a 0.

Per quel difetto, neppure io vedo errori nel codice. Potrebbe essere una svista oppure un problema hw, ma non saprei.

infatti inizialmente sono partito con lumi al massimo, era a zero per fare le prove della luminosità.
Ora è a 255 :slight_smile: giustamente quando accendi deve accendersi :D:D:D

stavo valutando anche io il problema HW, visto che in r1 nel modo3 non va luminosità mentre in r2 si
ora chiedo nell'altra sezione :smiley:

ti tengo aggiornato :slight_smile: