Per le differenze tra i due ricevitori puoi confrontare i relativi datasheet: TSOP1738, TSOP31238.
Un altro esempio di utilizzo può essere questo:
immagine schema
dove
R1: 10K[ch937]
R2, R3: 220[ch937]
Sketch:
/*
* Controllo di due led tramite telecomando IR.
*/
#include <IRremote.h>
int RECV_PIN = 3; //Pin su cui è connesso il ricevitore IR
int RED_LED_PIN = 9; //Pin del led rosso
int GREEN_LED_PIN = 8; //Pin del led verde
int BUTTON_PIN = 2; //Pin del bottone
int STATUS_RED = LOW; //Stato del led rosso
int STATUS_GREEN = LOW; //Stato del led verde
int RED_IR_CODE = 0xFFFF9867; //Codice per comandare il led rosso
int GREEN_IR_CODE = 0x58A7; //Codice per comandare il led verde
IRrecv irrecv(RECV_PIN); //Inizializza il pin del ricevitore IR
decode_results results; //Comando ricevuto dal ricevitore IR
/*
* Switcha lo stato "ledStatus" del led "ledpin", "count" volte,
* con una pausa, tra uno stato ed il successivo, "pause" millisecondi.
* Ritorna l'ultimo stato del led.
*/
int blinkled(int ledpin, int count, int ledStatus, int pause){
for (; count > 0; --count){
if(ledStatus == LOW)
ledStatus = HIGH;
else
ledStatus = LOW;
digitalWrite(ledpin, ledStatus);
delay(pause);
}
return ledStatus;
}
void setup()
{
Serial.begin(9600);
//Impostazione modalità dei pin
pinMode(RED_LED_PIN, OUTPUT);
pinMode(GREEN_LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT);
//Blink dei led
STATUS_RED = blinkled(RED_LED_PIN, 14, LOW, 50);
STATUS_GREEN = blinkled(GREEN_LED_PIN, 14, LOW, 50);
//Avvio della ricezione IR
irrecv.enableIRIn();
}
/*
* Riceve e ritorna il codice IR da associare al led "ledpin".
*/
int recIRCode(int ledpin){
int code = 0; //Codice ricevuto dal ricevitore IR
int statusLed; //Stato del led
//Accende il led ed esegue un blink
statusLed = blinkled(ledpin, 1, LOW, 0);
statusLed = blinkled(ledpin, 4, statusLed, 50);
while(code == 0) //Fin quando il codice ricevuto non è valido (0)
if (irrecv.decode(&results)){ //Riceve e decodifica il codice IR
//Se il codice è decodificabile dalla libreria ed il codice non è quello di REPEAT
if (results.decode_type != -1 && results.value != REPEAT){
code = results.value; //Codice ricevuto
Serial.print("rec code: ");
Serial.print(code, HEX);
Serial.print(" -> pin ");
Serial.println(ledpin);
statusLed = blinkled(ledpin, 5, statusLed, 50); //Blink del led
}
irrecv.resume(); //Riceve il valore successivo dall'IR
}
statusLed = blinkled(ledpin, 1, HIGH, 0); //Spegne il led
return code; //Ritorna il codice ricevuto
}
void loop() {
int code; //Codice IR ricevuto
//Se il pulsante di registrazione dei codice è stato premuto...
if (digitalRead(BUTTON_PIN) == HIGH){
//Spegne i led
STATUS_RED = blinkled(RED_LED_PIN, 1, HIGH, 0);
STATUS_GREEN = blinkled(GREEN_LED_PIN, 1, HIGH, 0);
//Rivece e memorizza i codici per il led rosso e verde
RED_IR_CODE = recIRCode(RED_LED_PIN);
GREEN_IR_CODE = recIRCode(GREEN_LED_PIN);
}
//Se è disponibile un segnale IR
if (irrecv.decode(&results)) {
code = results.value; //Memorizza il codice ricevuto
Serial.print(code, HEX);
if (code == REPEAT) //Codice relativo ad un bottone non ancora rilasciato
Serial.print(" [repeat code]");
if (code == RED_IR_CODE){ //Codice associato al led rosso
Serial.print(": switch red led : pin ");
Serial.print(RED_LED_PIN);
STATUS_RED = blinkled(RED_LED_PIN, 1, STATUS_RED, 0); //Switcha lo stato del led rosso
}
//senza else consente di usare un bottone per più led
if (code == GREEN_IR_CODE){ //Codice associato al led verde
Serial.print(": switch green led : pin ");
Serial.print(GREEN_LED_PIN);
STATUS_GREEN = blinkled(GREEN_LED_PIN, 1, STATUS_GREEN, 0); //Switcha lo stato del led verde
}
if(results.decode_type == -1){ //Codice non decodificabile dalla libreria
//Mostra il codice raw su serial
unsigned int rawCodes[RAWBUF];
Serial.println(": UNKNOW code");
Serial.print("\traw len: ");
Serial.print(results.rawlen);
Serial.print("\n\traw buf: ");
int codeLen = results.rawlen - 1;
for (int i = 1; i <= codeLen; i++) {
if (i % 2) {
// Mark
rawCodes[i - 1] = results.rawbuf[i]*USECPERTICK - MARK_EXCESS;
Serial.print(" m");
}
else {
// Space
rawCodes[i - 1] = results.rawbuf[i]*USECPERTICK + MARK_EXCESS;
Serial.print(" s");
}
Serial.print(rawCodes[i - 1], DEC);
}
Serial.println("");
}
irrecv.resume(); //Riceve il prossimo valore IR
Serial.println();
}
}
Il bottone è usato per avviare le associazioni dei tasti del telecomando ai led.
E' possibile associare anche lo stesso tasto ad entrambi i led.