Pessoal estou com problemas ao receber o sinal (codigo) de um controle IR e retransmitir outro codigo IR. "Controle Universal".
O Arduino recebe normalmente o codigo certo mas não envia o outro codigo.
A parte eletronica esta correto. É algo no codigo que nao esta desabilitando o receptor na hora de transmitir.
Segue o codigo abaixo. Alguem pode me ajudar? TKS
?#?include? <IRremote.h>
int RECV_PIN = 12;
IRrecv irrecv(RECV_PIN);
decode_results results;
IRsend irsend;
void setup()
{
irrecv.enableIRIn(); -------SE RETIRAR FUNCIONA A TRANSMISSAO CORRETAMENTE MAS NAO RECEBE MAIS.
Serial.begin(9600);
}
void loop() {
while(irrecv.decode(&results))
{
long int decCode = results.value;
Serial.println(results.value);
irrecv.resume();
if (results.value == 16736925) {
for (int i = 0; i < 4; i++) {
irsend.sendNEC(0xAF518E7, 32);
delay(400);
irrecv.enableIRIn();
Já testaste se o envio de mensagem alguma vez funcionou?
Experimenta primeiro o envio de mensagens sem receberes e só depois tenta juntar as duas funcionalidades.
Eu fico com a ideia q estas a usar o mesmo arduino para enviar e receber, ou seja, comunicar com ele proprio.
Se assim for, bem isso não vai funcionar porque os IR não tem buffer, logo enquanto estas a enviar não vais conseguir estar a receber porque o arduino faz uma acção de cada vez.
Mas posso estar enganado, não consegui entender bem qual o propósito do teu projecto
Bubulindo:
Eu já testei o led transmissor! Atravez de uma câmera consigo ver ele transmitindo normalmente. Se eu usar o exemplo IRsendDemo da biblioteca IRremote, ele envia corretamente o código, usando a interface serial.
E se você reparar este no meu sketch eu so juntei a este exemplo de transmissão IRsendDemo com o outro exemplo que é para recepção IRrecv Demo.
Tsunamy_boy:
O projeto é somente com 1 arduino.
É um projeto para controlar o aparelho de TV que possuo.
Eu estou querendo fazer com que o arduino receba os sinais de um controle remoto qualquer e envie para a TV os códigos originais para controla-la.
Por exemplo: Quero trocar o canal da TV. Eu vou usar o outro controle remoto (qualquer), apertando a tecla na qual eu esta configurando no Sketch para enviar o código referente à troca de canal da TV.
OBS: Para ser mais preciso eu uso outro arduino como receptor para verificar se o codigo que esta sendo enviado é igual ao da TV. É onde esta o problema, o codigo enviado não é o correto.
Tu estás com um problema... e eu é que tenho de ir ver os exemplos para descobrir qual o teu problema?
Custa-te muito colocar aqui o exemplo que usaste para poder ver se o código que juntaste um ao outro está bem junto? Eu estou a dar-te parte do meu dia para te ajudar e tu ainda queres que gaste mais tempo a pesquisar as bibliotecas que usas porque tu não queres ter esse trabalho?
E experimentar na TV propriamente dita? Funciona? O tal Arduino de teste recebe bem quando tens o programa só de envio?
Olhando por alto o teu código não foi bem ligado... tu dizes ao Arduino para receber o próximo valor e depois pões-te a enviar de volta o valor.
void loop() {
if (irrecv.decode(&results)) { //se existe algo descodificado...
long int decCode = results.value;
Serial.println(results.value);
if (results.value == 16736925) { // se o que foi descodificado, é o que queremos receber...
for (int i = 0; i < 4; i++) { //não percebo este for... mas o artista aqui és tu...
irsend.sendNEC(0xAF518E7, 32);
delay(400);
}
}
irrecv.enableIRIn();
irrecv.resume(); //esta instrução pode até ser desnecessária...
}
}
Dá uma experimentadela assim... o segredo é juntar ambos os códigos, mas apenas fazer um de cada vez. Tu estavas a misturar tudo dentro dum while.
Nota também que durante sensivelmente 2 segundos após enviares um valor correcto, o teu arduino não vai responder de volta.... mas certamente que sabes porque é que isso acontece.
Caro bubulindo, imaginei que poderia saber como é esta biblioteca!
De qualquer forma segue as mesmas: Exemplo de transmissão e recepção.
O codigo que você me passou, também não funcionou. Ficou do mesmo jeito que o meu!
O que acontece, ele esta transmitindo um codigo "maluco" , ou seja transmitindo esta, mas transmite um codigo que esta errado!
Sim ja teste na TV. Com o exemplo da biblioteca (IRsendDemo) ele funciona perfeitamente. Mas repare que no void setup ele não usa a linha irrecv.enableIRIn(); (claro porque não tem receptor). No meu programa eu necessito usar esta linha, mas se retira - la e testar com a seria (send) ele envia o codigo correto.
O "tal" arduino recebe bem!
Pelo que eu estou entendedo, o receptor tem que ser desativado ao fazer a transmissão! Mas não sei como fazer isso.
void loop() {
if (irrecv.decode(&results)) { //se existe algo descodificado...
long int decCode = results.value;
if (results.value == 16736925) { // se o que foi descodificado, é o que queremos receber...
for (int i = 0; i < 4; i++) { //não percebo este for... mas o artista aqui és tu...
irsend.sendNEC(0xAF518E7, 32);
delay(400);
}
}
Serial.println(results.value);
irrecv.enableIRIn();
//irrecv.resume(); //esta instrução pode até ser desnecessária...
}
}
Duvido que seja isto, mas experimenta assim...
Outra coisa... o delay é mesmo de 400??
budulindo, não entendi, o código é o mesmo do anterior que vc me passou!!
Eu coloquei o "for" para emitir o código 4 vezes, somente para não ter que ficar dando o comando toda hora para ver se a transmissão esta certa.
E o delay(400) é so para dar um intervalo entre estas 4 vezes.
Rafael_K_A:
budulindo, não entendi, o código é o mesmo do anterior que vc me passou!!
Experimentaste???
ANTES:
void loop() {
if (irrecv.decode(&results)) { //se existe algo descodificado...
long int decCode = results.value;
Serial.println(results.value); // REPARA NESTA LINHA!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if (results.value == 16736925) { // se o que foi descodificado, é o que queremos receber...
for (int i = 0; i < 4; i++) { //não percebo este for... mas o artista aqui és tu...
irsend.sendNEC(0xAF518E7, 32);
delay(400);
}
}
irrecv.enableIRIn();
irrecv.resume(); //esta instrução pode até ser desnecessária...
}
}
DEPOIS:
void loop() {
if (irrecv.decode(&results)) { //se existe algo descodificado...
long int decCode = results.value;
//NÃO ESTÁ AQUI SERIAL.PRINT NENHUM....
if (results.value == 16736925) { // se o que foi descodificado, é o que queremos receber...
for (int i = 0; i < 4; i++) { //não percebo este for... mas o artista aqui és tu...
irsend.sendNEC(0xAF518E7, 32);
delay(400);
}
}
Serial.println(results.value);//EM VEZ DISSO ESTÁ AQUI!!!!!!!!!!!!!!!!!!!
irrecv.enableIRIn();
//irrecv.resume(); //esta instrução pode até ser desnecessária...
}
}
O código não é igual. É uma diferença minúscula, é certo, mas não é igual.
Como a porta série é bufferizada, se fizeres um print antes de usares algo com temporizações muito apertadas, pode acontecer que a transmissão de dados estrague as temporizações.
A biblioteca não desliga a porta série para enviar e receber... logo é uma possibilidade. Pelo que li, se enviares algo desactivas o receptor e vice-versa, pelo que a única coisa mais óbvia que me salta à vista é isto da porta série.
E no exemplo que experimentaste?? Estava lá um for para repetir o comando 4 vezes?
É meu caro, nao deu certo também! Esta do mesmo jeito!
O exemplo tem um "for" com 3 vezes.
Eu experimentei seu codigo e retirei tambem o "for", ficou do mesmo jeito.
Sera que existe um codigo, função para desabilitar a recepção assim como o irrecv.enableIRIn(); para habilita-la?
Na verdade eu não tenho testado! Nem sei como fazer. Eu ja coloquei esta funçao enable.IROut(); no codigo e nao surte efeito. Porem se eu coloca-la no void setup, ela para o receptor.
Eu ultilizei esse codigo abaixo para testar as partes. Parece que ele esta fazendo isso sim, corretamente. Veja so:
#include <IRremote.h>
int RECV_PIN = 12;
IRrecv irrecv(RECV_PIN);
decode_results results;
IRsend irsend;
void setup()
{
irrecv.enableIRIn();
Serial.begin(9600);
}
long int decCode = 0;
void loop() {
if(irrecv.decode(&results)) {
decCode = results.value;
Serial.println(decCode, HEX);
irrecv.resume();
}
if (decCode == 0xFF629D) {
Serial.println("Codigo Recebido");
Serial.println("Modo de Transmissao");
for (int i = 0; i < 4; i++) {
irsend.sendNEC(0xAF518E7, 32);
Serial.print("Enviado: ");
Serial.println(i+1);
delay(50);
}
Serial.println("Receptor ativado");
irrecv.enableIRIn();
decCode = 0;
}
}
Ao acompanhar pela serial ficou assim:
FF629D
Codigo Recebido
Modo de Transmissao
Enviado: 1
Enviado: 2
Enviado: 3
Enviado: 4
Receptor ativado
O enableIROut, muito provavelmente nem compila já que é uma função privada.
Rafael_K_A:
Na verdade eu não tenho testado!
Importas-te de explicar melhor isto do não tens testado???
O código que mostraste agora parece correcto. Se não tens testado, nem sabes como testar, andas aqui a gozar com a gente? Explica-te melhor para ver se nos entendemos.
budulindo, eu não fiz um teste mais especifico.
Eu percebo pelo seguinte passo, se eu retirar o irrecv.enableIRIn(); dessa parte do codigo que esta abaixo. Eu so consigo transmitir uma unica vez, pq o receptor para de receber. Isso mostra que ele esta parando. Ja colocando esta mesma funcao irrecv.enableIRIn(); o repetor funciona direto.
for (int i = 0; i < 4; i++) {
irsend.sendNEC(0xAF518E7, 32);
Serial.print("Enviado: ");
Serial.println(i+1);
delay(50);
}
Serial.println("Receptor ativado");
irrecv.enableIRIn(); //RETIRAR ESTE CODIGO O RECEPTOR PARA APOS A TRANSMISSAO
decCode = 0;
}
Fiz upload dele normalmente!
Testei no arduino que tem a recepção e a transmissão.
Liguei a TV pra ver, nao funcionou.
Depois usei o outro Arduino que tenho para fazer a recepção do codigo que p primeiro arduino transmite. E ficou na mesma.