Go Down

Topic: Arduino Uno + Emisor Infrarrojo (Read 405 times) previous topic - next topic

jazpiroz

Feb 16, 2018, 12:56 pm Last Edit: Feb 16, 2018, 01:32 pm by surbyte Reason: No cumplia con las normas, faltaban etiquetas
Estimados, estoy tratando de controlar un aire acondicionado Panavox (es una marca que se vende en Uruguay).
Lo primero que hice fue trabajar con el ejemplo que anda por ahi sobre como obtener los códigos del infra y mostrar la marca del protocolo, en este caso me muestra correctamente los exadecimales :

Aire Panavox - Split

ON: B24D7B84

OFF: B24D9F60

MODE:
 AUTO: B24D1FE0

 COOL: B24D9F60

 DRY: B24D1FE0

 HEAT: B24D9F60

 FAN: B24D9F60

Ahora bien cuando quiero emitir una señal desde arduino utlilizando otro ejemplo por ahi y usando la librería IRLib:

Code: [Select]

#include <IRLib.h>
#include <IRLibMatch.h>
#include <IRLibTimer.h>

IRsend emitter;
int count;

void setup() {
 Serial.begin(9600);
 count = 0;
}

void loop() {
 count++;
 emitter.send(NEC, 0xFF00926D, 32);
 Serial.print("SENDING DATA: ");
 Serial.println(count);
 delay(10000);
}


Me doy cuenta que necesito la marca del protocolo usado y esto no lo tengo.
Seguí investigando y topé con una pagina :
https://github.com/luisgabrielroldan/IRPanavoxAC
donde desarrollaron una librería para esta marca.
Soy nuevo en este tema y no se como se usa la librería, no conozco C+.

Alguien me podría dar una mano para poder saber como enviar una señal con este librería ?? o capaz que no debo usar ese código y existe algo mas universal.

Desde ya muchas gracias a todos, por su ayuda.
Saludos
Juan

surbyte

#1
Feb 16, 2018, 01:11 pm Last Edit: Feb 16, 2018, 01:46 pm by surbyte
Lo primero que ahora debes hacer es leer las normas del foro y luego editar tu post original.
Te envio un privado con instrucciones para hacerlo.

Respondo en parte tu consulta: Te fijaste que el autor de la librería es Uruguayo, intenta contactarlo y que te pase un ejemplo. Vi la librería y no trae un ejemplo asi que o lo hizo para que lo contacten o se le olvidó.
Librería Aire Acondicionado Panavox

No conozco ni la librería que has usado ni la que has encontrado.
Casi todo el foro Arduino usa siempre IRremote que tmb tiene 4 o 5 protocolos conocidos y luego si no esta entre esos usa lo que llaman modo CRUDO o RAW como en fotografía cuando no usan Jpeg y tienen la foto cruda sin comprensión. Para el caso lo mismo.

En modo RAW decodificas y usas ese vector de bytes para comandar tu equipo sin problemas.

La librería que mencionas fue hecha por un compatriota Uruguayo de modo que porque no lo contactas y ves si te da una mano o bien experimentas por tu cuenta porque sin el aire y sin el deco poco podemos decirte.
Intenta repetir lo que ya has hecho decodificando los comandos. Y luego busca un equivalenta para enviar y debería funcionar.


EDITO 2:
He profundizado algo mas el tema y veo que IRlib es la librería que hace la gran tarea y que tiene soluciones para muchos protocolos mira aca

IRlib Library con ejemplos

Cuando vas a ejemplos encuentras para DirtecTV, Samsung, etc.
En estos dos casos las soluciones las presenta como clases. Lo que hizo LuisGabriel fue integrar las clases para Panavox en una librería extra.

De estos ejemplos y de la librería de LuisGabriel tienes como resolverlo.

jazpiroz

Muchas gracias!!! a investigar....
Saludos
Juan

jazpiroz

#3
Feb 16, 2018, 04:33 pm Last Edit: Feb 16, 2018, 04:46 pm by jazpiroz
EStimados, tengo estas dos clases y quiero utilizar el método, el cual me da error, no domino C y por lo tanto estoy cometiendo algunos errores, 

Me declaré las siguientes variables:

Code: [Select]

IRsendPanavoxAC emitter;
int count;
char fanspeed='5';
char temperatura='A';
ac_mode_t mode;
panavox_ac_mode_state_t state;


Code: [Select]

int result = emitter.sendModeCmd(mode,fanspeed,temperatura); //modo cool


Al compilar me da error.

Code: [Select]
/*
 * IRsendPanavoxAC.h
 *
 *  Created on: 11 dic. 2016
 *      Author: Gabriel Roldán
 */

#ifndef _IR_SEND_PANAVOX_AC_H_
#define _IR_SEND_PANAVOX_AC_H_

#include <Arduino.h>
#include <IRLib.h>
#include <IRLibMatch.h>

#include "IRPanavoxAC.h"

#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))

class IRsendPanavoxAC: public virtual IRsendBase {
public:
void send(uint32_t* value);
bool sendModeCmd(panavox_ac_mode_state_t* state);
void sendMoveFlap(void);
void sendSwapLight(void);
void sendSuperMode(void);
void sendAutoClean(void);
void sendFlapOscillation(void);
void sendShutdown(void);
private:
void sendByte(uint8_t data);
void sendPacket(uint32_t value);
uint8_t encodeTemp(uint8_t temp);
bool isValidState(panavox_ac_mode_state_t* state);
};

#endif /* _IR_SEND_PANAVOX_AC_H_ */


Code: [Select]
/*
 * IRPanavoxAC.h
 *
 *  Created on: 10 dic. 2016
 *      Author: Gabriel Roldán
 */

#ifndef _IR_PANAVOX_AC_H_
#define _IR_PANAVOX_AC_H_

#define PANAVOX_AC LAST_PROTOCOL + 10

#define PANAVOX_AC_FREQ         38

#define PANAVOX_RAW_COUNT 100

#define PANAVOX_AC_HDR_MARK 4300
#define PANAVOX_AC_HDR_SPACE 4500
#define PANAVOX_AC_BIT_MARK 500
#define PANAVOX_AC_ONE_SPACE 1600
#define PANAVOX_AC_ZERO_SPACE 600
#define PANAVOX_AC_RPT_SPACE 5400
#define PANAVOX_AC_END_SPACE 0

#define PANAVOX_AC_FAN_SPEED_0  5
#define PANAVOX_AC_FAN_SPEED_1  4
#define PANAVOX_AC_FAN_SPEED_2  2
#define PANAVOX_AC_FAN_SPEED_3  1

#define PANAVOX_AC_SIGN         0x0B
#define PANAVOX_AC_CMD_MODE 2
#define PANAVOX_AC_CMD_EXTRA 5

enum {
AC_MODE_OFF = 0,
AC_MODE_AUTO = 1,
AC_MODE_COOL = 2,
AC_MODE_HEAT = 3,
AC_MODE_DRY = 4,
AC_MODE_FAN = 5
};

typedef unsigned char ac_mode_t;

typedef struct panavox_ac_cmd_t {
unsigned char type :4;
unsigned char sign :4;
unsigned char param1;
unsigned char param2;
} panavox_ac_cmd_t;

typedef struct panavox_ac_cmd_mode_param1_t {
unsigned char ext :5; // Fill with ones
unsigned char fan_speed :3;
} panavox_ac_cmd_mode_param1_t;

typedef struct panavox_ac_cmd_mode_param2_t {
unsigned char ext :2;
unsigned char mode :2;
unsigned char temp :4;
} panavox_ac_cmd_mode_param2_t;

typedef struct panavox_ac_cmd_mode_t {
unsigned char type :4;
unsigned char sign :4;
panavox_ac_cmd_mode_param1_t param1;
panavox_ac_cmd_mode_param2_t param2;
} panavox_ac_cmd_mode_t;

typedef enum {
PANAVOX_AC_MODE_COOL = 0,
PANAVOX_AC_MODE_DRY_FAN = 1,
PANAVOX_AC_MODE_AUTO = 2,
PANAVOX_AC_MODE_HEAT = 3
} panavox_ac_mode_t;

typedef struct panavox_ac_mode_state_t {
ac_mode_t mode;
unsigned char fan_speed;
unsigned char temp;
} panavox_ac_mode_state_t;


#endif /* _IR_PANAVOX_AC_H_ */


Code: [Select]

/*
 * IRsendPanavoxAC.cpp
 *
 *  Created on: 11 dic. 2016
 *      Author: Gabriel Roldán
 */

#include "IRPanavoxAC.h"
#include "IRsendPanavoxAC.h"

void IRsendPanavoxAC::sendPacket(uint32_t value) {
uint8_t* data = (uint8_t*) &value;

mark(PANAVOX_AC_HDR_MARK);
space(PANAVOX_AC_HDR_SPACE);

for (int i = 0; i < 3; i++) {
sendByte(data[i]);
sendByte(~data[i]);
}

mark(PANAVOX_AC_BIT_MARK);
}

void IRsendPanavoxAC::send(uint32_t* value) {
enableIROut(PANAVOX_AC_FREQ);

sendPacket(*value);
space(PANAVOX_AC_RPT_SPACE);
sendPacket(*value);
space(PANAVOX_AC_END_SPACE);
}

void IRsendPanavoxAC::sendByte(uint8_t data) {
for (int i = 7; i >= 0; i--) {
mark(PANAVOX_AC_BIT_MARK);
if (CHECK_BIT(data, i)) {
space(PANAVOX_AC_ONE_SPACE);
} else {
space(PANAVOX_AC_ZERO_SPACE);
}
}
}

uint8_t IRsendPanavoxAC::encodeTemp(uint8_t temp) {
uint8_t value = temp - 17;
if (value == 10 || value == 11)
value += 4;
return value ^ (value >> 1);
}

bool IRsendPanavoxAC::isValidState(panavox_ac_mode_state_t* state) {
if (state->fan_speed > 3) {
return false;
}

if (state->temp < 17 || state->temp > 30) {
return false;
}

return true;
}

void IRsendPanavoxAC::sendMoveFlap(void) {
panavox_ac_cmd_t cmd;

cmd.sign = PANAVOX_AC_SIGN;
cmd.type = PANAVOX_AC_CMD_MODE;
cmd.param1 = 0x0F;
cmd.param2 = 0xE0;

send((uint32_t*) &cmd);
}

void IRsendPanavoxAC::sendSwapLight(void) {
panavox_ac_cmd_t cmd;

cmd.sign = PANAVOX_AC_SIGN;
cmd.type = PANAVOX_AC_CMD_EXTRA;
cmd.param1 = 0xF5;
cmd.param2 = 0xA5;

send((uint32_t*) &cmd);
}

void IRsendPanavoxAC::sendSuperMode(void) {
panavox_ac_cmd_t cmd;

cmd.sign = PANAVOX_AC_SIGN;
cmd.type = PANAVOX_AC_CMD_EXTRA;
cmd.param1 = 0xF5;
cmd.param2 = 0xA2;

send((uint32_t*) &cmd);
}

void IRsendPanavoxAC::sendAutoClean(void) {
panavox_ac_cmd_t cmd;

cmd.sign = PANAVOX_AC_SIGN;
cmd.type = PANAVOX_AC_CMD_EXTRA;
cmd.param1 = 0xF5;
cmd.param2 = 0xAA;

send((uint32_t*) &cmd);
}

void IRsendPanavoxAC::sendFlapOscillation(void) {
panavox_ac_cmd_t cmd;

cmd.sign = PANAVOX_AC_SIGN;
cmd.type = PANAVOX_AC_CMD_MODE;
cmd.param1 = 0x6B;
cmd.param2 = 0xE0;

send((uint32_t*) &cmd);
}

void IRsendPanavoxAC::sendShutdown(void) {
panavox_ac_cmd_t cmd;

cmd.sign = PANAVOX_AC_SIGN;
cmd.type = PANAVOX_AC_CMD_MODE;
cmd.param1 = 0x7B;
cmd.param2 = 0xE0;

send((uint32_t*) &cmd);
}

bool IRsendPanavoxAC::sendModeCmd(panavox_ac_mode_state_t* state) {
uint8_t FAN_SPEEDS[] = { PANAVOX_AC_FAN_SPEED_0, PANAVOX_AC_FAN_SPEED_1,
PANAVOX_AC_FAN_SPEED_2, PANAVOX_AC_FAN_SPEED_3 };

panavox_ac_cmd_t cmd;
panavox_ac_cmd_mode_t* cmd_mode = (panavox_ac_cmd_mode_t*) &cmd;

if (!isValidState(state))
return false;

cmd.sign = PANAVOX_AC_SIGN;
cmd.type = PANAVOX_AC_CMD_MODE;

cmd_mode->param1.ext = 0x1F;
cmd_mode->param2.ext = 0;

cmd_mode->param1.fan_speed = FAN_SPEEDS[state->fan_speed];
cmd_mode->param2.temp = encodeTemp(state->temp);

if (state->mode == AC_MODE_OFF) {
cmd.param1 = 0x7B;
cmd.param2 = 0xE0;
} else if (state->mode == AC_MODE_AUTO) {
cmd_mode->param2.mode = PANAVOX_AC_MODE_AUTO;
cmd_mode->param1.fan_speed = 0;
} else if (state->mode == AC_MODE_DRY) {
cmd_mode->param2.mode = PANAVOX_AC_MODE_DRY_FAN;
cmd_mode->param1.fan_speed = 0;
} else if (state->mode == AC_MODE_FAN) {
cmd_mode->param2.mode = PANAVOX_AC_MODE_DRY_FAN;
cmd_mode->param2.temp = 0x0E;
} else if (state->mode == AC_MODE_COOL) {
cmd_mode->param2.mode = PANAVOX_AC_MODE_COOL;
} else if (state->mode == AC_MODE_HEAT) {
cmd_mode->param2.mode = PANAVOX_AC_MODE_HEAT;
} else
return false;

send((uint32_t*) &cmd);
return true;
}




Desde ya muchas gracias,
Saludos


surbyte

Bueno, has hecho un lío de códigos que me pierde.
Cual es el código con extensión .ino que usas?

Te recuerdo que Arduino requiere una estructura de este tipo

Code: [Select]

// Variables y constantes GLOBALES

void setup() {} // lo que quieres que se ejecute cuando Arduino se energiza

void loop() {} // lo que se ejecuta en cada ciclo del loop

jazpiroz

Estimados, este es el código arduino que tengo:

Code: [Select]

//#include <IRdecodePanavoxAC.h>
#include <IRPanavoxAC.h>
#include <IRsendPanavoxAC.h>

#include <IRLib.h>
#include <IRLibMatch.h>
#include <IRLibTimer.h>


IRsendPanavoxAC emitter;
int count;
char fanspeed='5';
char temperatura='A';
ac_mode_t mode;
panavox_ac_mode_state_t state;

void setup() {
  Serial.begin(9600);
  //count = 0;
}

void loop() {
  //count++;
  //valores en irpanavoxAC.h

  /*
     AC_MODE_OFF = 0,
     AC_MODE_AUTO = 1,
     AC_MODE_COOL = 2,
     AC_MODE_HEAT = 3,
     AC_MODE_DRY = 4,
     AC_MODE_FAN = 5
   
   */

  mode = AC_MODE_COOL; 
  state.mode = mode;//'0'; //cool
  state.fan_speed = '1'; //velocidad fan
  state.temp = '20'; //temperatura   
  int result = emitter.sendModeCmd(&state); //modo cool
 
   
  //emitter.sendShutdown(); //apaga
  //Serial.print("SENDING DATA: ");
  //Serial.println(count);
  delay(10000);
}

Go Up