Hi,
I'm puzzled how message receive happens. I am building a infrared transmitter. I decoded the NEC signals from original remote, they look like this (hex): 0xF7C03F. This is power on command.
Now I want to send those signals over MQTT, which mysgw transfers over NRF24L01+ to arduino. But how to convert messages so that they look alike at both ends? is that number too big to send (3 bytes)?
As I send that exact command from arduino:
#define CMD_ON 0xF7C03F
...
send(msg_ir.set(CMD_ON));
it looks like this on MQTT looking from mosquitto_sub:
MySensorsGW/out/7/1/1/0/32 16236607
When I send that back:
mosquitto_pub -h droidcam.ikenet -p 1883 -t MySensorsGW/in/7/1/1/0/32 -m 16236607
the code:
uint32_t ircode;
ircode = atoi( message.data );
...
Serial.print( "V_IR_SEND data invalid: " );
Serial.print( message.data );
Serial.print( ", ircode: " );
Serial.println( ircode );
prints it out like this:
V_IR_SEND data invalid: 16236607, ircode: 4294950975
the numbers don't match. 16236607 is not the original CMD_ON code.
This is the receive function:
// IR remote command codes
#define CMD_BRIGHTER 0xF700FF
#define CMD_DIMMER 0xF7807F
#define CMD_OFF 0xF740BF
#define CMD_ON 0xF7C03F
#define CMD_FLASH 0xF7D02F
#define CMD_STROBE 0xF7F00F
#define CMD_FADE 0xF7C837
#define CMD_SMOOTH 0xF7E817
#define CMD_RED 0xF720DF
#define CMD_RED1 0xF710EF
#define CMD_RED2 0xF730CF
#define CMD_RED3 0xF708F7
#define CMD_RED4 0xF728D7
#define CMD_GREEN 0xF7A05F
#define CMD_GREEN1 0xF7906F
#define CMD_GREEN2 0xF7B04F
#define CMD_GREEN3 0xF78877
#define CMD_GREEN4 0xF7A857
#define CMD_BLUE1 0xF7609F
#define CMD_BLUE 0xF750AF
#define CMD_BLUE2 0xF7708F
#define CMD_BLUE3 0xF748B7
#define CMD_BLUE4 0xF76897
void receive(const MyMessage &message)
{
uint32_t ircode;
Serial.print( "Received something of type: " );
Serial.println( message.type );
if (message.type == V_IR_SEND) {
Serial.println( "V_IR_SEND command received..." );
ircode = atoi( message.data );
//ircode = message.data;
switch (ircode) {
case CMD_BRIGHTER:
case CMD_DIMMER:
case CMD_OFF:
case CMD_ON:
case CMD_FLASH:
case CMD_STROBE:
case CMD_FADE:
case CMD_SMOOTH:
case CMD_RED:
case CMD_RED1:
case CMD_RED2:
case CMD_RED3:
case CMD_RED4:
case CMD_GREEN:
case CMD_GREEN1:
case CMD_GREEN2:
case CMD_GREEN3:
case CMD_GREEN4:
case CMD_BLUE1:
case CMD_BLUE:
case CMD_BLUE2:
case CMD_BLUE3:
case CMD_BLUE4:
{
Serial.print( "V_IR_SEND code received: ");
Serial.println( message.data );
send_ircode(ircode);
ack_ir_to_controller(ircode);
break;
}
default:
{
Serial.print( "V_IR_SEND data invalid: " );
Serial.print( message.data );
Serial.print( ", ircode: " );
Serial.println( ircode );
return;
}
}
}
for (int i=0; i<5; i++) {
digitalWrite(LED_PIN, HIGH);
wait(100);
digitalWrite(LED_PIN, LOW);
wait(100);
}
}
I suppose it has to do with data length and auto conversion of variables. It perhaps worked if I use smaller numbers to set the IR code value. But however, I'd like to understand how this is supposed to work?
BR,
-ikke
PS, this is IR controlled LED light bulb from LIDL, and commands do work with the given codes.