Encender 2 led con botones independientes y luego de 1 segundo se apaguen

Hola a todos, soy nuevo en esto de realizar proyectos con arduino y tengo un problemita, primeramente lo hice con 1 led basandome en tutoriales de YouTube y funciono sin problema y ahora lo quiero hacer con 2 led :disappointed_relieved:.
Bueno hice una aplicaci贸n en app inventor el cual tiene 2 botones los cuales al presionarlos encender谩n los 2 leds en distinto momento.
Lo que busco con el c贸digo es que una vez encendido mi led1 pasado 1 segundo se apague autom谩ticamente lo cual si se cumple.
Pero el detalle est谩 con mi led2, el cual al presionar el bot贸n 2 si enciende pero pasado el segundo no se apaga :disappointed_relieved:, solo cuando enciendo mi led1 y pasado un 1 segundo se apagan ambos led. Donde estaria el error?? Ayuda por favor.

int led1=4;
int led2=7;
int estado=0;
insigned long tiempoanterior = 0;
long espera = 1000;

void setup() {
    Serial.begin(9600);
    pinMode(led1,OUTPUT);
    pinMode(led2,OUTPUT);
}
void loop() {
  if (Serial.available()>0){
   estado = Serial.read();
   if (estado == '1'){
   digitalWrite(led1,HIGH);
   tiempoanterior = millis();
    }
 }
 if(millis() = tiempoanterior  > espera){
   digitalWrite(led1,LOW);
  }
 if (estado == '2'){
   digitalWrite(led2,HIGH);
   tiempoanterior = millis();
   }

 if(millis() = tiempoanterior  > espera){
   digitalWrite(led2,LOW);
   }
}

Lo m谩s f谩cil es usar dos variables "tiempoanterior"
una para cada bot贸n.
Igual que tienes LED1 y LED2, tener tiempoanterior1 y tiempoanterior2

Osea, algo asi:
insigned long tiempoanterior1 = 0;
insigned long tiempoanterior2 = 0;

Moderador:
Por favor, lee las Normas del foro y edita tu c贸digo/error usando etiquetas de c贸digo.
Ve a edici贸n, luego selecciona todo el c贸digo que has publicado, lo cortas y click en </>



Aunque sea una l铆nea de c贸digo debe ir con etiquetas. Hablo de tu respuesta.
Edita el t铆tulo retirando la palabra Ayuda tal como lo indica el punto 5 acerca de c贸mo poner t铆tulos en este foro.

Si y en:

if (estado == '2'){
   digitalWrite(led2,HIGH);
   tiempoanterior2 = millis();
    }

 if(millis() = tiempoanterior2  > espera){
   digitalWrite(led2,LOW);
   }

Mira que he utilizado tiempoanterior2 para el led2, tendras que realizar lo mismo pero con tiempoanterior1 para el led1.

Muchas gracias, lo probar茅 y te cuento que tal quedo. :slightly_smiling_face:

Esta sentencia

if(millis() = tiempoanterior > espera){

est谩 mal.

Debe ser

if(millis() - tiempoanterior > espera){

Es una resta, no una asignaci贸n.

Ya lo prob茅 y no resulto :disappointed_relieved:

pega el codigo otra vez

Con este cambio lo prob茅, no boto error todo bien, solo que sigue lo mismo. El led1 se apaga autom谩ticamente despues de 1 segundo. Pero el led2 no, solo cuando enciendo el led1 reci茅n se apagan ambos despues de 1 segundo.
Ah y no era asi:
if(millis() = tiempoanterior2 > espera){
Si no:
if(millis() - tiempoanterior2 > espera){

int led1=4;
int led2=7;
int estado=0;
insigned long tiempoanterior1 = 0;
insigned long tiempoanterior2 = 0;
long espera = 1000;

void setup() {
    Serial.begin(9600);
    pinMode(led1,OUTPUT);
    pinMode(led2,OUTPUT);
}
void loop() {
  if (Serial.available()>0){
   estado = Serial.read();
   if (estado == '1'){
   digitalWrite(led1,HIGH);
   tiempoanterior1 = millis();
    }
 }
 if(millis() - tiempoanterior1  > espera){
   digitalWrite(led1,LOW);
  }
 if (estado == '2'){
   digitalWrite(led2,HIGH);
   tiempoanterior2 = millis();
   }

 if(millis() - tiempoanterior2  > espera){
   digitalWrite(led2,LOW);
   }
}

Vale, el problema que tienes es otro:
Dentro de este 'if':

if (Serial.available()>0){
   estado = Serial.read();
   if (estado == '1'){
   digitalWrite(led1,HIGH);
   tiempoanterior1 = millis();
    }
 }

preguntas si estado == 1, pero preguntas fuera de este 'if' si estado ==2 con lo que siempre entrar谩 aqu铆:

if (estado == '2'){
   digitalWrite(led2,HIGH);
   tiempoanterior2 = millis();
   }

Mete ese trozo de c贸digo donde tienes el primer IF para que solo entre cuando se recibe un caracter por el serial.
Saludos

El c贸digo de #10 funciona perfectamente (al menos simulado en wokwi) solo hay que corregir insigned por unsigned. :wink:

Agrego: Es cierto lo que se帽ala @DanX3 , "mueve" ese segmento de c贸digo para ser mas prolijo.

O sea

byte led1=4;
byte led2=7;
char estado=0;
unsigned long tiempoanterior1 = 0;
unsigned long tiempoanterior2 = 0;
unsigned long espera = 1000;

void setup() {
  Serial.begin(9600);
  pinMode(led1,OUTPUT);
  pinMode(led2,OUTPUT);
}
void loop() {
  if (Serial.available()>0){
    estado = Serial.read();
    if (estado == '1'){
      digitalWrite(led1,HIGH);
      tiempoanterior1 = millis();
    }
    if (estado == '2'){
      digitalWrite(led2,HIGH);
      tiempoanterior2 = millis();
    }
  }
  if(millis() - tiempoanterior1  > espera){
    digitalWrite(led1,LOW);
  }
  if(millis() - tiempoanterior2  > espera){
    digitalWrite(led2,LOW);
  }
}

Te correg铆 los tipos de las variables porque, si bien funcionaba, no eran correctos.

Esta bien lo probare y que tal me funciona. Y much铆simas gracias @anon90500195, @DanX3 :slightly_smiling_face:

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