Encender/Apagar led desde mando Infrarrojo (SOLUCIONADO)

Hola a todos, vereis, basandome en el esquema de montaje de la web frikadas con arduino control infrarrojo, conecte un receptor al arduino segun el esquema, todo salio bien a la primera recoje la lectura y las manda a la consola serial, el problema es el siguiente, quiero conectar un led, digamos a al pin 13 y que se encienda y apague dandole a una determinada tecla, es decir si pulsamos una vez se enciende y si volvemos a pulsar se apaga, con el codigo de lectura y un par de lineas mas casi que lo he conseguido, pero mientras en la consola de serial salen las lecturas perfectamente sin ningun fallo, es decir cada vez que pulso recoje la lectura, el led se enciende y apaga cada tres o cuatro pulsaciones, es decir que hay que darle muchas veces, al principio pense que podria deberse al tipico problema de rebotes de los interruptores y le añadi un par de variables, pero sigue igual, resumiendo, la lectura perfecta, entiende el valor de la tecla, pero enciende cuando le da la gana y apaga lo mismo, pero ojo solo cuando le doy a la tecla que quiero, con las demas nada, el codigo lo llevo asi:

#include <WProgram.h>
#include <NECIRrcv.h>
#define IRPIN 7 // pin that IR detector is connected t
int ledpin = 13;
boolean encendido;
boolean rebotes;
NECIRrcv ir(IRPIN) ;

void setup()
{
pinMode(ledpin, OUTPUT);
encendido =false;
rebotes =true;
Serial.begin(9600) ;
Serial.println("NEC IR code reception") ;
ir.begin() ;
}

void loop()
{
unsigned long ircode ;

while (ir.available()) {
ircode = ir.read() ;
Serial.print("got code: 0x") ;
Serial.println(ircode,DEC) ;
}
if (ir.read() ==2657221380 && encendido ==false && rebotes ==true){
digitalWrite(ledpin, HIGH);
encendido =true;
rebotes =false;
delay (ir.read() ==2657221380);
}
else if (ir.read() ==2657221380 && encendido ==true && rebotes ==true){
digitalWrite(ledpin, LOW);
encendido =false;
rebotes =false;
delay (ir.read() ==2657221380);
}
else if (ir.read() == 2657221380 && rebotes ==false){
rebotes =true;
}

}

la lectura 2657221380 es la tecla del mando en cuestion, he intentado usar una para encender y otra para apagar y lo mismo hay que darle muchas veces, (3 o 4 veces), y no se que mas intentar, es posible que sea porque la lectura es muy larga? lo que no entiendo es que recoja perfectamente la lectura que le manda el receptor y despues se trabe al encender el led.

un saludo y gracias

hola!! yo he realizado esa prueba y a mi me funciona perfectamente, puedes pasarte por mi blog www.tallerarduino.wordpress.com y ver el codigo que he hecho, pero con un simple delay de 50 ms yo creo k deberia bastar. Tienes un video para ver el funcionamiento. Si tienes más dudas no dudes en preguntar.

gracias tio, como te lo has currado, voy a estudiar tu codigo a fondo a ver si me llega la luz, oye veo que tu no has puesto delays, no obstante tambien intente lo de los delays y seguia igual.

gracias

Me he dado cuenta que yo uso otra libreria distinta a ti la IRremote.h, y si que uso un delay despues de cada lectura, un ejemplo para encende un led seria:

#include <IRremote.h>
#define RECV_PIN 12 //indicamos el pin por el que recibimos los datos del sensor TSOP1838
boolean encendido; //Variable donde compruebo si el led esta encendido o no
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
Serial.begin(9600);
pinMode(13,OUTPUT); //Pin 13 como salida
encendido=0; //indicamos estado inicial (apagado);
irrecv.enableIRIn(); // Iniciamos la recepcion
}

void loop()
{
//Si tenemos datos de lectura debido a que se pulsa una tecla en el mando
if (irrecv.decode(&results))
{
//Mostramos por puerte serie dicho codigo en Hexadecimal(para depuracion)
Serial.print("Codigo: 0x") ;
Serial.println(results.value,HEX) ;
//Comprobamos si es la TECLA 1
if(results.value==0x2FC827D)
{
//Comprobamos si esta encendido el led, si lo esta lo apagamos
if(encendido==1)
{
digitalWrite(13,LOW);
encendido=0;
}
//si no, lo encendemos
else
{
digitalWrite(13,HIGH);
encendido=1;
}
}
delay(50); //retardo de 50 ms para evitar que el codigo se lea dos veces en una pulsacion
irrecv.resume(); // Recibimos el siguiente valor del sensor
}
}

Como ves al final de realizar cada paso y antes de una nueva lectura hago un delay de 50 ms para evitar posibles rebotes o lecturas dobles. Espero que te sirva para solucionar tu problema, desde mi blog puedes descargar la libreria para los mandos infrarrojos, vale para varios tipos de ellos.

Tu crees que el problema es del Recptor/Lectura? mientras enciendo y apago el led estoy viendo la lectura desde la consola serial, y no veo que con una pulsacion se repita la lectura varias veces, o que no la lea, eso funciona perfecto, una pulsacion una lectura, yo mas bien creia que es la parte de los if, por cierto una cosa, en vez de un condensador de 4,7 le puse uno de 7, pero no creo que eso sea mi problema, porque repito la lectura me va perfecta, tu que opinas???

entiendo que si hubieran problemas de rebotes, en la pantalla serial ya lo notariamos, no??

un saludo y gracias.

pp.dd. voy a probar tu codigo a ver como me va, yo los delay los metia entre los corchetes de if, es decir:
if(........){
digitalWrite(.....);
delay(50);
}

veo que tu lo pones despues de cerrar los corchetes de if, voy a probarlo.

Ah yo no le tengo puesto condensador al circuito el sensor infrarrojo solo lo tengo conectado con una resistencia de 470 ohmios a vcc, la otra patilla a masa y la otra al pin de entrada configurado por programa, prueba a conectar segun te digo yo eliminando el condensador a ver que pasa.

Hola juanmagaor.

Igual estoy equivocado pero según mi corta experiencia con Arduino tienes una instrucción que al menos yo no le veo sentido:

delay (ir.read() ==2657221380);

Creo que tendrías que poner simplemente

delay (50);

¿O es que me estoy columpiando porque se me escapa algo?

Igual ya lo has solucionado, pero igualmente te dejo esta web que en su momento a mi me solucionó el problema que tu tienes, creo que esta interesante, el código es sencillo de manejar i sirve para casi cualquier mando, sin el casi, es multiprotocolo XD, saludos :wink:

Esa es la misma libreria que yo uso en mi programa la IRremote.h. A mi me funciona perfectamente tal y como se puede observar en mi blog. He probado con 3 tipos de mandos y me funcionan todos bien, menos algunas teclas del teclado iomega. Vosotros como conectais el circuito del sensor infrarrojo? yo he leido por ahi y buscado y al probar el que mejor me va es el que comento mas arriba, resistencia (yo pongo una de 470 ohmios) a vcc y a sensor, otra patilla a masa y la de la salida al pin de entrada del arduino.

Regata:
Esa es la misma libreria que yo uso en mi programa la IRremote.h. A mi me funciona perfectamente tal y como se puede observar en mi blog. He probado con 3 tipos de mandos y me funcionan todos bien, menos algunas teclas del teclado iomega. Vosotros como conectais el circuito del sensor infrarrojo? yo he leido por ahi y buscado y al probar el que mejor me va es el que comento mas arriba, resistencia (yo pongo una de 470 ohmios) a vcc y a sensor, otra patilla a masa y la de la salida al pin de entrada del arduino.

Yo que soi un poco chapuzas i falto en resistencias (parece un insulto i todo.. XD) lo enchufo a pelo al arduino.. :smiley: pero sin duda es mas correcto como lo enchufas tu. Tambien se puede hacer como pone en esta web http://www.sherkhan.net/blogs/frikadas/?p=331

http://www.sherkhan.net/blogs/frikadas/wp-content/uploads/2009/03/tsop4838-conexionado-1024x423.png

Hola y gracias por contestar, disculpad he estado toda la semana liado, Regata he probado tu codigo y va genial obedece a la primera solo le veo un inconveniente que nada mas arrancar la consola serial sin pulsar ningun boton del mando empieza recoger datos vacios 0x0 es decir esta continuamente en actividad, no se si es normal, con la libreria NEC no era asi.

A Cheyenne decirle que en principio tenia delay(50); pero esa linea que comenta es un ejemplo de las malas ideas a lo que nos lleva la desesperacion :slight_smile:

Entiendo que la continua recogida de datos es por la ultima linea:

delay(50); //retardo de 50 ms para evitar que el codigo se lea dos veces en una pulsacion
irrecv.resume(); // Recibimos el siguiente valor del sensor

bueno gracias a todos, un saludo

Hola juanmagaor. Realmente el código que pides es simple (y hay varios ejemplos por la red), pero hay que darse cuenta de pequeños fallitos como por ejemplo

if (ir.read() ==2657221380 && encendido ==false && rebotes ==true){

realmente deberás referirte al código como 0x2657221380 o no te funcionará. Casualmente ayer vi un receptor IR que tenía por aquí, aun no había probado nada y decidí coger un mando de la TV al azar y hacer el experimento que propones pero con tres leds, lo que viene a ser lo mismo. El código que usé adaptado al tuyo sería:

#include <IRremote.h>

int RECV_PIN = 9;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(13,OUTPUT);
  digitalWrite(13,LOW);
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    if(results.value==0x2657221380&& digitalRead(13)==LOW){
      digitalWrite(13,HIGH);
    } else if(results.value==0x2657221380&& digitalRead(13)==HIGH){
      digitalWrite(13,LOW);
    }
    irrecv.resume(); // Receive the next value
  }
}

Aunque tendrías que revisarlo y adaptarlo completamente a tus pines y códigos recibidos. Como ves, sin delay y solo muestra algo por serial si el receptor IR recibe alguna pulsación.

Uso la librería IRremote.h, veo que usas NECIRrcv.h, ahora no tengo tiempo de mirar las posibles ventajas que presenta respecto a IRremote.h, pero si te digo que esta que menciono funciona muy bien.

que tal amigos quisiera saber si alguien a intentado combinar el sistema a control remoto con un manual osea encender el led con el control y apagarlo con el boton y viseversa

yo tengo una duda y esque quiero que cuando pulse un boton del mando por ejemplo el pin 4 se me active mientras lo tengo pulsado y asi con 5 salidas podeis ayudarme porfavor?