Go Down

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

nid69ita

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

1. aggiungi tra le variabili questo
Code: [Select]
unsigned long previousMillis=0;

2. aggiungi al fondo nella loop() questo (le prime tre graffe chiuse e l'ultima le hai già)
Code: [Select]

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

peenieman

aggiunto modo5 come suggerito e funziona
un altro problema di codice è che anche quando spento accetta i comandi dati e cambia modo
Il fare è il miglior modo d'imparare

nid69ita

#32
May 03, 2013, 03:21 pm Last Edit: May 03, 2013, 03:40 pm by nid69ita Reason: 1
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
Code: [Select]

...
 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:
Code: [Select]
byte fade = 5;     // deve essere 5
my name is IGOR, not AIGOR

peenieman

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

nid69ita

#34
May 03, 2013, 03:43 pm Last Edit: May 03, 2013, 03:47 pm by nid69ita Reason: 1
Aggiunto modo 6 per il fade e distinto modo5/6 con switch invece che if.  Prime 3 graffe e ultima le hai già
Code: [Select]

     }  // 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:
Code: [Select]

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

peenieman

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

nid69ita

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

nid69ita

#37
May 03, 2013, 05:05 pm Last Edit: May 03, 2013, 05:13 pm by nid69ita Reason: 1
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
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 - 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
my name is IGOR, not AIGOR

peenieman

Sto provando a fare tutte le modifiche ma c'è sempre qualcosa che sbaglio, con questo codice ad esempio non si spegne più
Code: [Select]
/*
                  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 :D
Il fare è il miglior modo d'imparare

peenieman

#39
May 03, 2013, 07:35 pm Last Edit: May 03, 2013, 10:36 pm by peenieman Reason: 1
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
Code: [Select]
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
Code: [Select]
if(modo<5) lumi=255; è diventato
Code: [Select]
if(modo<5) lumi;

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

nid69ita

#40
May 03, 2013, 11:35 pm Last Edit: May 03, 2013, 11:45 pm by nid69ita Reason: 1
1.Non ha senso. Non vuol dire nulla.   :smiley-eek-blue:

è diventato
Code: [Select]
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) !!!
my name is IGOR, not AIGOR

peenieman

#41
May 04, 2013, 12:04 am Last Edit: May 04, 2013, 12:19 am by peenieman Reason: 1
però così modificato funziona, come era prima non funzionava
in effetti sembra che ci sia qualcosa che non torna

Il fare è il miglior modo d'imparare

nid69ita


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  :smiley-eek:


Per la variabile PP, dichiarala     boolean PP=false;

poi dove usi PP   metti invece di HIGH->true e di LOW->false
my name is IGOR, not AIGOR

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

nid69ita


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?!?!?!   :smiley-mr-green:
my name is IGOR, not AIGOR

Go Up