Go Down

Topic: Risolto: Utilizzo ricevitore IR (Read 775 times) previous topic - next topic

ferdard

Jul 06, 2013, 04:27 pm Last Edit: Jul 07, 2013, 11:19 am by ferdard Reason: 1
Salve Amici,
sto provando ad utilizzare un ricevitore IR, sono riuscito a recuperare uno sketch in rete (dal sito di Mauro Alfieri), solo che non riesco a capire il funzionamento, mi spiego meglio, ho capito come identificare i vari codici inviati dal telecomando, e come utilizzare un comando che alla pressione di un tasto accende un led e lo spegne alla pressione di un altro tasto, ma nello sketch ci sono una serie di comandi che non ho capito. Non posso utilizzare normalmente il comando digitalRead per dire ad Arduini di eseguire un comando quando riceve un codice preciso dal ricevitore?
considerando che voglio che un solo comando effettui una solo azione, come posso eliminare gli "if"?

spero di essere stato chiaro.

grazie

Code: [Select]
#include <IRremote.h> // use the library
int receiver = 11; // pin 1 of IR receiver to Arduino digital pin 11
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results;

void setup()
{
 Serial.begin(9600); // for serial monitor output
 irrecv.enableIRIn(); // Start the receiver
 pinMode(9, OUTPUT); // Pin 9 output
}
void loop()
{
 if (irrecv.decode(&results)) // have we received an IR signal?
 {
   Serial.println(results.value, HEX); // display it on serial monitor in hexadecimal
   irrecv.resume();// receive the next value
 }

 if ( results.value == 0x406 ||  results.value == 0x10406 ){ //tasto 6 sul telecomando
   digitalWrite(9, HIGH);   // set the LED on
 }
if ( results.value == 0x404 ||  results.value == 0x10404 ){ //tasto 4 sul telecomando
   digitalWrite(9, LOW);   // set the LED 0ff
 }
}




llluca


non ho capito. Non posso utilizzare normalmente il comando digitalRead per dire ad Arduini di eseguire un comando quando riceve un codice preciso dal ricevitore?

Ciao
Purtroppo ti serve una libreria che sia capace di "leggere" il codice che il tuo trasmettirore Ir emette
libreria da me usata è appunto:
#include <IRremote.h>

nid69ita

Ma il problema qual'è, mica ho capito. Quei due if non li hai messi tu?
Se si, vanno messi dentro l'if della decode
Code: [Select]

#include <IRremote.h> // use the library

const byte receiverPin = 11; // pin 1 of IR receiver to Arduino digital pin 11
const byte ledPin = 9;
IRrecv irrecv(receiverPin); // create instance of 'irrecv'
decode_results results;

void setup()
{ delay(1000);
  Serial.begin(9600); // for serial monitor output
  irrecv.enableIRIn(); // Start the receiver
  pinMode(ledPin, OUTPUT); // Pin 9 output
}
void loop()
{ if (irrecv.decode(&results)) // have we received an IR signal?
  {
    //Serial.println(results.value, HEX); // display it on serial monitor in hexadecimal
    if ( results.value == 0x406 ||  results.value == 0x10406 ) { //tasto 6 sul telecomando
      digitalWrite(ledPin, HIGH);   // set the LED on
    }
    if ( results.value == 0x404 ||  results.value == 0x10404 ) { //tasto 4 sul telecomando
      digitalWrite(ledPin, LOW);   // set the LED 0ff
    }
    irrecv.resume();// receive the next value
  }  //endif decode
}  // endloop
my name is IGOR, not AIGOR

ferdard

Ciao nid,
lo sketch che ho postato è preso da internet, con questo sketch, un led si accede quando riceve un codice e si spegne quando ne riceve un altro.
Io vorrei adeguare lo sketch in modo che con un solo codice ricevuto accenda un led e poi con un delay lo spegne.

ho provato ad eliminare la parte "if" ma così non mi funziona più lo sketch.

nid69ita

Ah, okay.
Due modi.
1. ti crei una variabile di stato vero/falso che si ricorda se il led lo avevi acceso o spento
oppure
2. più semplice, puoi anche leggere lo stato del led (in realtà puoi sapere se c'e' high/low sul pin) e con ! lo inverti ( ! => not )
Tieni solo uno degli if e poi:
Code: [Select]

  if ( results.value == 0x406 ||  results.value == 0x10406 ) { //tasto 6 sul telecomando
      digitalWrite(ledPin, ! digitalRead(ledPin)); 
    }
my name is IGOR, not AIGOR

ferdard

ho provato ad inserire la stringa che hai postato ma non cambia nulla.
Potresti darmi qualche indicazione in più...

grazie

anerDev

Non capisco perché non dovresti usare il ciclo if. Usa lo switch case allora.
Andrea
<a href="http://anerdev.net">anerDev.net</a>

ferdard

#7
Jul 07, 2013, 09:51 am Last Edit: Jul 07, 2013, 10:44 am by leo72 Reason: 1
Ho provato anche con switch...
ma niente!

Non riesco a capire perchè non segue il comando di aspettare e poi spegnere il led

Code: [Select]
#include <IRremote.h>
int receiver = 11;
IRrecv irrecv(receiver);
decode_results results;

void setup()
{
 Serial.begin(9600);
 irrecv.enableIRIn();
 pinMode(7, OUTPUT);
}
void loop()
{
 if (irrecv.decode(&results))
 {
   Serial.println(results.value, HEX);
   irrecv.resume();
 }

 if ( results.value == 0x800F040D )
 {
   
   digitalWrite(7, HIGH);
   delay (1000);
   digitalWrite(7, LOW);
}
 

}


edit by mod: per favore includere il codice usando gli appositi tag

nid69ita

Il codice va nei tag (usa tasto con #)

A me così funziona:
Code: [Select]

#include <IRremote.h>

const byte receiverPin = 11;
const byte ledPin=7;
IRrecv irrecv(receiverPin);
decode_results results;

void setup()
{ delay(1000);
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(ledPin, OUTPUT);
}

void loop()
{ if (irrecv.decode(&results))
  { if ( results.value == 0xFFC837 ) // 0x800F040D )
    {  digitalWrite(ledPin, ! digitalRead(ledPin) );
    }
    //Serial.println(results.value, HEX);
    irrecv.resume();
  }
}
my name is IGOR, not AIGOR

ferdard

#9
Jul 07, 2013, 10:50 am Last Edit: Jul 07, 2013, 11:19 am by ferdard Reason: 1
Ciao nid, ho risolto, grazie.

il codice che hai postato, comunque non mi funzionava, ho dovuto modificare in questo modo:

Code: [Select]
digitalWrite(ledPin, HIGH);
   delay (1000);
   digitalWrite(ledPin, LOW);


credo che quello che ha fatto funzionare il codice sia questo:

Code: [Select]
const byte receiverPin = 11;
const byte ledPin=7;


il precedente sketch era impostato in questo modo:


Code: [Select]
int receiver = 11;


Grazie

leo72

E' una finezza logica usare const byte al posto di int per dichiarare un pin: si risparmia un byte di SRAM (byte = 1 byte // int = 2 byte) e si evita che per sbaglio nel codice quella variabile possa venir cambiata (const). Ma ai fini del funzionamento del programma non cambia nulla. L'errore era da qualche altra parte.

nid69ita


Io vorrei adeguare lo sketch in modo che con un solo codice ricevuto accenda un led e poi con un delay lo spegne.


Pardon, mi ero perso. Il mio accende/spegne con lo stesso tasto, non spegneva dopo un tempo di delay.
L'errore secondo me era che i vari if li facevi fuori dalla if (irrecv.decode(&results)) (come ti avevo già segnalato)  :smiley-mr-green:
my name is IGOR, not AIGOR

Go Up