Risolto: Utilizzo ricevitore IR

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.

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:
  if ( results.value == 0x406 ||  results.value == 0x10406 ) { //tasto 6 sul telecomando
      digitalWrite(ledPin, ! digitalRead(ledPin));  
    }

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

grazie

Non capisco perché non dovresti usare il ciclo if. Usa lo switch case allora.

Ho provato anche con switch...
ma niente!

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

#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

Il codice va nei tag (usa tasto con #)

A me così funziona:

#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();
  }
}

Ciao nid, ho risolto, grazie.

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

digitalWrite(ledPin, HIGH); 
    delay (1000); 
    digitalWrite(ledPin, LOW);

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

const byte receiverPin = 11; 
const byte ledPin=7;

il precedente sketch era impostato in questo modo:

int receiver = 11;

Grazie

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) :grin: