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.
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.
salida = true; //Encender Led1
salida = false; //Apagar Led1
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