Programacion Control IR

Buenas a todos, estoy programando un control IR ,observando y aprendiendo pude encender leds con las diferentes teclas del control remoto( asignaba un led por cada tecla), sabiendo que cada tecla del control tiene un codigo determinado, lo discriminaba con el condicional IF o el SWITCH y asi encendia distintos leds(en su salida digital).

Resulta que ahora lo que quiero hacer es encender un led presionando 2 teclas consecutivas, es decir, por ejemplo presiono la tecla 1 ,luego la tecla OK y me encienda asi un led.
La idea es cada vez que presione la tecla de un numero y luego la tecla OK ( u otra) se encienda un determinado lel.
Espero que me puedan ayudar orientándome como debo hacer para lograrlo, desde ya muchas gracias.
Saludos gente.

Bueno para hacer eso requieres que se den dos condiciones en el orden correcto.
Entonces la idea sería que cuando presiones una tecla actives un incrementes un contador de digamos tecla1 presionada.
Cuando presionas OK verificas si hay una tecla1 presionada previa y entonces confirmas la operación.

Moderador:
Ahora te hago la indicación de por qué edité tu título.
Por favor lee las normas de este foro. En ellas se explica que Ayuda es una palabra considerada INUTIL porque el foro solo brinda Ayuda asi que para que indicarlo en el título?

Gracias

Antes que todo muchas gracias y mil disculpas por el error cometido sobre el titulo.

Realicé un codigo que presionando la tecla "1" o "2" del control IR y luego,seguidamente, apretando la tecla "0" me encienda un led durante un retardo.
El problema que en el monitor serie y en el encendido del ledo no toma las lecturas de los botones presionados.
Me podrias ayudar en que me estoy equivocando?
Desde ya muchas gracias.
Adjunto el codigo realizado.


#include "IRremote.h"
int receiver = 11;
int tecla = 0;

IRrecv irrecv(receiver);
decode_results results;

void setup()
{
Serial.begin(9600);
irrecv.enableIRIn();
pinMode(2, OUTPUT);

}

void loop()
{
if (irrecv.decode(&results))

{
if ( results.value == 0x00FFA25D ) // boton 1
{Serial.println("Tecla: 1");
tecla=1;
}
if( results.value == 0x00FF629D) // boton 2
{Serial.println("Tecla: 2");
tecla=2;

}
delay(300);
irrecv.resume();

}

if (irrecv.decode(&results))
{
if ( results.value == 0x00FF9867 ) //boton 0
{ Serial.println("Tecla: 00");
if ( tecla == 1 )
{
digitalWrite(2,HIGH);
delay(6000);
digitalWrite(2, LOW);
tecla=0;
}
if ( tecla == 2 )
{
digitalWrite(2,HIGH);
delay(6000);
digitalWrite(2, LOW);
tecla=0;
}

}
delay(300);
irrecv.resume();

}

}

Hola, yo estoy realizando un proyecto similar. Te cuento como lo hago y a ver si te puede servir de ayuda.

En mi proyecto tengo varios receptores y cada uno tiene un codigo numerico de 1 o 2 cifras. Es decir de 1 a 99. Lo que quiero es que cuando se marque el codigo del receptor con el mando este se encienda. Además cuando se pulsen ciertas teclas especiales se realice una función determinada en el último receptor que se ha encendido.

Basicamente lo que utilizo es un gestor de estados:

  • estado 0: no tengo nada en la entrada de datos
  • estado 1: acaba de entrar un dato valido (tecla del mando correcta 0-9, teclas especiales)
  • estados 2-5: tengo una entrada en el buffer y espero a ver si entra una segunda.
  • estado 6: han pasado 5 estados anteriores sin recibir ninguna entrada, no espero más y ejecuto la orden.

En el caso 1 he de mirar si el buffer esta vacio en cuyo caso pasará a ser el valor introducido, o si ya tengo un valor (por ejemplo "1"), en cuyo caso concatenamos el nuevo valor al buffer (por ejemplo recibimos un "2" y ahora el buffer valdrá "12"), si tenemos ya dos valores ignoramos lo que entra.

En cada vuenta del loop si el estado es distinto de 0, aumentamos su valor en 1.

El problema que tiene el codigo es que normalmente el segundo "if" no se realizará en el mismo loop y por tanto no creo que entres nunca en el. El programa es más rápido que tu pulsando los botones.

Aqui te pongo el loop que he usado. Espero que te sirva de referencia:

void loop() {
  if (irrecv.decode(&results)) {
    delay(100);
    newKey = results.value;
    // switch / case function
    if (index < 2) {
      switch (newKey) {
        case t_1 :  // Button '1' on my remote
          strValue[index++] = '1';
          state = 1;    
          break;   // assign number to button press
        case t_2 :  // Button '2' on my remote
          strValue[index++] = '2';
          state = 1;    
          break;
        case t_3 :  // Button '3' on my remote
          strValue[index++] = '3';
          state = 1;    
          break;
        case t_4 :  // Button '4' on my remote
          strValue[index++] = '4';
          state = 1;    
          break;
        case t_5 :  // Button '5' on my remote
          strValue[index++] = '5';
          state = 1;    
          break;
        case t_6 :  // Button '6' on my remote
          strValue[index++] = '6';
          state = 1;    
          break;
        case t_7 :  // Button '7' on my remote
          strValue[index++] = '7';
          state = 1;    
          break;
        case t_8 :  // Button '8' on my remote
           strValue[index++] = '8';
          state = 1;    
           break;
        case t_9 :  // Button '9' on my remote
          strValue[index++] = '9';
          state = 1;    
          break;
        case t_0 :  // Button '0' on my remote
          strValue[index++] = '0';
          state = 1;    
          break;
        case t_m :  // Button 'Mute' on my remote
          strValue[0] = '-';
          strValue[1] = '1';
          index = 2;
          state = 1;    
          break;
        case info : // Button 'Info' on my remote
          strValue[0] = '-';
          strValue[1] = '2';
          index = 2;
          state = 1;    
          break;
        case t_g :  // Button 'Green' on my remote
          strValue[0] = '-';
          strValue[1] = '3';
          index = 2;
          state = 1;    
          break;
        case t_y :  // Button 'Yellow' on my remote
          strValue[0] = '-';
          strValue[1] = '4';
          index = 2;
          state = 1;    
          break;
        case t_b :  // Button 'Blue' on my remote
          strValue[0] = '-';
          strValue[1] = '5';
          index = 2;
          state = 1;    
          break;
        case t_r :  // Button 'Red' on my remote
          strValue[0] = '-';
          strValue[1] = '6';
          index = 2;
          state = 1;    
          break;
        default:
          prevKey = 0;    // clear
          break;
      }
    }  // end of cases    
    irrecv.resume(); // Receive the next value
  }
  else {
    delay(100);
    if (state != 0) {
      state = state + 1;
      if ((state == 6)||(index == 2)) { //estate = 6 or buffer = 2 chars
        state = 0;
        strValue[index] = 0;          // terminate the string with a 0
        index = 0;                    // reset index to receive other data
        // tratamos la entrada
        accumulVal = atoi(strValue);  // use atoi to convert string to an int
        check_call(accumulVal);
      }
    }
  }
} // loop end

check_call es la función que comprueba que el parametro es el del receptor por si tengo que encender o no el led.

Si tienes alguna duda, pregunta y a lo mejor puedo responderte.

Moderador
Por favor @ferglozano, edita tu post usando etiquetas de código.

Lee las Normas del foro