Buenas tardes compañeros !!
Estoy partiéndome la cabeza con un problema que tengo, resulta que tengo un receptor de infrarrojos con el siguiente código (seguro que mas de uno sabe que código es)
#include <IRremote.h>
int recvPin = 12;
IRrecv irrecv(recvPin);
void setup ( )
{
Serial.begin(9600); // Status message will be sent to PC at 9600 baud
irrecv.enableIRIn(); // Start the receiver
}
void ircode (decode_results *results)
{
if (results->decode_type == PANASONIC) {
Serial.print(results->address, HEX);
Serial.print(":");
}
Serial.print(results->value, HEX);
}
void encoding (decode_results *results)
{
switch (results->decode_type) {
default:
case UNKNOWN: Serial.print("UNKNOWN"); break ;
case NEC: Serial.print("NEC"); break ;
case SONY: Serial.print("SONY"); break ;
case RC5: Serial.print("RC5"); break ;
case RC6: Serial.print("RC6"); break ;
case DISH: Serial.print("DISH"); break ;
case SHARP: Serial.print("SHARP"); break ;
case JVC: Serial.print("JVC"); break ;
case SANYO: Serial.print("SANYO"); break ;
case MITSUBISHI: Serial.print("MITSUBISHI"); break ;
case SAMSUNG: Serial.print("SAMSUNG"); break ;
case LG: Serial.print("LG"); break ;
case WHYNTER: Serial.print("WHYNTER"); break ;
case AIWA_RC_T501: Serial.print("AIWA_RC_T501"); break ;
case PANASONIC: Serial.print("PANASONIC"); break ;
case DENON: Serial.print("Denon"); break ;
}
}
void dumpInfo (decode_results *results)
{
if (results->overflow) {
Serial.println("IR code too long. Edit IRremoteInt.h and increase RAWBUF");
return;
}
Serial.print("Encoding : ");
encoding(results);
Serial.println("");
Serial.print("Code : ");
ircode(results);
Serial.print(" (");
Serial.print(results->bits, DEC);
Serial.println(" bits)");
}
void dumpRaw (decode_results *results)
{
Serial.print("Timing[");
Serial.print(results->rawlen-1, DEC);
Serial.println("]: ");
for (int i = 1; i < results->rawlen; i++) {
unsigned long x = results->rawbuf[i] * USECPERTICK;
if (!(i & 1)) { // even
Serial.print("-");
if (x < 1000) Serial.print(" ");
if (x < 100) Serial.print(" ");
Serial.print(x, DEC);
} else { // odd
Serial.print(" ");
Serial.print("+");
if (x < 1000) Serial.print(" ");
if (x < 100) Serial.print(" ");
Serial.print(x, DEC);
if (i < results->rawlen-1) Serial.print(", ");
}
if (!(i % 8)) Serial.println("");
}
Serial.println("");
}
void dumpCode (decode_results *results)
{
Serial.print("unsigned int ");
Serial.print("rawData[");
Serial.print(results->rawlen - 1, DEC);
Serial.print("] = {");
for (int i = 1; i < results->rawlen; i++) {
Serial.print(results->rawbuf[i] * USECPERTICK, DEC);
if ( i < results->rawlen-1 ) Serial.print(",");
if (!(i & 1)) Serial.print(" ");
}
Serial.print("};");
Serial.print(" // ");
encoding(results);
Serial.print(" ");
ircode(results);
Serial.println("");
if (results->decode_type != UNKNOWN) {
if (results->decode_type == PANASONIC) {
Serial.print("unsigned int addr = 0x");
Serial.print(results->address, HEX);
Serial.println(";");
}
Serial.print("unsigned int data = 0x");
Serial.print(results->value, HEX);
Serial.println(";");
}
}
void loop ( )
{
decode_results results;
if (irrecv.decode(&results)) {
dumpInfo(&results);
dumpRaw(&results);
dumpCode(&results);
Serial.println("");
irrecv.resume();
}
}
El caso es que luego tengo el típico mando a distancia que viene en esos kits de inicio de Arduino, el cual cuando presiono el botón 1, obtengo la siguiente información:
17:46:45.510 -> Code : FF30CF (32 bits)
17:46:45.510 -> Timing[67]:
17:46:45.544 -> +8950, -4500 + 550, - 600 + 500, - 600 + 550, - 600
17:46:45.611 -> + 550, - 550 + 550, - 550 + 600, - 550 + 550, - 600
17:46:45.678 -> + 550, - 550 + 550, -1650 + 600, -1650 + 550, -1650
17:46:45.747 -> + 550, -1700 + 550, -1650 + 550, -1700 + 550, -1650
17:46:45.817 -> + 550, -1700 + 500, - 600 + 550, - 600 + 550, -1650
17:46:45.919 -> + 550, -1650 + 600, - 550 + 550, - 600 + 550, - 550
17:46:45.988 -> + 550, - 600 + 550, -1650 + 550, -1650 + 600, - 550
17:46:46.056 -> + 550, - 600 + 550, -1650 + 550, -1700 + 550, -1650
17:46:46.126 -> + 550, -1650 + 600
17:46:46.160 -> unsigned int rawData[67] = {8950,4500, 550,600, 500,600, 550,600, 550,550, 550,550, 600,550, 550,600, 550,550, 550,1650, 600,1650, 550,1650, 550,1700, 550,1650, 550,1700, 550,1650, 550,1700, 500,600, 550,600, 550,1650, 550,1650, 600,550, 550,600, 550,550, 550,600, 550,1650, 550,1650, 600,550, 550,600, 550,1650, 550,1700, 550,1650, 550,1650, 600}; // NEC FF30CF
17:46:46.537 -> unsigned int data = 0xFF30CF;
Hasta aquí todo correcto. Debo decir que esto es parte de un código el cual tengo conectado 3 relés a 3 luces, las cuales las puedo encender con botón/pulsados, desde Bluetooth, con el mando a distancia e incluso con un programador de tiempo.
Ahora bien, mi siguiente reto era hacerme mi propio mando a distancia, el caso es que tengo una placa Arduino nano, que he conectado el led emisor de infrarrojo y este otro código que envía señales RAW (he probado también otro código que envía por NEC). En ambos códigos, el resultado es el mismo, me envía la señal, sin embargo, la señal que recibo no es la que me esperaba:
8:04:19.628 -> Encoding : UNKNOWN
18:04:19.662 -> Code : [color=#0000ff]7F5A2467 [/color](32 bits)
18:04:19.696 -> Timing[67]:
18:04:19.696 -> +8750, -4500 + 500, - 700 + 400, - 700 + 450, - 650
18:04:19.767 -> + 500, - 650 + 450, - 600 + 550, - 650 + 450, - 700
18:04:19.868 -> + 450, - 600 + 500, -1750 + 500, -1800 + 300, -1750
18:04:19.937 -> + 450, -1800 + 450, -1700 + 550, -1750 + 450, -1750
18:04:20.007 -> + 450, -1750 + 400, - 650 + 500, - 700 + 400, -1800
18:04:20.077 -> + 450, -1750 + 500, - 550 + 500, - 650 + 500, - 650
18:04:20.147 -> + 500, -2800 + 450, -1750 + 550, - 600 + 200, - 100
18:04:20.230 -> + 150, - 750 + 400, -1800 + 400, -1800 + 450, -1750
18:04:20.286 -> + 450, -1700 + 500
18:04:20.321 -> unsigned int rawData[67] = {8750,4500, 500,700, 400,700, 450,650, 500,650, 450,600, 550,650, 450,700, 450,600, 500,1750, 500,1800, 300,1750, 450,1800, 450,1700, 550,1750, 450,1750, 450,1750, 400,650, 500,700, 400,1800, 450,1750, 500,550, 500,650, 500,650, 500,2800, 450,1750, 550,600, 200,100, 150,750, 400,1800, 400,1800, 450,1750, 450,1700, 500}; // UNKNOWN 7F5A2467
18:04:20.697 ->
Si os fijáis el código en Hexadecimal es distinto. Pero es que a cada envío este código cambia sin saber el motivo.
Este es el código que tengo para enviar:
#include <IRremote.h>
IRsend irsend;
void setup() {}
void loop() {
int khz = 38;
unsigned int irSignal[] = {8950,4500, 550,600, 500,600, 550,600, 550,550, 550,550, 600,550, 550,600, 550,550, 550,1650, 600,1650, 550,1650, 550,1700, 550,1650, 550,1700, 550,1650, 550,1700, 500,600, 550,600, 550,1650, 550,1650, 600,550, 550,600, 550,550, 550,600, 550,1650, 550,1650, 600,550, 550,600, 550,1650, 550,1700, 550,1650, 550,1650, 600};
irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz); //Note the approach used to automatically calculate the size of the array.
delay(10000);
}
Las conexiones son simples, el led emisor en el pin digital 3, y ya está. Y no creo que el problema lo tenga en el receptor, ya que con el mando a distancia a cada pulsación del botón, me devuelve la misma información.
¿Hay alguna alma caritativa que me pueda orientar o ayudar con esto?
Muchas gracias.
Si necesitáis alguna foto de las conexiones las pongo sin problemas, pero vamos, que son conexiones la mar de simples.
