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
#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
}
}
ferdard:
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>
Ma il problema qual'è, mica ho capito. Quei due if non li hai messi tu?
Se si, vanno messi dentro l'if della decode
#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
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.
ti crei una variabile di stato vero/falso che si ricorda se il led lo avevi acceso o spento
oppure
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:
if ( results.value == 0x406 || results.value == 0x10406 ) { //tasto 6 sul telecomando
digitalWrite(ledPin, ! digitalRead(ledPin));
}
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.
ferdard:
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)