Mah, non capisco, io non ci vedo problemi. Se vuoi escluderli basta sapere se è un codice ripetuto, e stando all'esempio che hai postato c'è persino una "if" specifica, che puoi usare per ignorare il tasto ripetuto:
void loop() {
if (sCallbackData.justWritten) {
sCallbackData.justWritten = false;
if (sCallbackData.Flags != IRDATA_FLAGS_IS_REPEAT) {
// Il tsto è buono e non è un repeat
Serial.print(F("Address=0x"));
Serial.print(sCallbackData.Address, HEX);
Serial.print(F(" Command=0x"));
Serial.print(sCallbackData.Command, HEX);
// Ora ci faccio qui quello che mi serve...
...
}
}
}
...
Il codice deve essere un unsigned long se vuoi memorizzare quei valori. Ma come vedi, con IRremote è tutto più semplice.
Ti posto qui qualche spezzone di codice che ho in uno dei miei progetti, vedi se può esserti utile:
Receiver.ino:
#define RECV_PIN D3
// Ritardo minimo tra un tasto e il successivo (ms)
#define KEY_DELAY 300
// Gestione IR
#include <IRrecv.h>
#include <IRremoteESP8266.h>
IRrecv irrecv(RECV_PIN, 1024, 15, true);
#include "IrCode.h"
decode_results results;
void setup() {
Serial.begin(115200);
irrecv.enableIRIn();
Serial.println("STARTED");
Serial.println();
}
void loop() {
if (irrecv.decode(&results)) {
if (results.decode_type == PROTO) {
int key = decodeValue();
if ( key > -1 ) { // Tasto riconosciuto
// Controllo il repeat locale
if ( key == lastKey && millis()-tmrRepeat < KEY_DELAY ) {
Serial.println("**REPEAT IGNORATO**");
} else {
Serial.print(" Tasto: "); Serial.println(keyLbl[key]);
// Uso il tasto...
...
lastKey = key;
tmrRepeat = millis();
}
}
}
irrecv.resume(); // Receive the next value
}
}
// --------------------------------------------------
// DECODIFICA TASTI
// --------------------------------------------------
int decodeValue() {
unsigned long kCode = results.value - PROTO_OFFSET;
Serial.print(" 0x"); Serial.print(kCode, HEX);
// Cerca il codice nella tabella dei codici
int k = -1; // Indice del tasto all'interno della tabella
for (int i = 0; i < KEYS; i++) {
if ( keyCode[i] == kCode ) {
// Trovato!
return i;
}
}
// Se non trovato restituisce -1 perché non devo farci nulla
return -1;
}
IrCode.h: (questo ovviamente devi adattarlo al tuo caso, io ho la codifica Samsung, ed i valori li ho acquisiti con IRrecvDump e messi in keyCode e nel mio caso uso un offset per semplificarmi le cose, ma tu metterai i codici senza offset, ed infine l'etichetta equivalente adf ognuno dei codici è in keyLbl):
// Tabella codifica SAMSUNG codice 1648
#define PROTO SAMSUNG
// Offset dei codici
#define PROTO_OFFSET 0xE0E00000
// Numero di elementi nell'array
#define KEYS 36
// MAPPA DEI TASTI
// Etichetta (solo per stampare il nome del tasto)
char keyLbl[KEYS][4] = {
"0" ,"1" ,"2" ,"3" ,"4" ,"5" ,"6" ,"7" ,"8" ,"9" ,
"HLP" ,"ESC" ,"P+" ,"P-" ,"UP" ,"LT" ,"OK" ,"RT" ,"DN" ,"MNU" ,
"GUI" ,"PRI" ,"INT" ,"BCK" ,"INF" ,"TXT" ,"RED" ,"GRN" ,"YLW" ,"BLU" ,
"REC" ,"PAU" ,"STP" ,"PLY" ,"REW" ,"FFW"};
// **** CODIFICA (da sommare all'offset)
unsigned long keyCode[KEYS] = {
0x8877, 0x20DF, 0xA05F, 0x609F, 0x10EF, 0x906F, 0x50AF, 0x30CF, 0xB04F, 0x708F,
0x7C83, 0xB44B, 0x48B7, 0x08F7, 0x06F9, 0xA659, 0x16E9, 0x46B9, 0x8679, 0x58A7,
0xF20D, 0xD629, 0x9E61, 0x1AE5, 0xF807, 0x34CB, 0x36C9, 0x28D7, 0xA857, 0x6897,
0x926D, 0x52AD, 0x629D, 0xE21D, 0xA25D, 0x12ED };