arduino uno e telecomando infrarossi

Buongiorno a tutti, è da un pò che cerco di cimentarmi con arduino e un ricevitore ad infrarossi tipo vs 1838b, il mio problema è che dopo aver caricato il codice ,aver aperto il serial monitor, ogni volta che premo un tasto del telecomando infrarossi la risposta a monitor è sempre diversa (chiaramente pigiando sempre lo stesso tasto).

il codice interamente copiato dal sitohttp://ismanettoneblog.altervista.org/blog/lezione-1 è questo:

#include <IRremote.h>
 
int RECV_PIN = 11;
 
IRrecv irrecv(RECV_PIN);
 
decode_results results;
 
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}
 
// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
// void * to work around compiler issue
//void dump(void *v) {
//  decode_results *results = (decode_results *)v
void dump(decode_results *results) {
  int count = results->rawlen;
  if (results->decode_type == UNKNOWN) {
    Serial.print("Unknown encoding: ");
  }
    else if (results->decode_type == NEC) {
    Serial.print("Decoded NEC: ");
  }
  else if (results->decode_type == SONY) {
    Serial.print("Decoded SONY: ");
  }
  else if (results->decode_type == RC5) {
    Serial.print("Decoded RC5: ");
  }
  else if (results->decode_type == RC6) {
    Serial.print("Decoded RC6: ");
  }
  else if (results->decode_type == SAMSUNG) {
    Serial.print("Decoded SAMSUNG: ");
  }
  else if (results->decode_type == JVC) {
    Serial.print("Decoded JVC: ");
  }
  else if (results->decode_type == PANASONIC) {
    Serial.print("Decoded Panasonic: ");
  }
  Serial.print(results->value, HEX);
  Serial.print("(");
  Serial.print(results->bits, DEC);
  Serial.println(" bits)");
  Serial.print("#define Something_DEC ");
  Serial.println(results->value, DEC);
  Serial.print("#define Something_HEX ");
  Serial.println(results->value, HEX);
  Serial.print("Raw (");
  Serial.print(count, DEC);
  Serial.print("): ");
  for (int i = 0; i < count; i++) {
    if ((i % 2) == 1) {
      Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
    }
    else {
      Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
    }
    Serial.print(" ");
  }
  Serial.println("");
}
 
void loop() {
  if (irrecv.decode(&results)) {
    dump(&results);
    irrecv.resume(); // Receive the next value
  }
}

P.S ho notato che il sensore è molto ricettivo

Grazie

Benvenuto. Essendo il tuo primo post, nel rispetto del regolamento, ti chiediamo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO... Grazie.
Qui una serie di link utili, non inerenti al tuo problema:

Il codice DEVI racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.
Infatti nel codice che hai postato ad un certo punto manca un pezzetto e diventa in italico !!

#include <IRremote.h>
 
int RECV_PIN = 11;
 
IRrecv irrecv(RECV_PIN);
 
decode_results results;
 
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}
 
// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
// void * to work around compiler issue
//void dump(void *v) {
//  decode_results *results = (decode_results *)v
void dump(decode_results *results) {
  int count = results->rawlen;
  if (results->decode_type == UNKNOWN) {
    Serial.print("Unknown encoding: ");
  }
    else if (results->decode_type == NEC) {
    Serial.print("Decoded NEC: ");
  }
  else if (results->decode_type == SONY) {
    Serial.print("Decoded SONY: ");
  }
  else if (results->decode_type == RC5) {
    Serial.print("Decoded RC5: ");
  }
  else if (results->decode_type == RC6) {
    Serial.print("Decoded RC6: ");
  }
  else if (results->decode_type == SAMSUNG) {
    Serial.print("Decoded SAMSUNG: ");
  }
  else if (results->decode_type == JVC) {
    Serial.print("Decoded JVC: ");
  }
  else if (results->decode_type == PANASONIC) {
    Serial.print("Decoded Panasonic: ");
  }
  Serial.print(results->value, HEX);
  Serial.print("(");
  Serial.print(results->bits, DEC);
  Serial.println(" bits)");
  Serial.print("#define Something_DEC ");
  Serial.println(results->value, DEC);
  Serial.print("#define Something_HEX ");
  Serial.println(results->value, HEX);
  Serial.print("Raw (");
  Serial.print(count, DEC);
  Serial.print("): ");
  for (int i = 0; i < count; i++) {
    if ((i % 2) == 1) {
      Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
    } 
    else {
      Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
    }
    Serial.print(" ");
  }
  Serial.println("");
}
 
void loop() {
  if (irrecv.decode(&results)) {
    dump(&results);
    irrecv.resume(); // Receive the next value
  }
}

spero di esserci riuscito ad inserire il codice .

grazie e scusatemi

NO, non hai capito ... :slight_smile:

... in conformità al regolamento, punto 7, devi editare il tuo post iniziale (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

Grazie,

Guglielmo

Spero sia ok grazie

Antonio

Si, okay.
Ma come "Decoded ...." che cosa ti dice ?

dopo aver premuto due volte il tasto 1 del telecomando samsung :

Decoded SAMSUNG: E0E020DF(32 bits)
#define Something_DEC 3772784863
#define Something_HEX E0E020DF
Raw (68): -24824 4400 -4450 550 -1650 550 -1700 500 -1700 500 -600 500 -600 500 -550 550 -600 500 -600 550 -1650 550 -1650 550 -1700 500 -600 500 -600 500 -600 500 -600 500 -600 550 -550 550 -550 550 -1650 550 -600 500 -600 500 -600 500 -600 500 -550 550 -1700 550 -1650 550 -550 550 -1700 500 -1700 500 -1650 550 -1700 500 -1700 550
Unknown encoding: E13DDA28(32 bits)
#define Something_DEC 3778927144
#define Something_HEX E13DDA28
Raw (68): 14142 4400 -4450 500 -1750 450 -1700 550 -1700 500 -600 500 -600 500 -600 500 -600 500 -600 500 -1700 500 -1700 550 -1700 500 -550 550 -600 500 -600 500 -600 500 -600 500 -600 500 -600 500 -1750 500 -600 500 -550 550 -600 500 -600 500 -600 500 -1700 500 -1700 500 -650 450 -1700 550 -1700 500 -1700 500 -1700 500 -1700 500

spero di non aver fatto altri errori

Se lo riconosce come Samsung, io toglierei quando stampa la codifica raw, che serve solo quando non si capisce il tipo di telecomando. Commenta tutta quella parte.
All'inizio della riga con Serial.print("Raw ("); metti /* e poi dopo la } del for metti */ (prima della Serial.println(""); )
Meno roba inutile stampa e meglio è

Quello che ti interessa è Decoded SAMSUNG: E0E020DF(32 bits)
Se premi 5 volte 1, vedi sempre quella frase con quei numeri esadecimali ?
Se poi in mezzo di sono dei Unknown encoding, per ora non me ne occuperei.

Che telecomando è ? TV o per caso condizionatore ?

Siccome anch'io sto "giocando" con telecomando Samsung (TV), usa questo sketch pulito pulito per vedere i codici... :wink:

Casomai posta la schermata del monitor seriale che vedi, così capiamo meglio.

#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(13, OUTPUT); // Pin 13 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
  }
   
}

nid69ita.

Allora: il telecomando è un telecomando tv samsung;
ogni volta che digito 1 non sempre mi riconosce la decodifica a volte compaiono Unknown encoding, ma ho notato che digitando più volte 1 poi compare la codifica samsung con lo stesso valore, ciò accade anche con gli altri tasti

fluo82:

il tuo codice è molto più pulito e quindi più chiaro, ma ci sono sempre delle decodifiche sconosciute, comunque mi sembra più valido.

scusatemi se volessi utilizzare il o più valori comuni come li inserisco???

grazie.

indio11:
scusatemi se volessi utilizzare il o più valori comuni come li inserisco???
grazie.

Io non ho capito la domanda, sorry

con il codice di Fluo82 il serial monitor premendo il tasto 1 del telecomando mi da questi valori
E0E020DF
E0E020DF
E0E020DF
E0E020DF
E0E020DF
E13DDA28
E13DDA28
E0E020DF
E0E020DF
E0E020DF
E0E020DF
E0E020DF
E13DDA28
E13DDA28
E13DDA28
come inserisco i valori più ricorrenti nel codice per far si che premendo il tasto 1 del telec mi accenda ad esmipo un led?

grazie

ho trovato questo codice

#include <IRremoteInt.h>

#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
  }  
}

Secondo me il codice per il tasto 1 è E0E020DF, l'altro mi parrebbe un "falso" e comunque non me ne interesserei

P.S. premendo 1 cosa intendi ? Premi tante volte di seguito o lo tieni premuto ?

Con questo sketch accendi il led sul pin 9 ogni qualvolta premi il tasto 1, sia che il codice HEX sia uno o l'altro.
Creati un altro "if" se desideri spegnere il led con un altro tasto. :wink:

#include <IRremoteInt.h>

#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 == E0E020DF ||  results.value == E13DDA28 ){ //tasto 1 sul telecomando
    digitalWrite(9, HIGH);   // set the LED on
  }   
}

Il valore con le lettere è esadecimale, in linguaggio C/C++ si scrive con 0x davanti
results.value == 0xE0E020DF

intanto voglio ringraziarvi per la vostra disponibilità !!!!!

sono riuscito a decodificare il telecomando ed ad utilizzare il codice relativo al tasto premuto, unico neo è che, qunado premo e rilascio ad esempio il tasto 1 del telecomando il codice visualizzato sul serial monitor non è mai lo stesso ; mi spiego: ogni volta che premo e rilascio il tasto 1 come risultato ho E0E020D oppure FE13DDA28 o ancora altri codici . I primi due sono i più ricorrenti e sono quelli che ho utilizzato .
non c'è un modo per far si che gli altri codici non utilizzati perchè non ricorrenti non vengano visualizzati?grazie

A me non è mai capitato che un telecomando desse valori diversi per stesso tasto. Telecomando semplici ! Quelli di condizionatori, Sky, etc sono particolari.