led con telecomando

Ciao a tutti,
sono nuovo nel mondo di arduino, ho incominciato a fare piccoli progetti e bene o male sono riuscito a portarli a termine, adesso sto mettendo in piedi un progetto per accendere un led con il telecomando della mia tv samsung e ho cercato su internet e non ne sono venuto a capo. Vi allego il codice che ho inserito in arduino uno. (progetto trovato su internet)

// Visualizza il tipo di telecomando NEC, SONY, RC5, RC6, o UNKNOWN
// sul display LCD e il codice ricevuto

#include <IRremote.h> // Libreria per ricevere IR      
#include <LiquidCrystal.h> // Libreria per usare il display
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int RECV_PIN = 1; // Piedino ricezione IR
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{


  irrecv.enableIRIn(); // Inizia a ricevere
}

void loop() {
  lcd.setCursor(0,0);
  if (irrecv.decode(&results)) {
    if (results.decode_type == NEC) {
      lcd.print("NEC: ");
    } else if (results.decode_type == SONY) {
      lcd.print("SONY: ");
    } else if (results.decode_type == RC5) {
      lcd.print("RC5: ");
    } else if (results.decode_type == RC6) {
      lcd.print("RC6: ");
    } else if (results.decode_type == UNKNOWN) {
      lcd.print("UNKNOWN: ");
    }
    lcd.print(results.value, HEX);
    lcd.print("          ");
    irrecv.resume(); // Riceve il prossimo valore
  }
}

Fatto questo quando premo un tasto del telecomando sul display appare il codice come per esempio “UNKNOWN: E13DDA2” (tasto 1)

A questo punto vorrei far accendere un led rosso che è collegato sul pin 9 di arduino uno premendo il tasto 1 e farlo spegnere premendo il tasto 2.

Qualcuno è così gentile di spiegarmi come continuare a compilare il programma?

Grazie

ir_telecomando.ino (1.09 KB)

Ciao, intanto racchiudi il codice tra i tag "code" così diventa più leggibile nel post. Per proseguire, una volta che conosci i due valori associati ai pulsanti uno e due, subito dopo la lettura puoi ricorrere a switch case, è molto semplice da implementare e ti permette di gestire quanti pulsanti vuoi associando ad ognuno una funzione. Guardatelo sul Playground, vedrai, lo impari in pochi secondi. :)

Unknow vuol dire che il telecomando non è del tipo riconosciuto dalla libreria.

Da dove hai scaricato la libreria?

A questo link sembra che ci sia una versione modificata che riconosce i samsung (l’originale no) (del 2011)

Libreria originale: (del 2009)

grazie pe r le risposte, ho caricato anche la libreria che mi avete consigliato ma non ho capito la questione dello switch case, chiedo scusa ma di arduino conosco poco e niente. Sono andato sul sito che mi avete indicato e ho trovato solo questo:

/*
 * IRrecord: record and play back IR signals as a minimal 
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * An IR LED must be connected to the output PWM pin 3.
 * A button must be connected to the input BUTTON_PIN; this is the
 * send button.
 * A visible LED can be connected to STATUS_PIN to provide status.
 *
 * The logic is:
 * If the button is pressed, send the IR code.
 * If an IR code is received, record it.
 *
 * Version 0.11 September, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */

#include <IRremote.h>

#define led1 9
#define led2 10
#define led3 6

int RECV_PIN = 5;
int BUTTON_PIN = 7;
int STATUS_PIN = 13;
int r = 0;
int g = 0;
int b = 0;
IRrecv irrecv(RECV_PIN);
IRsend irsend;


int fading = 0; // se = 1 effetti luminosi

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  pinMode(BUTTON_PIN, INPUT);
  pinMode(STATUS_PIN, OUTPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
}

// Storage for the recorded code
int codeType = -1; // The type of code
unsigned long codeValue; // The code value if not raw
unsigned int rawCodes[RAWBUF]; // The durations if raw
int codeLen; // The length of the code
int toggle = 0; // The RC5/6 toggle state

// Stores the code for later playback
// Most of this code is just logging
void storeCode(decode_results *results) {
  codeType = results->decode_type;
  int count = results->rawlen;
  if (codeType == UNKNOWN) {
    Serial.println("Received unknown code, saving as raw");
    codeLen = results->rawlen - 1;
    // To store raw codes:
    // Drop first value (gap)
    // Convert from ticks to microseconds
    // Tweak marks shorter, and spaces longer to cancel out IR receiver distortion
    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("");
  }
  else {
    if (codeType == NEC) {
      Serial.print("Received NEC: ");
      if (results->value == REPEAT) {
        // Don't record a NEC repeat value as that's useless.
        Serial.println("repeat; ignoring.");
        return;
      }
    } 
    else if (codeType == SONY) {
      Serial.print("Received SONY: ");
    } 
    else if (codeType == RC5) {
      Serial.print("Received RC5: ");
    } 
    else if (codeType == RC6) {
      Serial.print("Received RC6: ");
    } 
    else {
      Serial.print("Unexpected codeType ");
      Serial.print(codeType, DEC);
      Serial.println("");
    }
    Serial.println(results->value, HEX);
    codeValue = results->value;
    codeLen = results->bits;
  }
}

int lastButtonState;

void loop() {
  if (fading == 1) {
      analogWrite(led1,r);
      r=r+random(5);      
        r=r-random(5);
      delay(10);
      analogWrite(led2,g);
       g=g+random(5);
           g=g-random(5);
      delay(15);     
      analogWrite(led3,b);
       b=b+random(5);
           b=b-random(5);
      delay(5);
      Serial.println("random");


  }



  if (irrecv.decode(&results)) {
    digitalWrite(STATUS_PIN, HIGH);
    storeCode(&results);
    //Serial.println(results->value,HEX);
    if (codeValue == 0xA16EC03F) {
      analogWrite(led1,0);
      analogWrite(led2,0);
      analogWrite(led3,0);
      Serial.println("spento");
    }
    if (codeValue == 0xA16E34CB) {
      fading = 0;
      analogWrite(led1,255);
      analogWrite(led2,0);
      analogWrite(led3,0);
      Serial.println("r");
    }
    if (codeValue == 0xA16ED42B) {
      fading = 0;
      analogWrite(led1,0);
      analogWrite(led2,255);
      analogWrite(led3,0);
      Serial.println("g");
    }
    if (codeValue == 0xA16E54AB) {
      fading = 0;
      analogWrite(led1,0);
      analogWrite(led2,0);
      analogWrite(led3,255);
      Serial.println("b");
    }
     if (codeValue == 0xA16E0CF3) {
        fading = 1- fading;
    }

    irrecv.resume(); // resume receiver
    digitalWrite(STATUS_PIN, LOW);
  }

}

Ma non riesco a capire come devo modificare il mio codice in modo da accendere il led.

Grazie ancora per la Vostra disponibilità.

Rimaniamo al primo codice che hai messo tu, quello è complesso e fa tante cose. La libreria che ti ho indicato gestisce anche i samsung. A te interessa solo quel tipo di telecomando. Perciò la prima cosa da fare è scoprire il valore associato ad ogni tasto del tuo telecomando; ti riscrivo solo la loop() (la tua parte iniziale va bene)

void loop() {
  lcd.setCursor(0,0);
  if (irrecv.decode(&results)) {
    if (results.decode_type == SAMSUNG) {   // se è telecomando samsung
      lcd.print("TASTO=");
      lcd.println(results.value, HEX);
    }
    irrecv.resume(); // Riceve il prossimo valore
  }
}

Devi segnarti su un foglio di carta i valori del telecomando. Dopo potrai usare una istruzione switch() per verificare quale tasto premi e associare una azione a quel tasto. Esempio con codici inventati NON sono i tuoi :

void loop() {
  lcd.setCursor(0,0);
  if (irrecv.decode(&results)) {
    if (results.decode_type == SAMSUNG) {   // se è telecomando samsung
      // lcd.print("TASTO="); lcd.println(results.value, HEX);  non serve più, conosco i valori
      switch(results.value)
      { case 0xA16EC03F:  
            // premuto tasto 1   farò qualcosa
            lcd.setCursor(0,1); lcd.print("Tasto 1");
            break;
        case 0xA16EC03E:  
            // premuto tasto 2   farò qualcosa
            break;
      }
    }
    irrecv.resume(); // Riceve il prossimo valore
  }
}

http://www.mauroalfieri.it/informatica/tutorial-arduino-ir-con-tsop1738.html

Allego la libreria IRremote originale in cui ho messo anche decode per Samsung.
Praticamente ho fatto il mix delle due librerie. Non l’ho provata. Solo compilata (in ufficio non ho Arduino con me, solo IDE)

Arduino-IRremote_con_samsung.zip (32.6 KB)

Grazie a tutti per le risposte, chiedo scusa per il ritardo, ma in questi giorni non sono mai stato in ufficio e la sera tornavo a casa tardi e stanco. Tra oggi e domani proverò con i vostri consigli.

Grazie ancora per l'aiuto.

questo codice funziona su qualsiasi telecomando ma l’ho provato su un Samsung
/*

  • IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
  • An IR detector/demodulator must be connected to the input RECV_PIN.
  • Version 0.1 July, 2009
  • Copyright 2009 Ken Shirriff
  • http://arcfn.com
  • telecomando SAMSUNG DVD */

#include <IRremote.h>

int RECV_PIN = 11;
int buttonpin=8;
long codice;
int a;
int ledpin=7;
IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
pinMode(13,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(8,INPUT);
pinMode(7,OUTPUT);}

void loop() {

if (irrecv.decode(&results)) {
//Serial.println(results.value, DEC);
codice=results.value-1711590000;
// Serial.println(codice);
if (codice==1392) {Serial.println(“ricevo 1”);
digitalWrite(6,HIGH);}
if (codice==1376) {Serial.println(“ricevo 2”);
digitalWrite(7,HIGH);}
if (codice==1408) {Serial.println(“ricevo 3”);
digitalWrite(5,HIGH);}

if (codice==1368) {Serial.println(“ricevo 4”);}
if (codice==1400) {Serial.println(“ricevo 5”);}
if (codice==1384) {Serial.println(“ricevo 6”);}
if (codice==1416) {Serial.println(“ricevo 7”);}
if (codice==1364) {Serial.println(“ricevo 8”);}
if (codice==1396) {Serial.println(“ricevo 9”);}
if (codice==1360) {Serial.println(“ricevo 0”);
digitalWrite(6,LOW);
digitalWrite(5,LOW);
digitalWrite(7,LOW);}
a= digitalRead(buttonpin);

// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (a == LOW) {
// turn LED on:
digitalWrite(ledpin, HIGH);
}

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