Contador ascendente descendente con dos pulsadores de un mando IR

Hola estoy intentando programar el encendido a traves de dos botones de un mando IR.
Uno es para incrementar y el otro para decrementar.
Tengo tres leds y la intención es que cuando pulso el de incrementar se encienda el siguiente y se apague el anterior y lo mismo al reves con el otro botón del mando.
Tengo este código pero la condición que he creado cuando pulso el botón me ilumina el segundo y al cabo de poco el tercero.
He visto ejemplos pero con botones físicos pero no se como crear el mismo con la señal de infrarrojos del mando.

#include <IRremote.h>
#define RECV_PIN 11 //indicamos el pin por el que recibimos los datos del sensor
IRrecv irrecv(RECV_PIN);
decode_results results;
int contador =1;

void setup()
{
Serial.begin(9600);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);

irrecv.enableIRIn(); // Iniciamos la recepcion
}

void loop()

{

if (irrecv.decode(&results)) {
Serial.println(results.value, HEX); // imprime el valor en codigo hexadecimal
//irrecv.resume();
}

if(results.value ==0xFF18E7)
{
if(contador<3)
{
contador++;
Serial.print("Contador=");
Serial.println(contador);
delay(500);
}

delay(250);

irrecv.resume();
}

if(results.value ==0xFF30CF)

if(contador>1)
{
contador--;
Serial.print("Contador=");
Serial.println(contador);
delay(500);
irrecv.resume();
delay(500);

}

if (contador ==1) {
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
digitalWrite(8,LOW);
}
if (contador ==2) {
digitalWrite(7, HIGH);
digitalWrite(6,LOW);
digitalWrite(8,LOW);
}
if (contador ==3) {
digitalWrite(8,HIGH);
digitalWrite(7,LOW);
digitalWrite(6,LOW);
}
irrecv.resume();
delay(250);
}

Por favor edita tu post y adjunta el código de acuerdo a las Normas del Foro en Español, punto 7. También usa la opción "Autoformato" del menú "Herramientas" de la IDE antes de copiar el código así nos facilitas su lectura.

Falta una llave luego de

if(results.value ==0xFF30CF)

que debería ser algo como

if(results.value ==0xFF30CF) {
1 Like

Muchas gracias por la respuesta pero sigue activando el segundo y tercer LED.
No se si es porque tendría que crear otra condición de estado de la ultima lectura o reformular la condición del if.
Disculpa por no adjuntar el post según las normas de foro español es el primero que cuelgo.

Cuando corrijas el post y el código se vea como corresponde lo reviso.

Perfecto gracias ahora lo corrijo


#include <IRremote.h>
#define RECV_PIN 11 //indicamos el pin por el que recibimos los datos del sensor
IRrecv irrecv(RECV_PIN);
decode_results results;
int contador =1;



void setup()
{
Serial.begin(9600);
pinMode(6,OUTPUT); 
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);

irrecv.enableIRIn(); // Iniciamos la recepcion
}



void loop()
{

if (irrecv.decode(&results)) {
Serial.println(results.value, HEX); // imprime el valor en codigo hexadecimal
irrecv.resume();
}
  

if(results.value ==0xFF18E7) 
{
  if(contador<3)
  {
    contador++;
      Serial.print("Contador=");
      Serial.println(contador);
      delay(500);
  }
 

delay(250); 

irrecv.resume();                
}

if(results.value ==0xFF30CF){


 if(contador>1)
 {
    contador--;
      Serial.print("Contador=");
      Serial.println(contador);
      delay(500);
      irrecv.resume();
      delay(500);

  }
}

   if (contador ==1) {
    digitalWrite(6,HIGH);
    digitalWrite(7,LOW);  
    digitalWrite(8,LOW); 
  } 
  if (contador ==2) {
   digitalWrite(7, HIGH);
   digitalWrite(6,LOW);   
   digitalWrite(8,LOW); 
  }
  if (contador ==3) {
    digitalWrite(8,HIGH);
    digitalWrite(7,LOW);
    digitalWrite(6,LOW);
  }
irrecv.resume(); 
delay(250);
}

Abusas demasiado de:

irrecv.resume(); 

Yo tu código lo veo así:

#include <IRremote.h>
#define RECV_PIN 11 //indicamos el pin por el que recibimos los datos del sensor
IRrecv irrecv(RECV_PIN);
decode_results results;
int contador = 1;
int nueva;

void setup() {
  Serial.begin(9600);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  irrecv.enableIRIn(); // Iniciamos la recepcion
}

void loop() {
  if (irrecv.decode(&results)) {
    nueva = results.value;
    Serial.println(nueva, HEX); // imprime el valor en codigo hexadecimal

    if (nueva == 0xFF18E7) {
      if (contador < 3) {
        contador++;
        Serial.print("Contador=");
        Serial.println(contador);
        delay(500);
      }
    }

    if (nueva == 0xFF30CF) {
      if (contador > 1) {
        contador--;
        Serial.print("Contador=");
        Serial.println(contador);
        delay(500);
      }
    }

    if (contador == 1) {
      digitalWrite(6, HIGH);
      digitalWrite(7, LOW);
      digitalWrite(8, LOW);
    }
    if (contador == 2) {
      digitalWrite(7, HIGH);
      digitalWrite(6, LOW);
      digitalWrite(8, LOW);
    }
    if (contador == 3) {
      digitalWrite(8, HIGH);
      digitalWrite(7, LOW);
      digitalWrite(6, LOW);
    }
  }
  irrecv.resume(); 
}

La idea era que editaras el post #1...
Algo es algo. :wink:

Bueno, la librería ha cambiado, la forma en que la usas ya está obsoleta.
Más allá de eso, el error es la forma en que tratas los datos.


#include <IRremote.h>

#define RECV_PIN 11 //indicamos el pin por el que recibimos los datos del sensor
#define LED1 6
#define LED2 7
#define LED3 8

IRrecv irrecv(RECV_PIN);

int contador = 1;

void setup() {

  Serial.begin(9600);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(RECV_PIN, INPUT);
  digitalWrite(LED1, HIGH);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, LOW);
  irrecv.enableIRIn(); // Iniciamos la recepcion
}

void loop() {

  if (irrecv.decode()) {
    Serial.println(irrecv.decodedIRData.decodedRawData, HEX);

    if (irrecv.decodedIRData.decodedRawData == 0xFD02FF00) {
      if (contador < 3) {
        contador++;
        Serial.print("Contador=");
        Serial.println(contador);
      }
    }
    else if (irrecv.decodedIRData.decodedRawData == 0x6798FF00) {
      if (contador > 1) {
        contador--;
        Serial.print("Contador=");
        Serial.println(contador);
      }
    }
    if (contador == 1) {
      digitalWrite(LED1, HIGH);
      digitalWrite(LED2, LOW);
      digitalWrite(LED3, LOW);
    }
    else if (contador == 2) {
      digitalWrite(LED2, HIGH);
      digitalWrite(LED1, LOW);
      digitalWrite(LED3, LOW);
    }
    else if (contador == 3) {
      digitalWrite(LED3, HIGH);
      digitalWrite(LED1, LOW);
      digitalWrite(LED2, LOW);
    }
    irrecv.resume();
  }
}

Cambia los códigos del remoto porque los que puse son para el simulador y son diferentes a los tuyos.

Acá la simulación (botones [+] y [-] )

1 Like

Gracias por el consejo

A ok no sabia que se podia editar.
Gracias por la respuesta pero entiendo que tengo que actualizar en algun modo la biblioteca para que pueda leer irrecv.decodedIRData.decodedRawData, porque al depurarlo me da error.

Muchas gracias por la ayuda ahora funciona perfectamente. :raised_hands:t2: :raised_hands:t2: :+1:t2:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.