Go Down

Topic: Lampada RGB con Apple Remote (Read 4114 times) previous topic - next topic

nid69ita

No, ti aiuto.

La modo0 cosa fa per prima cosa?
Code: [Select]

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 ....
my name is IGOR, not AIGOR

peenieman

#16
May 02, 2013, 10:45 pm Last Edit: May 02, 2013, 10:48 pm by peenieman Reason: 1
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

Code: [Select]
/*
                 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);

     }
   }
 }
}

Il fare è il miglior modo d'imparare

nid69ita

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

Per semplificare,
Code: [Select]

...
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
my name is IGOR, not AIGOR

peenieman

#18
May 02, 2013, 11:30 pm Last Edit: May 02, 2013, 11:36 pm by peenieman Reason: 1
Ecco fatto  :smiley-sweat:
ci ho messo un pochino a capire ma alla fine ho sistemato con i tuoi suggerimenti
Code: [Select]
/*
                 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à :D
Il fare è il miglior modo d'imparare

nid69ita

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

Code: [Select]

...
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();
  }
}
...
my name is IGOR, not AIGOR

nid69ita

Lo switch puoi anche compattarlo un pò:
Code: [Select]

switch (modo)
{ case 0: modo0(); break;
  case 1: modo1(); break;
  case 2: modo2(); break;
  case 3: modo3(); break;
}
my name is IGOR, not AIGOR

peenieman

#21
May 02, 2013, 11:45 pm Last Edit: May 02, 2013, 11:47 pm by peenieman Reason: 1
:D
fatto e funzionante.

EDIT:
anche lo switch.

Il fare è il miglior modo d'imparare

nid69ita

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

Ma per ora...  :smiley-sleep:
my name is IGOR, not AIGOR

peenieman

:D
si si ora a letto anche io
domani a mente fresca provo a far andare la luminosità
grazie mille dei consigli e buonanotte
Il fare è il miglior modo d'imparare

peenieman

#24
May 03, 2013, 11:02 am Last Edit: May 03, 2013, 11:04 am by peenieman Reason: 1
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
Il fare è il miglior modo d'imparare

nid69ita

#25
May 03, 2013, 11:20 am Last Edit: May 03, 2013, 11:41 am by nid69ita Reason: 1
Migliorie: metti const e byte anche questi
Code: [Select]

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.
my name is IGOR, not AIGOR

peenieman

#26
May 03, 2013, 11:42 am Last Edit: May 03, 2013, 11:57 am by peenieman Reason: 1
:) 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  :smiley-eek: enon riesco a capire l'errore, eppure c'è da qualche parte :D

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

nid69ita

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.
my name is IGOR, not AIGOR

peenieman

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 :)
Il fare è il miglior modo d'imparare

nid69ita

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

Code: [Select]

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)
my name is IGOR, not AIGOR

Go Up