Lampada RGB con Apple Remote

Dentro al primo switch() gestisci anche il modo5 che invece deve gestire il secondo switch()
(Il primo gestisce le luci fisse, quello successivo le luci con animazioni, non possono avere gli stessi modox)

Davo anche per scontato avessi fatto la modifica di togliere dalla varie modox() la verifica di PP==HIGH
spostando una unica verifica prima del primo switch

/* 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 - Blu
 modo5 - Blinky
 modo6 - Fade
 
 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;
const byte RECV_PIN=12;   // pin del ricevitore

const byte K_MAXMODI=6; //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;

byte fade = 5; 
int PP = LOW ;      //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

unsigned long previousMillis=0;
///SETUP///

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

  irrecv.enableIRIn();// attiva il ricevitore

  pinMode (r1,OUTPUT);//definisce i pin come output
  pinMode (g1,OUTPUT);
  pinMode (b1,OUTPUT);
  pinMode (r2,OUTPUT);
  pinMode (g2,OUTPUT);
  pinMode (b2,OUTPUT);
}

void StampaModo()
{ Serial.print("Modo:");
  Serial.println(modo);
  Serial.print("lumi="); 
  Serial.println(lumi);   
}

///MODALITA'///

void Spegni()
{ analogWrite (r1, 0);
  analogWrite (g1, 0);
  analogWrite (b1, 0);
  analogWrite (r2, 0);
  analogWrite (g2, 0);
  analogWrite (b2, 0);
  Serial.println("SPENTO");
}

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

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

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

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

void modo4 ()
{ analogWrite(r1,0);
  analogWrite(g1,0);
  analogWrite (b1,lumi);
  analogWrite(r2,0);
  analogWrite(g2,0);
  analogWrite (b2,lumi);
  StampaModo();
}

void modo5()
{ analogWrite (r1, lumi);
  analogWrite (g1, lumi);
  analogWrite (b1, lumi);
  analogWrite (r2, lumi);
  analogWrite (g2, lumi);
  analogWrite (b2, lumi);
  StampaModo(); 
}

///MAIN LOOP///
void loop()  
{ if (irrecv.decode(&results)) 
  { //play/pausa premuto
    if(results.value == Kplay) {
      if(PP==LOW){
        PP=HIGH;
        Serial.println("ACCESO");
      }
      else  {
        PP=LOW;
      }
    }
    //tasto + premuto
    if (results.value == Kpiu && lumi<255){
      lumi = lumi+15;
      delay(30);
    }
    //tasto - premuto
    if (results.value == Kmeno && lumi>0){
      lumi=lumi -15;
      delay(30);
    }
    // tasto << premuto
    if (results.value == Krew){
      modo = modo-1;
      if(modo<0) modo = K_MAXMODI;
      if(modo<5)  lumi=255;
      if(modo==5) lumi=255;
      if(modo==6) lumi=0;
    }
    // tasto>>premuto
    if (results.value==  Kffw){
      modo=modo+1;      // puoi anche scrivere:           modo++;
      if(modo>K_MAXMODI) modo=0;
      if(modo<5)  lumi=255;
      if(modo==5) lumi=255;
      if(modo==6) lumi=0;
    }
    irrecv.resume();
    switch (modo) {
    case 0:
      modo0();
      break;
    case 1:
      modo1();
      break;
    case 2:
      modo2();
      break;
    case 3:
      modo3();
      break;
      case 4:
      modo4();
      break;
    } // END switch
  } //END if
  unsigned long currentMillis = millis();
  switch(modo)   // queste modalità sono eseguite in base al tempo della millis (per animazioni dei led)
  { case 5: // blinky
      if(currentMillis - previousMillis > 1000L) // ogni secondo 1000L=1 sec
      { previousMillis = currentMillis;   
        PP=!PP;
        if(PP==false)
          Spegni();
        else
          modo0();
      }
      break;
    case 6:  // fade
      if(currentMillis - previousMillis > 100) // ogni 0,1 sec
      { previousMillis = currentMillis;   
        lumi=lumi+fade;
        if(lumi==0 || lumi==255) fade=-fade;
        modo0();
      }
      break;
  }  // end switch
} // END loop

Sto provando a fare tutte le modifiche ma c'è sempre qualcosa che sbaglio, con questo codice ad esempio non si spegne più

/*
                  PeenieLamp v0.1b
 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 - Blu
 modo5 - Blinky
 modo6 - Fade
 
 ultima modifica 03-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;
const byte RECV_PIN=12;   // pin del ricevitore

byte fade = 5; 

const byte K_MAXMODI=6; //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 = LOW ;      //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

unsigned long previousMillis=0;
///SETUP///

void setup()
{

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

  irrecv.enableIRIn();// attiva il ricevitore

  pinMode (r1,OUTPUT);//definisce i pin come output
  pinMode (g1,OUTPUT);
  pinMode (b1,OUTPUT);
  pinMode (r2,OUTPUT);
  pinMode (g2,OUTPUT);
  pinMode (b2,OUTPUT);

}
void StampaModo()
{ Serial.print("Modo:");
  Serial.println(modo);
  Serial.print("lumi="); 
  Serial.println(lumi);   
}

///MODALITA'///

void Spegni()
{   
  analogWrite (r1, 0);
  analogWrite (g1, 0);
  analogWrite (b1, 0);
  analogWrite (r2, 0);
  analogWrite (g2, 0);
  analogWrite (b2, 0);
  Serial.println("SPENTO");
}

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


void modo1()  {

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

  
  
    
  
}

void modo2 () {
  
    analogWrite(r1,0);
    analogWrite(g1,lumi);
    analogWrite (b1,0);
    analogWrite(r2,0);
    analogWrite(g2,lumi);
    analogWrite (b2,0);
    StampaModo();


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

  
    
  
}
void modo4 (){
  
    analogWrite(r1,0);
    analogWrite(g1,0);
    analogWrite (b1,lumi);
    analogWrite(r2,0);
    analogWrite(g2,0);
    analogWrite (b2,lumi);
    StampaModo();


   
  
}
void modo5(){
   
    analogWrite (r1, lumi);
    analogWrite (g1, lumi);
    analogWrite (b1, lumi);
    analogWrite (r2, lumi);
    analogWrite (g2, lumi);
    analogWrite (b2, lumi);
    StampaModo(); 
 
    
  
}
void modo6()
{ 

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

    
  
}


///MAIN LOOP///

void loop()  {

  if (irrecv.decode(&results)) {

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

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

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

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

      if(modo<0) modo = K_MAXMODI;
      if(modo<5)  lumi=255;
      if(modo==5) lumi=255;
      if(modo==6) lumi=0;
    }

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

      if(modo>K_MAXMODI) modo=0;
        if(modo<5)  lumi=255;
      if(modo==5) lumi=255;
      if(modo==6) lumi=0;
    }

    irrecv.resume();
if (PP==HIGH){
    switch (modo) {

    case 0:
      modo0();
      break;
    case 1:
      modo1();
      break;
    case 2:
      modo2();
      break;
    case 3:
      modo3();
      break;
      case 4:
      modo4();
      break;
      
     } // END switch
  } //END if
  unsigned long currentMillis = millis();
switch(modo)  
// queste modalità sono eseguite in base al tempo della millis (per animazioni dei led)
if(PP==HIGH){
  { case 5: // blinky
      if(currentMillis - previousMillis > 1000L) // ogni secondo 1000L=1 sec
      { previousMillis = currentMillis;   
        PP=!PP;
        if(PP==false)
          Spegni();
        else
          modo0();
      }
      break;
    case 6:  // fade
      if(currentMillis - previousMillis > 100) // ogni 0,1 sec
      { previousMillis = currentMillis;   
        lumi=lumi+fade;
        if(lumi==0 || lumi==255) fade=-fade;
        modo0();
      }
      break;
  }  // end switch
} // END loop
  }
}

Persistono i problemi di prima, ma riuscirò a sistemarli :smiley:

OK ho modificato il codice e anche con questo c'è qualche problema che devo risolvere
però mi sembra una buona base per ripartire, quindi tutte le successive modifiche che farò si baseranno su questo codice in allegato

EDIT: invece dell'ULN2003 sto usando dei bc337, così mi servono solo 3 pin. Ho modificato il codice di conseguenza con solo 3 pin

2°EDIT: stavo riguardando il codice ed ho notato qualche errore, così ho provato a risolverlo e ci sono riuscito ragionandoci un pochino :D:D:D
nel modo6 avevo dimenticato un else ed era per quello che non sapeva che fare andando credo in loop

case 6:  // fade
    if(currentMillis - previousMillis > 100) // ogni 0,1 sec
    { 
      previousMillis = currentMillis;   
      lumi=lumi+fade;
      if(lumi==0 || lumi==255) fade=-fade;
      else
      modo0();
    }

nelle funzioni Krew e Kffw c'era un errore che ho corretto ed ora sembra funzionare meglio, nello specifico if(modo<5) lumi=255; è diventato if(modo<5) lumi;

:smiley: allego codice con versione cambiata in 0.2
fa dei giochi strani:
nel mode6 quello del fade, arrivato a 255 prosegue e non torna indietro
nel modo3, quello rosso, non funziona la luminosità(solo in quello adesso)
nel modo0 (luce bianca) quando diminuisco la luminosità fa un colore azzurrino

PeenieLampv0_1c.ino (5.39 KB)

PeenieLampv0_2.ino (5.4 KB)

1.Non ha senso. Non vuol dire nulla. :fearful:

peenieman:
è diventato if(modo<5) lumi;

2.Io ti consiglierei di usare i PWM da 9-10-11 e NON 3-5-6.

3.oooops nel codice che ti ho messo, avevo modificato PP come boolean (che vale solo true/false invece che int HIGH/LOW) !!!

però così modificato funziona, come era prima non funzionava
in effetti sembra che ci sia qualcosa che non torna

peenieman:
però così modificato funziona, come era prima non funzionava
in effetti sembra che ci sia qualcosa che non torna
EDIT: ho rimesso com'era e funziona alla stessa maniera :astonished:

Per la variabile PP, dichiarala boolean PP=false;

poi dove usi PP metti invece di HIGH->true e di LOW->false

fatto, ora sto cercando di capire dove sono gli sulla luminosità, però non mi sembra ce ne siano, cioè i modo() sono fatti alla stessa maniera
ho modificato anche i pin

PeenieLampv0_2a.ino (4.66 KB)

peenieman:
fatto, ora sto cercando di capire dove sono gli sulla luminosità, però non mi sembra ce ne siano, cioè i modo() sono fatti alla stessa maniera
ho modificato anche i pin

...sono gli sulla... ehe?!?!?! :grin:

:D:D:D
tralasciavo gli "errori"

l'ora tarda, i led negli occhi :slight_smile: :stuck_out_tongue:

Oggi ho fatto un pò di modifiche , ho cambiato qualche modo() e tolto le funzioni che mi aveva dato nid69ita riguardo alla millis(devo ancora capirle :)) che non riuscivo a fare funzionare.
Cmq per oggi mi ritengo soddisfatto, ho capito qualcosina in più :slight_smile:
allego lo sketch ultimo :smiley:

PeenieLampv0_2d.ino (4.63 KB)

Prova a leggere questo: blink led senza delay(), usando millis()

Letto e riletto, ma ancora non capisco come integrarlo al meglio.

E allora questo (in italiano) dovrebbe chiarirti la millis()
http://www.leonardomiliani.com/2013/programmiamo-i-compiti-con-millis/

dal sito dell'admin @leo72 :grin:

:slight_smile: grazie per il link
Oggi faccio qualche prova con la millis, in effetti nel mio codice quei delay rallentano il tutto.

Dopo un bel pò di prove sono arrivato alla conclusione di non aver capito niente sulla millis,
o meglio, in uno sketch semplice e con un colore solo riesco a fargli fare l'effetto fade, ma quando provo a farlo tra tutti i colori non riesco.
inoltre non riesco ad integrare nel codice della lampada l'effetto fade di un colore solo.
Mi sa che dovrò studiare di brutto :):):slight_smile:

Anche oggi ho fatto un bel pò di prove e forse qualcosa in più ho capito, anche se ci sono moooolte cose che non mi sono chiare, questo è quello che sono riuscito a fare con due colori(ne ho definiti 3 già in partenza)

const byte r1=5;        //pin dei led
const byte g1=9;
const byte b1=6;
byte lr1=0;            // imposto i led          
byte lg1=0;
byte lb1=0;
unsigned long previousMillisr=0;  //ricorda l'ultimo lampeggio
unsigned long previousMillisg=0;
unsigned long previousMillisb=0;
int fade=5;
//int fade1=10;
void setup(){
  pinMode (r1,OUTPUT);
  pinMode (g1,OUTPUT);
  pinMode (b1,OUTPUT);
}//fine setup

void loop(){
  unsigned long currentMillis =millis();

  if (currentMillis - previousMillisr > 100){
    previousMillisr = currentMillis;
    lr1=lr1+fade; 
    analogWrite(r1,lr1);    
    if (lr1==0||lr1==255) fade=-fade;  }//fine if
      
  if (previousMillisr - previousMillisg > 100){
    previousMillisg = currentMillis;
    lg1=lg1-fade;   
    analogWrite(g1,lg1);    
    if (lg1==0||lg1==255)  fade=+fade;
  }//fine if
    
 /* if (currentMillis - previousMillisb > 300){
    previousMillisb = currentMillis;
    lb1=lb1+fade;    
    if (lb1==0||lb1==255)  fade=-fade;
    analogWrite(b1,lb1);  }//fine if*/
    
}// fine loop

per tre colori non riesco a capire come fare, potreste postarmi un esempio di "rainbow" con 3 colori così magari capisco i miei errori :smiley:

continuo a fare prove ma proprio non riesco a fare un "rainbow" senza delay :frowning:
a dire il vero non mi è riuscita bene neanche quella perchè dopo il primo giro si ferma :frowning:

In questi giorni mi sono dedicato poco alla mia lampada, e quel poco non è stato molto produttivo nel senso che per ora non metterò un'opzione per un "rainbow" ma solo colori fissi, proprio non riesco con la millis a fare un fade con i tre colori.
Per ora mi accontento così, in futuro vedrò di aggiornare il software (cioè dopo un bel pò di studio :))

per chi fosse interessato lo sketch è questo

/*
                  PeenieLamp v0.2e
 Lampada RGB con telecomando Apple
 
 Codici Apple Remote  DEC/HEX
 + 		2011287595 / 77E1D02B
 - 		2011279403 / 77E1B02B
 frw 		2011238443 / 77E1102B
 play pause	2011242539 / 77E1202B
 ffw		2011291691 / 77E1E02B
 menu		2011250731 / 77E1402B
 tenuti premuti	4294967295 / FFFFFFFF
 
 ° Play/Pause accende e spegne
 ° "+" e "-" regolano luminosità
 ° "<<" e ">>" Cambiano modalità
 
 
 Modalità:
 modo0 - Bianco
 modo1 - Rosso
 modo2 - Verde
 modo3 - Blu
 modo4 - Giallo
 modo5 - Viola
 modo6 - Azzurro
 
 ultima modifica 17-05-2012 h23:00
 */
#include <IRremote.h>

const byte r1=5;         //pin dei colori
const byte g1=6;
const byte b1=9;

const byte RECV_PIN=12;   // pin del ricevitore

const byte K_MAXMODI=6; //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;

boolean PP  = false;  //conteggio di quanto volte è stato premuto "Play/Pausa"
int lumi = 255;    //luminosità iniziale
int modo = 0;    // inizio da modo 0

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

  irrecv.enableIRIn();// attiva il ricevitore

  pinMode (r1,OUTPUT);//definisce i pin come output
  pinMode (g1,OUTPUT);
  pinMode (b1,OUTPUT);

}

void StampaModo()
{ 
  Serial.print("Modo:");
  Serial.println(modo);
  Serial.print("lumi="); 
  Serial.println(lumi); 

}

///MODALITA'///
void Spegni()
{ 
  analogWrite (r1, 0);
  analogWrite (g1, 0);
  analogWrite (b1, 0);

}

void modo0()
{ 
  analogWrite (r1, lumi);
  analogWrite (g1, lumi);
  analogWrite (b1, lumi);

  StampaModo();
}

void modo1 ()
{ 
  analogWrite(r1,lumi);
  analogWrite(g1,0);
  analogWrite(b1,0);
  StampaModo();
}
void modo2 () 
{ 
  analogWrite(r1,0);
  analogWrite(g1,lumi);
  analogWrite(b1,0);
  StampaModo();
}

void modo3 ()
{ 
  analogWrite(r1,0);
  analogWrite(g1,0);
  analogWrite(b1,lumi);
  StampaModo();
}

void modo4(){
   analogWrite(r1,lumi);
  analogWrite(g1,lumi);
  analogWrite(b1,0);

  StampaModo();
  }
  
void modo5()
{ 
   analogWrite(r1,lumi);
  analogWrite(g1,0);
  analogWrite(b1,lumi);
  StampaModo(); 
}

void modo6()  
{ 
  analogWrite (r1,0);
  analogWrite (g1, lumi);
  analogWrite (b1, lumi);
  StampaModo();
}

///MAIN LOOP///

void loop()  
{ 
  if (irrecv.decode(&results)) 
  { 
    switch(results.value)
    { 
    case Kplay:  //play/pausa premuto
      if(PP==false)
      { 
        PP=true;
        Serial.println("ACCESO");
      }
      else  
      { 
        PP=false;  
        Serial.println("SPENTO");
      }
      break;
    case Kpiu:    //tasto + premuto
      lumi=lumi+15;
      if (lumi>255) lumi=255;
      delay(10);
      break;
      
    case Kmeno:   //tasto - premuto
      lumi=lumi-15;
      if(lumi<=0) lumi=5;   // lumi=0 sarebbe come spegnere
      delay(10);
      break;
      
    case Krew:    // tasto << premuto
         if(PP==true) modo--;
      if(modo<0) modo=K_MAXMODI;
      if(modo<6) lumi=lumi;
             
      break;  
    case Kffw:    // tasto>>premuto
      if(PP==true) modo++;
      if(modo>K_MAXMODI) modo=0;
      if(modo<6) lumi=lumi;             
      break;
      
    }  // end switch
    irrecv.resume();
    if(PP!=true){ 
      Spegni();
    }
    else{ 
      switch (modo) { 
      case 0:
        modo0();
        break;
      case 1:
        modo1();
        break;
      case 2:
        modo2();
        break;
      case 3:
        modo3();
        break;
      case 4:
        modo4();
        break;
      case 5:
        modo5();
        break;
      case 6:
        modo6();
        break;
      }  // end switch
    }  // end if
  }  // end if
}  // end loop