Go Down

Topic: Aiuto per codice comunicazione IR -RISOLTO- (Read 7067 times) previous topic - next topic

jacopo99

Apr 11, 2013, 09:20 pm Last Edit: Sep 20, 2013, 07:31 pm by jacopo99 Reason: 1
Ciao a tutti sono nuovo del forum.
Premetto che ho 13 anni  :smiley-red: quindi vi prego di non insultarmi nel caso non capissi le cose al volo...
Ho già fatto diversi progetti e adesso mi sono messo sotto per modificare un codice che mi permetteva all'inizio solo di accendere un paio di led utilizzando un telecomando ir e opportuno ricevitore, fin quì tutto ok.
Dopodichè ho inserito un altro codice (opportunamente adattato) che mi permette di accendere in led in sequenza (effetto knight rider) solo che ogni volta che arriva alla fine non ripete il codice ma devo ri-premere il pulsante sul telecomando; innanzitutto vorrei sapere se fosse possibile ripetere questo fino a quando io non gli dico stop.
Inoltre non potevo non mettere la funzione che aumenta e diminuisce la velocità (sempre tramite telecomando) e dopo un'intero pomeriggio sono riuscito a fare qualcosa che funziona ma purtroppo devo aspettare che termini l'effetto scia mentre mi chiedevo se fosse possibile modificarlo mentre andava avanti-indietro.
Un grande grazie a chiunque sappia rispondermi correttamente  :)

ps: dimenticavo il codice è allegato qui sotto
pps: temporaneamente per l'effetto luci ho "risolto" inserendone una decina... XD


Codice funzionante; ringrazio il forum per il sostegno dato a questo progettino(lo potete trovare anche alla prossima pagina):

Code: [Select]
#include <IRremote.h>



int RECV_PIN = 13;
IRrecv irrecv(RECV_PIN);
decode_results results;
String stato;
int pinArray[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
int count = 0;
int timer = 9;
int statoA=0;
int statoB=0;
int statoC=0;
void setup()
{
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  for (count=2;count<13;count++) {
    pinMode(pinArray[count], OUTPUT);
  }
}


void loop() {
  if (irrecv.decode(&results)) {
     Serial.println(results.value);
 
   if(stato = "kitt"){
    statoC=1;
    }
    if(results.value == 551520375){
    stato = "acceso1";
   
    }
    else if (results.value == 551504055) {
    stato = "acceso2";
    }
    else if (results.value == 551536695) {
    stato = "acceso3";
    }
    else if (results.value == 551495895) {
    stato = "acceso4";
    }
    else if (results.value == 551528535) {
    stato = "acceso5";
    }
    else if (results.value == 551512215) {
    stato = "acceso6";
    }
    else if (results.value == 551544855) {
    stato = "acceso7";
    }
    else if (results.value == 551491815) {
    stato = "acceso8";
    }
    else if (results.value == 551524455) {
    stato = "acceso9";
    }
    else if (results.value == 551486205) {
    stato = "acceso10";
    }
     else if (results.value == 551518845) {
    stato = "acceso11";
    }
    else if (results.value == 551536185) {
    stato = "mantieniacceso";
    }
    else if (results.value == 551505585) {
    stato = "kitt";
    }
    else if (results.value == 551519865) {
    stato = "spento";
    }
    else if (results.value == 551534655)  {
    stato = "velocità+1";
   
    }
    else if (results.value == 551502015) {
    stato = "velocità-1";
    };
   
    if(stato == "acceso1"){
    digitalWrite(2, HIGH);
    }
    else if (stato == "acceso2") {
    digitalWrite(3, HIGH);
    }
    else if (stato == "acceso3") {
    digitalWrite(4, HIGH);
    }
    else if (stato == "acceso4") {
    digitalWrite(5, HIGH);
    }
    else if (stato == "acceso5") {
    digitalWrite(6, HIGH);
    }
    else if (stato == "acceso6") {
    digitalWrite(7, HIGH);
    }
    else if (stato == "acceso7") {
    digitalWrite(8, HIGH);
    }
    else if (stato == "acceso8") {
    digitalWrite(9, HIGH);
    }
    else if (stato == "acceso9") {
    digitalWrite(10, HIGH);
    }
    else if (stato == "acceso10") {
    digitalWrite(11, HIGH);
    }
    else if (stato == "acceso11") {
    digitalWrite(12, HIGH);
    }
     
       else if (stato == "velocità+1") {
    timer++;
    }
    else if (stato == "velocità-1") {
    timer-=timer-1;
    }

    else if (stato == "mantieniacceso") {
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(8, HIGH);
    digitalWrite(9, HIGH);
    digitalWrite(10, HIGH);
    }
else{
if ((statoC==1)&&(statoA==0)){
statoB=1-statoB;
delay(10);
}
statoA=statoC;
if(statoB==1){
for (count=2;count<13;count++)
    {
   digitalWrite(pinArray[count], HIGH);
   delay(timer);
   digitalWrite(pinArray[count + 1], HIGH);
   delay(timer);
   digitalWrite(pinArray[count], LOW);
   delay(timer*2);
  }
  for (count=13;count>2;count--) {
   digitalWrite(pinArray[count], HIGH);
   delay(timer);
   digitalWrite(pinArray[count - 1], HIGH);
   delay(timer);
   digitalWrite(pinArray[count], LOW);
   delay(timer*2);
  }
  }
}
if ((statoC==1)&&(statoA==1)){
statoB=0;
delay(10);
}
statoA=statoC;
if(statoB==0){
digitalWrite(pinArray[count], LOW);
}else{

   if (stato == "spento") {
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);
    digitalWrite(10, LOW);
    digitalWrite(11, LOW);
    digitalWrite(12, LOW);
    };   

  }
  irrecv.resume(); // Receive the next value

}
}

leo72

Ciao e benvenuto.
Non ho guardato tutto il codice ma forse non ti ripete il ciclo perché non glielo dici.
Mi spiego, se vuoi che una cosa venga fatta ciclicamente, devi inserire nel codice un ciclo tipo il do..while, che esce da un blocco di codice solo al verificarsi di una certa condizione.
Quindi tu potresti rivedere il tuo programma e far sì che, arrivato il comando del telecomando che attiva l'effetto Supercar, entrare in un ciclo dove viene creato l'effetto del led e dove viene costantemente letto il led iR per vedere se arriva nuovamente il comando dal telecomando. In questo caso esci dal ciclo.

jacopo99

#2
Apr 12, 2013, 07:41 pm Last Edit: Apr 12, 2013, 07:43 pm by jacopo99 Reason: 1
Ciao
Grazie innanzitutto per la risposta  ;)
Quindi se non ho capito male devo modificare il codice da così:

Code: [Select]
else if (stato == "kitt") {

    for (count=0;count<10;count++) {
  digitalWrite(pinArray[count], HIGH);
  delay(timer);
  digitalWrite(pinArray[count + 1], HIGH);
  delay(timer);
  digitalWrite(pinArray[count], LOW);
  delay(timer*2);
 }
 for (count=10;count>0;count--) {
  digitalWrite(pinArray[count], HIGH);
  delay(timer);
  digitalWrite(pinArray[count - 1], HIGH);
  delay(timer);
  digitalWrite(pinArray[count], LOW);
  delay(timer*2);
 }
   }


a così:

Code: [Select]
  else if (stato == "kitt") {

    do
{
 delay(50);          // wait for sensors to stabilize
   
    for (count=0;count<10;count++) {
  digitalWrite(pinArray[count], HIGH);
  delay(timer);
  digitalWrite(pinArray[count + 1], HIGH);
  delay(timer);
  digitalWrite(pinArray[count], LOW);
  delay(timer*2);
 }
 for (count=10;count>0;count--) {
  digitalWrite(pinArray[count], HIGH);
  delay(timer);
  digitalWrite(pinArray[count - 1], HIGH);
  delay(timer);
  digitalWrite(pinArray[count], LOW);
  delay(timer*2);
 }
   }
   } while (x < 100);


Solo che non credo sia giusto... :smiley-roll:

leo72

Il for è un ciclo che viene ripetuto un certo numero di volte.
I cicli do..while invece finché non si verifica una certa condizione.
Tu però stai dando una condizione che non capisco, while (x<100):
1) dov'è che inizializzi x al valore di partenza
2) dov'è che incrementi x

Io intendevo una cosa tipo questa (premetto che non so da dove prelevi "stato" per cui io faccio finta che ci sia una funzione che si chiami leggiStato:

Code: [Select]
else if (stato == "xxxx") {
  do {
    ...tuo codice
  } while (leggiStato != "uscita");

esegui l'if, è vero, entri nel do..while.
Ripeti il ciclo finché non leggi dal telecomando il codice per uscire.
Non era questo che volevi?

jacopo99

Si mi sono accorto che avevo sbagliato...
Comunque è come dici te adesso aggiorno il codice e poi ti dico

jacopo99


Si mi sono accorto che avevo sbagliato...
Comunque è come dici te adesso aggiorno il codice e poi ti dico

ho appena provato inserendolo così:
Code: [Select]
else if (stato == "kitt") {
   do {
     for (count=0;count<10;count++) {
   digitalWrite(pinArray[count], HIGH);
   delay(timer);
   digitalWrite(pinArray[count + 1], HIGH);
   delay(timer);
   digitalWrite(pinArray[count], LOW);
   delay(timer*2);
  }
  for (count=10;count>0;count--) {
   digitalWrite(pinArray[count], HIGH);
   delay(timer);
   digitalWrite(pinArray[count - 1], HIGH);
   delay(timer);
   digitalWrite(pinArray[count], LOW);
   delay(timer*2);
}
}while (stato == "spegni");

}

 
   
    irrecv.resume(); // Receive the next value
  }
}


solo che rimane uguale a prima!
Quindi ho provato a cambiare diverse volte le posizioni delle graffe ma niente  =(

leo72

Devi aggiornare "stato", altrimenti non esci dal while.
Metti nel ciclo la lettura di quella variabile, te l'avevo specificato nel precedente post.

jacopo99

Dopo aver lasciato un attimo il progetto in standby ieri sera l'ho ripreso, inserito il while (sono riuscito ad implementarlo perfettamente) e fino qui tutto ok.
Mando il codice ad arduino provo ma..... mi  rimane costante l'effetto scia!
quindi volevo sapere come devo esprimergli la condizione per uscire :smiley-sweat:
ecco quì il codice finale:
Code: [Select]
  else if (stato == "kitt")
 {do
 {for (count=2;count<13;count++)  
   {
  digitalWrite(pinArray[count], HIGH);
  delay(timer);
  digitalWrite(pinArray[count + 1], HIGH);
  delay(timer);
  digitalWrite(pinArray[count], LOW);
  delay(timer*2);
 }
 for (count=13;count>2;count--) {
  digitalWrite(pinArray[count], HIGH);
  delay(timer);
  digitalWrite(pinArray[count - 1], HIGH);
  delay(timer);
  digitalWrite(pinArray[count], LOW);
  delay(timer*2);
 }
 }
 while (stato == "kitt");  
}

Erik86

Ciao Jacopo, facciamo finta che di avere un interruttore, questo ha due posizioni 0/1 quando è a 1 La luce si accende e quando è a 0 La luce si spegne.
Tu ad Arduino gli stai dicendo, quando stato== kitt fai questo figlio, ma nn lo puoi fermare dicendogli nuovamente stato==kitt..
Giusto?
Adesso sono di fretta più tradì ti mandi lo sketch.. ;)

jacopo99

Infatti anchio mi ero immaginato questa cosa ma non ho idea su come rappresentarla in codice.
Aspetto sua risposta

zoomx

Jacopo, intanto complimenti per aver iniziato così presto.

Tornando al tuo problema. Tu vuoi realizzare un qualcosa che deve fare... 2 cose contemporaneamente. Hai la tua scia che va avanti e indietro e contemporaneamente devi vedere se non ci siano nuovi comandi in arrivo. Ci sono diversi modi per fare ciò.

Un modo potrebbe essere usando un interrupt con timer. Interrupt significa più o meno interrompere, nel nostro caso nel micro quando si verifica un evento, ce ne sono diversi, il cambio di stato su un piedino oppure un determinato conteggio su un timer che arriva alla fine, il micro viene interrotto qualsiasi cosa faccia e viene eseguita la funzione di gestione dell'interrupt.

Un altro modo è quello di usare due funzioni, una per gestire i comandi e l'altra che gestisce i led, che vengono eseguite ciclicamente e che comunicano fra loro, ad esempio la velocità del led che si muove, tramite variabili comuni.

Ci sono altri modi ma se te li dico tutti non credo faccio bene perché per una buon programma, secondo me, prima bisogna pensare bene cosa si vuol fare per poi non finire in vicoli ciechi e poi bisogna anche imparare a pensare per risolvere problemi.

Erik86

prima di tutto non darmi del lei.. :)

intanti ti crei due variabili ipotiziamo,
int statoA=0;
int statoB=0;
poi passiamo allo sketch:
////////////////////////////////////////////////////////////////////////////////
}else{
if ((stato == "kitt")&&(statoA==LOW)){
statoB=1-statoB;
delay(10);
}
statoA=stato;
if(statoB==1){
for (count=2;count<13;count++) 
    {
   digitalWrite(pinArray[count], HIGH);
   delay(timer);
   digitalWrite(pinArray[count + 1], HIGH);
   delay(timer);
   digitalWrite(pinArray[count], LOW);
   delay(timer*2);
  }
  for (count=13;count>2;count--) {
   digitalWrite(pinArray[count], HIGH);
   delay(timer);
   digitalWrite(pinArray[count - 1], HIGH);
   delay(timer);
   digitalWrite(pinArray[count], LOW);
   delay(timer*2);
  }
  }
}else{
if ((stato == "kitt")&&(statoA==HIGH)){
statoB=0;
delay(10);
}
statoA=stato;
if(statoB==0){
digitalWrite(pinArray[count], LOW);
}
}
}
/////////////////////////////////////////////////////////////////////
non l'ho verificato ma prova a vedere se funzia..ho preso sponto da un'esempio che ce nel manuale primi passi..

Erik86

ho tralasciato un cosa importante; che valore ha kitt?

jacopo99

In che senso "che valore ha"?

codice completo:
Code: [Select]
#include <IRremote.h>

int RECV_PIN = 13;
IRrecv irrecv(RECV_PIN);
decode_results results;
String stato;
int pinArray[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
int count = 0;
int timer = 9;
void setup()
{
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  for (count=2;count<13;count++) {
    pinMode(pinArray[count], OUTPUT);
  }
}


void loop() {
  if (irrecv.decode(&results)) {
     Serial.println(results.value);
   
    if(results.value == 551520375){
    stato = "acceso1";
   
    }
    else if (results.value == 551504055) {
    stato = "acceso2";
    }
    else if (results.value == 551536695) {
    stato = "acceso3";
    }
    else if (results.value == 551495895) {
    stato = "acceso4";
    }
    else if (results.value == 551528535) {
    stato = "acceso5";
    }
    else if (results.value == 551512215) {
    stato = "acceso6";
    }
    else if (results.value == 551544855) {
    stato = "acceso7";
    }
    else if (results.value == 551491815) {
    stato = "acceso8";
    }
    else if (results.value == 551524455) {
    stato = "acceso9";
    }
    else if (results.value == 551486205) {
    stato = "acceso10";
    }
     else if (results.value == 551518845) {
    stato = "acceso11";
    }
    else if (results.value == 551536185) {
    stato = "mantieniacceso";
    }
    else if (results.value == 551505585) {
    stato = "kitt";
    }
    else if (results.value == 551519865) {
    stato = "spento";
    }
    else if (results.value == 551534655)  {
    stato = "velocità+1";
   
    }
    else if (results.value == 551502015) {
    stato = "velocità-1";
    };
   
    if(stato == "acceso1"){
    digitalWrite(2, HIGH);
    }
    else if (stato == "acceso2") {
    digitalWrite(3, HIGH);
    }
    else if (stato == "acceso3") {
    digitalWrite(4, HIGH);
    }
    else if (stato == "acceso4") {
    digitalWrite(5, HIGH);
    }
    else if (stato == "acceso5") {
    digitalWrite(6, HIGH);
    }
    else if (stato == "acceso6") {
    digitalWrite(7, HIGH);
    }
    else if (stato == "acceso7") {
    digitalWrite(8, HIGH);
    }
    else if (stato == "acceso8") {
    digitalWrite(9, HIGH);
    }
    else if (stato == "acceso9") {
    digitalWrite(10, HIGH);
    }
    else if (stato == "acceso10") {
    digitalWrite(11, HIGH);
    }
    else if (stato == "acceso11") {
    digitalWrite(12, HIGH);
    }
     
       else if (stato == "velocità+1") {
    timer++;
    }
    else if (stato == "velocità-1") {
    timer-=timer-1;
    }

    else if (stato == "mantieniacceso") {
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(8, HIGH);
    digitalWrite(9, HIGH);
    digitalWrite(10, HIGH);
    }
   else if (stato == "kitt")
  {do
  {for (count=2;count<13;count++) 
    {
   digitalWrite(pinArray[count], HIGH);
   delay(timer);
   digitalWrite(pinArray[count + 1], HIGH);
   delay(timer);
   digitalWrite(pinArray[count], LOW);
   delay(timer*2);
  }
  for (count=13;count>2;count--) {
   digitalWrite(pinArray[count], HIGH);
   delay(timer);
   digitalWrite(pinArray[count - 1], HIGH);
   delay(timer);
   digitalWrite(pinArray[count], LOW);
   delay(timer*2);
  }
   
  }
  while (stato == "kitt"); 
}


   
    else if (stato == "spento") {
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);
    digitalWrite(10, LOW);
    digitalWrite(11, LOW);
    digitalWrite(12, LOW);
    };   
   
   
   
    irrecv.resume(); // Receive the next value
  }
}

Erik86

ok adesso la cosa è un po più chiara;
crea una terza variabile:
int statoA=0;
int statoB=0;
int statoC=0;

poi dopo void loop(); scrivi:
if(stato=kitt){
statoC=1;
}
////////////////////////////////////////////////////////////////////////////////
}else{
if ((statoC==1)&&(statoA==0)){
statoB=1-statoB;
delay(10);
}
statoA=statoC;
if(statoB==1){
for (count=2;count<13;count++)
    {
   digitalWrite(pinArray[count], HIGH);
   delay(timer);
   digitalWrite(pinArray[count + 1], HIGH);
   delay(timer);
   digitalWrite(pinArray[count], LOW);
   delay(timer*2);
  }
  for (count=13;count>2;count--) {
   digitalWrite(pinArray[count], HIGH);
   delay(timer);
   digitalWrite(pinArray[count - 1], HIGH);
   delay(timer);
   digitalWrite(pinArray[count], LOW);
   delay(timer*2);
  }
  }
}else{
if ((statoC==1)&&(statoA==1)){
statoB=0;
delay(10);
}
statoA=statoC;
if(statoB==0){
digitalWrite(pinArray[count], LOW);
}
}
}
/////////////////////////////////////////////////////////////////////
prova!!!! :smiley-roll-sweat:

Go Up