Lampada RGB con Apple Remote

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:

:D 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 :) 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 :D

ti tengo aggiornato :)

Ho provato il tuo programma mettendo 3 led ai pin 3,5,6 e mandando comandi da tastiera pc attraverso monitor seriale (p,f,r,+,- li ho mappati con i tuoi comandi) per fare prova. La lumi se non è 255 sul pin 3 (rosso) me lo spegne subito, non su 5,6

void loop()  
{ if(Serial.available())   //if (irrecv.decode(&results)) 
  { char c=Serial.read();
    if(c=='+') results.value=Kpiu;
    if(c=='-') results.value=Kmeno;
    if(c=='p') results.value=Kplay;
    if(c=='r') results.value=Krew;
    if(c=='f') results.value=Kffw;
    switch(results.value)

Se vuoi fare una prova con modo5, dove ogni secondo spegne/accende:

  1. aggiungi tra le variabili questo
unsigned long previousMillis=0;
  1. aggiungi al fondo nella loop() questo (le prime tre graffe chiuse e l'ultima le hai già)
     }  // end switch
    }  // end if
  }  // end if
  unsigned long currentMillis = millis();
  if(modo==5) 
  { if(currentMillis - previousMillis > 1000L) 
    { previousMillis = currentMillis;   
      PP=!PP;
      if(PP==false)
        Spegni();
      else
        modo0();
    }
  }
}  // end loop

aggiunto modo5 come suggerito e funziona
un altro problema di codice è che anche quando spento accetta i comandi dati e cambia modo

Secondo me è giusto così, io intenderei spento=no luce ma se vuoi cambiare modo è okay.

Se però vuoi evitarlo devi mettere un if su PP anche quando cambi modo

...
  case Krew:    // tasto << premuto
    if(PP==HIGH) modo--;
    if(modo<0) modo=K_MAXMODI;
    if(modo==5) lumi=255;
    if(modo==6) lumi=0;
    break;  
  case Kffw:    // tasto>>premuto
    if(PP==HIGH) modo++;      // puoi anche scrivere: modo=modo+1;   oppure modo+=1;
    if(modo>K_MAXMODI) modo=0;
    if(modo==5) lumi=255;
    if(modo==6) lumi=0;
    break;
...

Aggiungi anche quegli if su modo=6 e 5 che ti passo un modo 6 che fa la dissolvenza
tra le variabili all’inizio aggiungi:

byte fade = 5;     // deve essere 5

anche secondo me è giusto così, ma quando si va a riaccendere prende il modo cambiato e non lo stesso di quando hai spento.

Aggiunto modo 6 per il fade e distinto modo5/6 con switch invece che if. Prime 3 graffe e ultima le hai già

      }  // end switch
    }  // end if
  }  // 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

Ricorda di aggiungere tra le variabili: byte fade = 5; // deve essere 5

Quando cambi modo bisogna a secondo del modo riazzerare le variabili cosi:

  case Krew:    // tasto << premuto
    if(PP==HIGH) modo--;
    if(modo<0) modo=K_MAXMODI;
    if(modo<5) lumi=255;
    if(modo==5) lumi=255;            // se entro in modo5, lumi riparte da 255
    if(modo==6) lumi=0;               // se entro in modo6, lumi DEVE ripartire da valore divisibile per 5 ma < 255 !!!
    break;

Nel modo 6 non entra e blocca tutto
allego il mio sketch

più tardi provo a comandarli con dei BC337 invece dell’ULN2003, lo sketch non dovrebbe cambiare

PeenieLampv0_1b.ino (5.06 KB)

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)