Problema ao decodificar controle remoto de A/C

Boa noite, sou novo no fórum, porem tenho Arduíno como hobby a algum tempo.

Estou com um problema ao decodificar um controle remoto de Ar Condicionado da marca Rheen ZH/JT-01, tentei inclusive usando os exemplos da library IRRemote porem sempre retorna FFFFFFFF. tentei então usar o exemplo aqui do forum, capturando o Raw. Obtive o seguinte:

unsigned int raw[194] = {550,1550,550,1650,550,1650,500,1650,500,1650,550,1600,600,1650,500,1650,500,600,550,600,500,600,550,650,450,650,450,600,500,600,550,600,500,1700,450,1650,550,1650,550,1600,500,1650,600,1600,550,1600,600,1600,500,600,550,600,550,600,450,600,550,600,500,600,550,600,550,550,500,1650,550,1650,550,1600,550,1650,500,1650,550,1600,600,1600,550,1650,500,600,550,600,450,650,550,600,500,600,500,600,550,600,500,600,500,1600,600,1600,550,600,500,1650,550,1600,600,1600,500,1700,500,1650,550,600,500,600,550,1600,550,600,500,600,550,600,500,600,500,600,550,600,450,1650,600,1600,550,600,500,1650,550,1600,550,1650,500,1650,550,1650,550,600,450,650,500,1650,550,600,450,650,550,550,500,650,500,600,550,1600,550,600,500,1650,550,600,450,1650,600,600,500,600,500,1650,550,600,500,1650,500,600,550,1600,550,600,550,1600,550,1650,500,};

e estou enviando assim:
irsend.sendRaw(raw,194,38);

porem... continua sem funcionar. Se alguém tiver alguma dica, agradeço antecipadamente.

Diego, esse analisador Lógico com Arduino poderá ajudá-lo.

Veja essa aplicação com sensores de infra-vermelho:

E como ligaste o teu sensor?

Que arduino estás a usar? 194 integers pode ser demais para alguns arduinos.

Gustavo_Murta:
Diego, esse analisador Lógico com Arduino poderá ajudá-lo.
http://forum.arduino.cc//index.php?topic=197055.0

Veja essa aplicação com sensores de infra-vermelho:
http://letsmakerobots.com/node/31422

Valeu pela dica Gustavo_Murta, assim que chegar em casa vou analisar e posto o resultado. Todos meu outros aparelhos estão funcionando normalmente com esta biblioteca exemplo: TV, Som e Receptor SKY, somente os A/C que estão com esse problema.

@ bubulindo

Tive que modificar o RAWBUF da biblioteca IRRemote de 100 para 200 pois meu controle tem um protocolo muito grande.

IRRemote.h

#define USECPERTICK 50
#define RAWBUF 200

#define MARK_EXCESS 100

#endif

@ bubulindo
Estou usando o Arduíno mega e o array consegui com este sketch:

#include <IRremote.h>

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

int c = 1;

void dump(decode_results *results) {
  int count = results->rawlen;
  Serial.println(c);
  c++;
  Serial.println("For IR Scope: ");
  for (int i = 1; i < count; i++) {
   
	if ((i % 2) == 1) {
  	Serial.print("+");
  	Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
	}
	else {
  	Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
	}
	Serial.print(" ");
  }
  Serial.println("");
  Serial.println("For Arduino sketch: ");
  Serial.print("unsigned int raw[");
  Serial.print(count, DEC);
  Serial.print("] = {");
  for (int i = 1; i < count; i++) {
   
	if ((i % 2) == 1) {
  	Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
	}
	else {
  	Serial.print((int)results->rawbuf[i]*USECPERTICK, DEC);
	}
	Serial.print(",");
  }
  Serial.print("};");
  Serial.println("");
  Serial.print("irsend.sendRaw(raw,");
  Serial.print(count, DEC);
  Serial.print(",38);");
  Serial.println("");
  Serial.println("");
}

void loop() {
  if (irrecv.decode(&results)) {
	dump(&results);
	irrecv.resume(); // Receive the next value
  }
}

200 integers para um comando? Não parece um pouco exagerado?

Tens a certeza acerca dos 38kHz? Isto porque a tua função de decode assume que o comando está a funcionar em 38kHz...

Serial.print(",38);");

Parece-me extremamente improvável que seja isto... mas nunca se sabe.
A outra coisa que pode estar mal é o hardware... como ligaste o hardware? Tens um osciloscópio ou analisador para ver isso? Ligaste o led emissor onde? Em que pino?

Usaste a função enableIROut(int khz);
?

Nota também que, no Arduino Mega, o LED emissor tem de estar ligado no pino 9 (OC2B). No Uno e parecidos é que é no pino 3 como é referido no site da biblioteca.

bubulindo:
200 integers para um comando? Não parece um pouco exagerado?

Tens a certeza acerca dos 38kHz? Isto porque a tua função de decode assume que o comando está a funcionar em 38kHz...

Serial.print(",38);");

Parece-me extremamente improvável que seja isto... mas nunca se sabe.
A outra coisa que pode estar mal é o hardware... como ligaste o hardware? Tens um osciloscópio ou analisador para ver isso? Ligaste o led emissor onde? Em que pino?

Usaste a função enableIROut(int khz);
?

Nota também que, no Arduino Mega, o LED emissor tem de estar ligado no pino 9 (OC2B). No Uno e parecidos é que é no pino 3 como é referido no site da biblioteca.

Com relação ao pino e ao hardware, esta tudo certo, pois consigo controlar a TV, Decodificar SKY e Som.

Já falando do RAWBUF LENGTH, na página do IRRemote, já existe uma atualização falando sobre o tamanho do RAWBUF.

Acredito que o problema seja outro, estou preparando a dica do amigo Gustavo_Murta, para analisar o comando. O engraçado é que tenho 5 aparelhos de A/C em casa, 3 de marcas diferentes e não consigo controlar nenhum. Já os outros eletrodomésticos controlo perfeitamente.

bubulindo:
E como ligaste o teu sensor?

Que arduino estás a usar? 194 integers pode ser demais para alguns arduinos.

Quando uso o sketch exemplo do IRRemote obtenho a array abaixo, o incomum é que fica "FFFFFFFF"

IRRecvdDump

A/C Rheem
FFFFFFFF (0 bits)
Raw (194): -7300 550 -1650 550 -1600 550 -1650 500 -1650 550 -1650 500 -1650 550 -1650 500 -1650 550 -600 500 -600 550 -600 500 -600 550 -550 500 -650 500 -600 550 -600 500 -1650 550 -1600 550 -1650 550 -1600 550 -1650 550 -1600 550 -1650 550 -1600 550 -600 550 -600 500 -550 550 -650 450 -600 550 -550 550 -600 550 -600 500 -1650 500 -650 450 -1700 500 -1650 550 -1650 500 -1650 550 -1650 500 -1700 500 -600 500 -1650 550 -600 500 -600 550 -600 500 -550 600 -550 500 -650 500 -1600 550 -600 550 -600 500 -1650 550 -1600 550 -1650 550 -1600 550 -1650 550 -600 500 -1650 550 -1600 550 -600 550 -550 500 -600 550 -600 550 -600 500 -600 500 -1650 550 -1650 550 -600 450 -1700 500 -1650 500 -1700 500 -1650 500 -1650 600 -600 450 -600 550 -1600 550 -600 550 -600 500 -600 500 -600 500 -650 500 -1650 550 -600 500 -1650 550 -600 500 -1650 550 -600 500 -600 500 -1650 500 -650 500 -1650 550 -600 500 -1600 600 -600 500 -1600 600 -1600 550

A/C Midea
3BC3AD86
Unknown encoding: 3BC3AD86 (32 bits)
Raw (100): -19532 4350 -4350 500 -1600 550 -550 550 -1600 550 -1550 650 -450 550 -500 550 -1600 550 -550 550 -500 550 -1650 500 -550 550 -550 500 -1600 550 -1600 550 -550 550 -1600 600 -500 500 -550 550 -1600 500 -1600 550 -1600 550 -1600 550 -1650 500 -1600 600 -1550 550 -1600 550 -550 500 -550 550 -500 550 -550 550 -550 500 -550 550 -550 600 -500 500 -1600 550 -550 500 -550 550 -550 500 -550 550 -500 550 -1600 550 -1600 550 -550 550 -1600 550 -1550 550 -1600 550 -1600 550 -1600 550

Certamente que não é isto... mas no primeiro exemplo que colocaste, tinhas valores positivos... aqui tens valores negativos.

Esse 0xfffff está definido no código:

// Decoded value for NEC when a repeat code is received
#define REPEAT 0xffffffff

Será que o protocolo é o NEC?

bubulindo:
Certamente que não é isto... mas no primeiro exemplo que colocaste, tinhas valores positivos... aqui tens valores negativos.

Esse 0xfffff está definido no código:

// Decoded value for NEC when a repeat code is received

#define REPEAT 0xffffffff




Será que o protocolo é o NEC?

Caros amigos, finalmente consegui. Mudei o "_GAP" de 5000 para 50000.

Obtive o código :

unsigned int raw[198] = {6050,7350,500,1650,550,1600,550,1650,500,1650,600,1600,550,1600,550,1650,500,1650,550,600,550,600,500,600,500,600,500,600,500,650,500,600,500,600,550,1650,500,1650,550,1600,550,1650,550,1600,550,1650,550,1650,500,1650,500,650,450,650,500,600,550,600,500,600,550,550,550,600,500,600,550,1600,550,1600,550,1650,500,1650,600,1600,550,1600,550,1650,500,1650,550,600,550,600,500,600,550,550,500,650,450,650,500,600,550,550,550,1650,500,1650,550,600,500,1650,550,1600,550,1650,500,1650,550,1650,550,600,500,600,500,1650,550,600,500,600,550,550,550,600,500,600,500,1650,550,600,500,1650,550,1600,550,1650,500,650,450,1700,550,1600,550,600,500,1650,550,600,500,600,550,600,500,1600,550,600,550,600,500,600,500,1650,550,600,500,1650,500,600,550,1650,500,600,500,650,500,1650,500,650,450,1650,600,550,500,1650,550,600,550,1600,550,1600,550,7300,550,};
irsend.sendRaw(raw,198,38);

O motivo do código ser grande é que o A/C envia todas as informações a cada vez que você pressiona o botão, Velocidade, temperatura, modo e outros mais.

Agradeço a todos pela ajuda.

@bubulindo
@Gustavo_Murta

E isso funciona agora para ambos os AC?

bubulindo:
E isso funciona agora para ambos os AC?

Este código é o de ligar o da sala, mas capturei o dos quartos também, e funcionam perfeitamente.

Agora é decifrar o código para poder mandar comandos para controlar a temperatura, funções, direção do vento... :slight_smile:

DiegoCarrilho

vc so modificar o valor do _GAP? tem alguma diferença entre o mega e o uno?

DiegoCarrilho:

bubulindo:
E isso funciona agora para ambos os AC?

Este código é o de ligar o da sala, mas capturei o dos quartos também, e funcionam perfeitamente.

Ola Diego, percebi que você conseguiu resolver seu problema com a leitura do controle do ar condicionado, e eu estou querendo começar a fazer algo com o arduino na mesma ideia que a sua, tem como me falar o que você usou para fazer o projeto, como você fez para capturar os codigos do infra?

Obrigado pela atenção!

lonG:
DiegoCarrilho

vc so modificar o valor do _GAP? tem alguma diferença entre o mega e o uno?

no próprio sketch existe um comentário do autor falando sobre o _GAP, portanto acredito que deve funcionar tanto para o UNO como para o MEGA.

Como o controle do A/C envia sempre todos os parâmetros, o Arduíno não conseguia receber o código raw por completo.

Finalmente consegui fazer ligar :smiley:
agora vou explorar a velocidade e a mudanca de temperatura.
Acabei modificando o que o Diego havia feito.. o valor do _GAP e o rawbuf
obg

Realizei essas 2 modificações nos códigos da biblioteca e continua nao funcionando, não consigo nem para a TV que nao reconhece o protocolo, deixando somente o raw, o decodificador da OI TV ele identifica com RC6 mas quando envio o codigo não acontece nada. Anexei a foto da placa e do codigo.

//Usando a OI TV que seria o mais simples que nao funciona:
irsend.sendRC6(0x8072A60C, 36);

Quando leio o A/C no botão de ligar ele retorna:

D3AF57AD
Unknown encoding: D3AF57AD (32 bits)
Raw (200): 13466 150 24286 750 -17500 3150 -8750 650 -350 600 -1350 650 -350 600 -400 600 -400 600 -400 550 -400 600 -400 600 -400 550 -1400 600 -400 550 -450 550 -1400 600 -400 600 -400 550 -1400 600 -1350 600 -1400 600 -1350 600 -1350 600 -500 500 -450 550 -450 500 -500 500 -500 500 -450 550 -450 550 -450 500 -450 550 -450 550 -450 550 -450 500 -450 550 -450 550 -450 550 -450 500 -500 500 -450 550 -450 500 -500 500 -500 500 -500 500 -500 450 -500 500 -500 500 -500 500 -450 550 -450 500 -500 500 -500 500 -450 550 -450 500 -1400 600 -1400 550 -1400 600 -1400 550 -2900 3000 -8850 550 -1450 550 -450 500 -500 500 -500 500 -500 500 -450 550 -450 500 -500 500 -450 550 -1350 600 -500 500 -450 550 -1400 550 -500 500 -1400 550 -1400 600 -1400 550 -1400 600 -1400 600 -1400 550 -450 550 -450 500 -500 500 -500 500 -450 550 -450 500 -500 500 -450 550 -500 500 -450 500 -500 500 -500 500 -500 450 -500 500 -500 500 -500 500 -500 500 -450 500 

//Para Enviar acredito que seria assim:
//Tirando o primeiro numero, e tornando os negativos para positivos

unsigned int S_pwr[]={150, 24286, 750, 17500, 3150, 8750, 650, 350, 600, 1350, 650, 350, 600, 400, 600, 400, 600, 400, 550, 400, 600, 400, 600, 400, 550, 1400, 600, 400, 550, 450, 550, 1400, 600, 400, 600, 400, 550, 1400, 600, 1350, 600, 1400, 600, 1350, 600, 1350, 600, 500, 500, 450, 550, 450, 500, 500, 500, 500, 500, 450, 550, 450, 550, 450, 500, 450, 550, 450, 550, 450, 550, 450, 500, 450, 550, 450, 550, 450, 550, 450, 500, 500, 500, 450, 550, 450, 500, 500, 500, 500, 500, 500, 500, 500, 450, 500, 500, 500, 500, 500, 500, 450, 550, 450, 500, 500, 500, 500, 500, 450, 550, 450, 500, 1400, 600, 1400, 550, 1400, 600, 1400, 550, 2900, 3000, 8850, 550, 1450, 550, 450, 500, 500, 500, 500, 500, 500, 500, 450, 550, 450, 500, 500, 500, 450, 550, 1350, 600, 500, 500, 450, 550, 1400, 550, 500, 500, 1400, 550, 1400, 600, 1400, 550, 1400, 600, 1400, 600, 1400, 550, 450, 550, 450, 500, 500, 500, 500, 500, 450, 550, 450, 500, 500, 500, 450, 550, 500, 500, 450, 500, 500, 500, 500, 500, 500, 450, 500, 500, 500, 500, 500, 500, 500, 500, 450, 500};
 
irsend.sendRaw(S_pwr,200,32);

O que pode ser?
Estou usando o KSM603LM para capturar o IR.

Qual o modelo do seu A/C?
Ja tentou capturar o valor da sua TV sem modificar aqueles valores?
na imagem tais conectando no pino 11 msm para receber o sinal?
qual sketch tais usando para capturar?

lonG:
Qual o modelo do seu A/C?
Ja tentou capturar o valor da sua TV sem modificar aqueles valores?
na imagem tais conectando no pino 11 msm para receber o sinal?
qual sketch tais usando para capturar?

Ola, ontem depois de muitas tentativas eu consegui :smiley:

Abraços!

murliky:
Ola, ontem depois de muitas tentativas eu consegui :smiley:

Abraços!

Como?