Encender un Led con sensor IR y botón. (SOLUCIONADO)

Hola, tengo una duda. Estoy haciendo un proyecto con un Arduino uno r3, básicamente lo que quiero lograr es encender y apagar un Led con un botón (pulsador) y al mismo tiempo con un control remoto, usando un sensor de infrarrojos vs-1838b.

Al escribir el código lo hice por separado, primer encendí el led con el botón y luego encendí el led con el sensor. todo funcionaba de maravilla pero a la hora de unir las dos cosas resulta que el led solo enciende con el botón y al intentar encenderlo con el sensor solo se logra ver una "chispa" como si le faltara voltaje o algún otro componente que lo ayudara a captar mejor la señal.

también lo probé en un simulador y ocurre lo mismo, se logra ver como el Led intenta encender pero por una cantidad de tiempo muy corta y una intensidad muy baja.

PD: al inicio lo probé solo con un Led pero mi intención es copiar el código para tener 6 botones y 6 Leds es por eso que en las fotos y en el código tengo ya para un segundo botón y un segundo Led.

Les agradezco cualquier aporte y muchas gracias por su tiempo.

prueba3.ino (3.15 KB)

Otra cosa que se me pasó decir, en las fotos tengo el sensor conectado al pin que pasa 3.3v porque estaba probando, originalmente lo conectaba a 5v y da el mismo resultado.

He visto tu código y solo darte un consejo.
Cuando hay muchas variable a veces no tienen el valor que nosotros esperamos y la forma de comprobarlas es haciendo un seguimiento en el monitor serial y con delays para que nos de tiempo a verlas y en diferentes partes del código.
Y ese encendido tan corto tiene ese aspecto de cambio de valor de alguna var.

Prueba a ver si esto funciona mejor que lo tuyo.
Muchas variables, mucha redundancia en tu forma de encarar las cosas.
Por ejemplo: no puedes activar la salida y luego tener una salida que responde a una variable que activa o no la misma salida.
Yo modifiqué eso para que salida1 y 2 respondan al pulsador o al IR.

#include <IRremote.h>

int ReceptorIR    = 11;
const byte Led1   =  4;
const byte Led2   =  2;
const byte boton1 =  8;
const byte boton2 = 12;

IRrecv irrecv(ReceptorIR);
decode_results Codigos;

int estado         = 0;                       // guarda el estado del boton
int estadoAnterior = 0; 

int estado2        = 0;                       // guarda el estado del boton
int estadoAnterior2 = 0; 

bool salida         = false;                  // false = LED esta apagado, true = LED encendido
bool salida2        = false;                  // false = LED esta apagado, true = LED encendido

void setup() {
  
  Serial.begin(9600);
  irrecv.enableIRIn();

  pinMode(boton1, INPUT);                     // declaramos el boton1 como entrada
  pinMode(boton2, INPUT);                     // declaramos el boton2 como entrada

  pinMode(Led1, OUTPUT);                      // declaramos el LED1 como salida
  pinMode(Led2, OUTPUT);                      // declaramos el LED como salida
}

const int tiempoAntirebote = 10;              // código antirebote del boton

int cuenta = 0;                               // lleva la cuenta de las veces que presionamos el botón
int estadoBoton;
int estadoBotonAnterior;
                                                                                                     
boolean antirebote(int pin) {
  int contador = 0;
  boolean estado;                             // guarda el estado del botón
  boolean estadoAnterior;                     // guarda el último estado del botón

  do {
    estado = digitalRead(pin);
    if(estado != estadoAnterior) {            // comparamos el estado actual con el anterior
      contador = 0;                           // reiniciamos el contador
      estadoAnterior = estado;
    }
    else {
      contador = contador + 1;                // sumentamos el contador en 1 
    }
    delay(1);
  } while(contador < tiempoAntirebote);

  return estado;
}

void loop() {
  
  if (irrecv.decode(&Codigos))  {
      switch (Codigos.value)  {
          case 0xFF30CF:                          //codigo boton1
                          salida1 = true;         //Encender Led1                   
                          break;
            
          case 0xFF112E7:                         //codigo boton2
                          salida1 = false;        //Apagar Led1                   
                          break;
         
          case 0xFF7A85:                          //codigo boton3
                          salida2 = true;         //Encender Led2                   
                          break;
            
          case 0xFF10EF:                          //codigo boton4
                          salida2 = false;        //Apagar Led2                
                          break;
         
      }
      irrecv.resume();
  }
  
  estado = digitalRead(boton1);                   // leer estado del boton

  if ((estado == HIGH) && (estadoAnterior == LOW)) {
     salida = !salida;
     delay(40);
  }

  estadoAnterior = estado;                        //guarda el valor actual

  if (salida1)                                    // si esta en alto 
    digitalWrite(Led1, HIGH);                     // encendemos el LED1
  
  else 
    digitalWrite(Led1, LOW);                      // si no apagamos el LED1
  
  estado2 = digitalRead(boton2);                  // leer estado del boton2

  if ((estado2 == HIGH) && (estadoAnterior2 == LOW)) {
     salida2 = !salida2;
     delay(40);
  }

  estadoAnterior2 = estado2;                      //guarda el valor actual

  if (salida2)                                    // si esta en alto 
     digitalWrite(Led2, HIGH);                    // encendemos el LED2
  else 
     digitalWrite(Led2, LOW);                     // si no apagamos el LED    
}

¡Gracias! @surbyte me ha funcionado, solo tuve que modificar 3 líneas de su código y funcionó a la perfección. :slight_smile:

  1. salida = true; //Encender Led1
  2. salida = false; //Apagar Led1
  3. if (salida) // si esta en alto

nuevamente muchísimas gracias me ha resuelto lo que era para mi un gran problema, me falta mucho por aprender jaja apenas empecé en este mundo de la programación hace poco menos de un mes.

Así quedó el código:

#include <IRremote.h>

int ReceptorIR    = 11;
const byte Led1   =  4;
const byte Led2   =  2;
const byte boton1 =  8;
const byte boton2 = 12;

IRrecv irrecv(ReceptorIR);
decode_results Codigos;

int estado         = 0;                       // guarda el estado del boton
int estadoAnterior = 0; 

int estado2        = 0;                       // guarda el estado del boton
int estadoAnterior2 = 0; 

bool salida         = false;                  // false = LED esta apagado, true = LED encendido
bool salida2        = false;                  // false = LED esta apagado, true = LED encendido

void setup() {
 
 Serial.begin(9600);
 irrecv.enableIRIn();

 pinMode(boton1, INPUT);                     // declaramos el boton1 como entrada
 pinMode(boton2, INPUT);                     // declaramos el boton2 como entrada

 pinMode(Led1, OUTPUT);                      // declaramos el LED1 como salida
 pinMode(Led2, OUTPUT);                      // declaramos el LED como salida
}

const int tiempoAntirebote = 10;              // código antirebote del boton

int cuenta = 0;                               // lleva la cuenta de las veces que presionamos el botón
int estadoBoton;
int estadoBotonAnterior;
                                                                                                    
boolean antirebote(int pin) {
 int contador = 0;
 boolean estado;                             // guarda el estado del botón
 boolean estadoAnterior;                     // guarda el último estado del botón

 do {
   estado = digitalRead(pin);
   if(estado != estadoAnterior) {            // comparamos el estado actual con el anterior
     contador = 0;                           // reiniciamos el contador
     estadoAnterior = estado;
   }
   else {
     contador = contador + 1;                // sumentamos el contador en 1 
   }
   delay(1);
 } while(contador < tiempoAntirebote);

 return estado;
}

void loop() {
 
 if (irrecv.decode(&Codigos))  {
     switch (Codigos.value)  {
         case 0xFF30CF:                          //codigo boton1
                         salida = true;         //Encender Led1                   
                         break;
           
         case 0xFF112E7:                         //codigo boton2
                         salida = false;        //Apagar Led1                   
                         break;
        
         case 0xFF7A85:                          //codigo boton3
                         salida2 = true;         //Encender Led2                   
                         break;
           
         case 0xFF10EF:                          //codigo boton4
                         salida2 = false;        //Apagar Led2                
                         break;
        
     }
     irrecv.resume();
 }
 
 estado = digitalRead(boton1);                   // leer estado del boton

 if ((estado == HIGH) && (estadoAnterior == LOW)) {
    salida = !salida;
    delay(40);
 }

 estadoAnterior = estado;                        //guarda el valor actual

 if (salida)                                    // si esta en alto 
   digitalWrite(Led1, HIGH);                     // encendemos el LED1
 
 else 
   digitalWrite(Led1, LOW);                      // si no apagamos el LED1
 
 estado2 = digitalRead(boton2);                  // leer estado del boton2

 if ((estado2 == HIGH) && (estadoAnterior2 == LOW)) {
    salida2 = !salida2;
    delay(40);
 }

 estadoAnterior2 = estado2;                      //guarda el valor actual

 if (salida2)                                    // si esta en alto 
    digitalWrite(Led2, HIGH);                    // encendemos el LED2
 else 
    digitalWrite(Led2, LOW);                     // si no apagamos el LED    
}

Bueno ves como yo inserté el código.
El pago por la ayuda es que leas las normas del foro y uses y edites tus post para que se vean con las etiquetas correspodientes.
Luego le pones SOLUCIONADO a tu título

Listo :slight_smile: