In questi giorni ho avuto la necessità di simulare i comandi IR del telecomando di un decodificatore IPTV che sembra non seguire i classici standard.
Ricavate le sequenze RAW (piuttosto lunghette) mi sono posto il problema di risparmiare SRAM e di allocarle in PGMSPACE.
Girando un po' su Google ho trovato una soluzione piuttosto pulita e, dato che da una rapida ricerca qui sul forum non mi sembra di averla trovata (... ma naturalmente può essermi sfuggita ed in tal caso mi scuso anticipatamente per il duplicato), la ripropongo qui affinché possa essere magari utile a chiunque altro ha lo stesso problema.
La soluzione riguarda la creazione di un nuovo metodo nella classe IRSend che effettui direttamente l'invio delle sequenze poste in PGMSPACE senza la necessità di copiarle interamente prima in SRAM ...
1. Modifica al file IRremote.h:
Occorre aggiungere in testa la seguente #include
#include <avr/pgmspace.h>
quindi occorre scorre in basso, sino alla definizione della classe IRSend ed aggiungere tra i suoi metodi il seguente metodo (... io l'ho inserito subito dopo la "void sendRaw(....)"):
void sendRaw_P (PGM_VOID_P buf, unsigned int len, unsigned int hz) ;
2. Modifica al file irSend.cpp
Occorre aggiungere in testa la seguente #include
#include <avr/pgmspace.h>
quindi occorre scorrere in basso e, magari dopo la definizione della void sendRaw(){ ... }, aggiungere il seguete codice:
void IRsend::sendRaw_P (PGM_VOID_P buf, unsigned int len, unsigned int hz)
{
// Set IR carrier frequency
enableIROut(hz);
for (unsigned int i = 0; i < len; i++) {
uint16_t duration = pgm_read_word_near((uint16_t)buf + sizeof(uint16_t)*i);
if (i & 1) space(duration) ;
else mark (duration) ;
}
space(0); // Always end with the LED off
}
A questo punto la libreria contiene un nuovo metodo nella classe IRsend utilizzabile per inviare direttamente dal PGMSPACE le sequenze RAW.
3. Esempio:
#include <IRremote.h>
IRsend irsend;
static const unsigned char theFrequency = 36U;
static const unsigned int OKkey[] PROGMEM = {
2616,1848,676,292,348,292,344,296,648,628,368,268,340,296,348,292,344,292,344,296,
340,300,344,292,344,292,344,292,344,296,348,292,340,296,344,296,340,296,344,292,648,
300,340,292,348,292,344,628,644,628,652,624,624,656,644,73730,2616,1848,676,292,344,
296,340,296,648,620,352,292,344,296,344,292,348,292,344,292,344,296,340,300,340,296,
344,292,344,292,344,296,344,296,344,292,344,296,340,296,648,292,348,292,344,292,344,
632,620,652,648,628,652,624,648
};
void setup() {
}
void loop() {
irsend.sendRaw_P(OKkey, (unsigned char) (sizeof(OKkey) / sizeof(unsigned int)), theFrequency);
delay(1000);
}
Guglielmo