Encender 4 leds con boton y arduino

Buen día, tengo un problema que no he podido resolver, se trata de encender y apagar cuatro leds de forma específica, los leds son verde, amarillo, rojo y azul, al led verde le llegara una señal activada por un motor, y a los otros 3 leds se seleccionaran por un botón..
La función es la siguiente:

  1. cuando el led verde este encendido por la señal del motor, estarán apagados los led amarillo, rojo y azul

  2. cuando el motor pare y el led verde se apague, se encenderán los led amarillo, rojo y azul

  3. cuando el motor este detenido y el led verde este apagado y el amarillo, rojo y azul encendidos, se debe poder seleccionar un solo led pulsando un botón, por ejemplo, si pulso el botón del led amarillo, este debe permanecer encendido, y deben apagarse el rojo y azul, cuando pulse el botón rojo deben de apagarse el amarillo y el azul, y cuando pulse el botón del led azul deben apagarse el amarillo y rojo, solo deberá estar encendido el led del botón que pulse, el led verde solo será controlado por el señal del motor, y cuando este esté encendido los otros tres leds no deberán encenderse aunque presione los botones, los botones solo tendrán función cuando el led verde este apagado por el paro del motor, para de esta forma cuando estén los tres encendidos seleccionar uno con el botón.

Disculpen si no es el lugar para postear este tema soy nuevo en Arduino y se me está complicando mucho, estos son los códigos que he realizado pero no me ha podido salir como lo piden.

int verde = 2;
int amarillo = 3;
int rojo = 4;
int azul = 5;
int bt_am = 6;
int bt_r = 7;
int bt_az = 8;
int bt_mq = 9;


int boton_amarillo;
int boton_rojo;
int boton_azul;
int boton_maquina;


void setup() 
{
  pinMode (amarillo, OUTPUT);
  pinMode (rojo, OUTPUT);
  pinMode (azul, OUTPUT);
  pinMode (verde, OUTPUT);
  pinMode (bt_am, INPUT);
  pinMode (bt_r, INPUT);
  pinMode (bt_az, INPUT);
  pinMode (bt_mq, INPUT);

}




void loop() 
{

  int boton_amarillo = digitalRead(bt_am);
  int boton_rojo = digitalRead(bt_r);
  int boton_azul = digitalRead(bt_az);
  int boton_maquina = digitalRead(bt_mq);


if(digitalRead (boton_maquina) == HIGH)
{
  digitalWrite(verde, HIGH);
  digitalWrite(amarillo, LOW);
  digitalWrite(rojo, LOW);
  digitalWrite(azul, LOW);
}
else
{
  digitalWrite(verde, LOW);
  digitalWrite(amarillo, HIGH);
  digitalWrite(rojo, HIGH);
  digitalWrite(azul, HIGH);
}



if(digitalRead (boton_amarillo) == HIGH)
{
  digitalWrite(amarillo, HIGH);
  digitalWrite(rojo, LOW);
  digitalWrite(azul, LOW);
}



if(digitalRead (boton_rojo) == HIGH)
{
  digitalWrite(rojo, HIGH);
  digitalWrite(amarillo, LOW);
  digitalWrite(azul, LOW);
}



if(digitalRead (boton_azul) == HIGH)
{
  digitalWrite(azul, HIGH);
  digitalWrite(amarillo, LOW);
  digitalWrite(rojo, LOW);
}

}Texto preformateado

Su publicacion se MUEVE a su ubicacion actual ya que es mas adecuada.

Hola .
A todos los if o le quitas el digitalread porque boton_ es una variable que ya has leido antes y no un numero de pin. O cambia la variable y le el boton, (bt_).
saludos.

Hola, gracias por responder, le quite los digitalRead y mejoro, cuando corre el programa encieden solo los leds amarillo, rojo y azul como debe de ser, y al momento de mandar la señal de la maquina el verde enciende, y los otros tres leds se apagan, y hasta ahí todo bien, pero cuando la señal de la maquina es 0 nuevamente, el verde se queda enclavado y auque quite la señal no se apaga, es ahí cuando me confundo mucho, el verde se queda encendido, tambien en la parte de seleccionar solo un color y los otros dos se apaguen, no lo he podido conseguir, veo que el programa se agarra de una parte y no deja que pase a lo demas, como si nadamas le hiciera caso a una parte..
saludos!..

se movera la publicación? perdon me siento muy perdido :frowning:

Mete los if de los botones dentro del ese del motor supongo que hara lo que quieres.

Seria algo así?:

if ((boton_maquina) == HIGH)
{
digitalWrite (verde, HIGH);
digitalWrite (amarillo, LOW);
digitalWrite (rojo, LOW);
digitalWrite (azul, LOW);
}

else if ((boton_maquina) == LOW && (boton_amarillo) == HIGH && (boton_rojo) == HIGH && (boton_azul) == HIGH)
{
digitalWrite (verde, LOW);
digitalWrite (amarillo, HIGH);
digitalWrite (rojo, HIGH);
digitalWrite (azul, HIGH);
}
aún me confundo mucho con los if, while y else, creo que soy muy novato

No, tal como los tienes dentrro del else, :

else {
digitalWrite(verde, LOW);
digitalWrite(amarillo, HIGH);
digitalWrite(rojo, HIGH);
digitalWrite(azul, HIGH);

if(digitalRead (boton_amarillo) == HIGH) {
digitalWrite(amarillo, HIGH);
digitalWrite(rojo, LOW);
digitalWrite(azul, LOW);
}

if(digitalRead (boton_rojo) == HIGH) {
digitalWrite(rojo, HIGH);
digitalWrite(amarillo, LOW);
digitalWrite(azul, LOW);
}

if(digitalRead (boton_azul) == HIGH) {
digitalWrite(azul, HIGH);
digitalWrite(amarillo, LOW);
digitalWrite(rojo, LOW);
}
}

queda bien al correr el programa, pero en donde sigue dando problemillas es en el verde, sigue sin apagarse, y tambien en seleccionar un color con cada boton, estoy usando el simulador de arduino en proteus,
el circuito esta así:

Pues no le veo fallos al código, va ha ser de la simulación ,( a saber quien ha echo el modelo del nano).
Quita las Pwr, Pw2 y maquina, une los botones y el SW1 al pin 5 del nano, (eso es lo que harias en la realidad), baja las resistencias de 10K a 4k7 y aunque no es necesario para la simulación es imprescindible limitar la corriente que el nano da a los led (max. 40 mA por pin), coloca resistencias entre el pin y el led de almenos 200 ohmios.
A ver que sale.

Hice los cambios pero sigue similar, lo malo que no tengo los elementos en fisico para probar por si fuera el simulador, voy a ver si puedo descargar otro simulador y ver si ahí ya va bien, por que si esta raro, y en si, esto no parece un trabajo tan dificil, pero la verdad si se me esta dificultando mucho, buscare otro sim a ver que pasa, saludos!..

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


Por favor, no sigas respondiendo en el hilo sin hacer las correcciones de acuerdo a las normas.

bt_mq (D9) tiene que tener algo que le fije el estado cuando SW1 está abierto, sino está indeterminado y por eso seguramente no se apaga el LED verde.
Fijate que en la captura de Proteus está gris, o sea justamente indeterminado (ni azul, low, ni rojo, high)

Saludos

1 Like

Gracias, ya se ve mejor!

Cierto, buena observación . @metalmaster360 otra resistencia de 4k7 del pin 9 a GND.
Saludos.

Como que el simulador de proteus no es muy estable, lo simule en tinkercad y ya no me dio el problema del led verde, agregue unos delay y ya hace la funcion correctamente, solo que ahora tengo que agregar mas funciones, con otro boton el led verde debe de parpadera y con otro tambien el amarillo, los demas siguen igual, va quedando así, solo que no se apagan los demas cuado escojo los botones de parpadeo:

int verde = 2;
int amarillo = 3;
int rojo = 4;
int azul = 5;
int bt_am = 6;
int bt_r = 7;
int bt_az = 8;
int bt_mq = 9;
int bt_parp_v = 10;
int bt_parp_am = 11;


int boton_amarillo;
int boton_rojo;
int boton_azul;
int boton_maquina;
int boton_parpadeante_verde;
int boton_parpadeante_amarillo;


void setup() 
{
  pinMode (amarillo, OUTPUT);
  pinMode (rojo, OUTPUT);
  pinMode (azul, OUTPUT);
  pinMode (verde, OUTPUT);
  pinMode (bt_am, INPUT);
  pinMode (bt_r, INPUT);
  pinMode (bt_az, INPUT);
  pinMode (bt_mq, INPUT);
  pinMode (bt_parp_v, INPUT);
  pinMode (bt_parp_am, INPUT);

}


void loop() 
{

   int boton_amarillo = digitalRead(bt_am);
   int boton_rojo = digitalRead(bt_r);
   int boton_azul = digitalRead(bt_az);
   int boton_maquina = digitalRead(bt_mq);
   int boton_parpadeante_verde = digitalRead(bt_parp_v);
   int boton_parpadeante_amarillo = digitalRead(bt_parp_am);



   if((boton_maquina) == HIGH)
  {
    digitalWrite(verde, HIGH);
    digitalWrite(amarillo, LOW);
    digitalWrite(rojo, LOW);
    digitalWrite(azul, LOW);
    
  }
   else
   {
     digitalWrite(verde, LOW);
     digitalWrite(amarillo, HIGH);
     digitalWrite(rojo, HIGH);
     digitalWrite(azul, HIGH);
     
   



    if(digitalRead (boton_amarillo) == LOW)
    {
      digitalWrite(amarillo, HIGH);
      digitalWrite(rojo, LOW);
      digitalWrite(azul, LOW);
      delay(100);
    }
     
     

    if(digitalRead (boton_rojo) == LOW)
    {
      digitalWrite(rojo, HIGH);
      digitalWrite(amarillo, LOW);
      digitalWrite(azul, LOW);
      delay(100);
    }
     
     

    if(digitalRead (boton_azul) == LOW)
    {
      digitalWrite(azul, HIGH);
      digitalWrite(amarillo, LOW);
      digitalWrite(rojo, LOW);
      delay(100);
    }
      
      
      
      if((boton_parpadeante_verde) == HIGH)
      {
        digitalWrite(verde, HIGH);
        delay(300); 
        digitalWrite(verde, LOW); 
        delay(300); 
        digitalWrite(amarillo, LOW);
        digitalWrite(rojo, LOW);
        digitalWrite(azul, LOW);
      }
      
      
      
      if((boton_parpadeante_amarillo) == HIGH)
      {
        digitalWrite(amarillo, HIGH);
        delay(300); 
        digitalWrite(amarillo, LOW); 
        delay(300); 
        digitalWrite(azul, LOW);
        digitalWrite(rojo, LOW);
      }
    }
  } 

Lo que te dije sobre el pin D9 aplica para un micro real, lo de la simulación fue solo como referencia.

Saludos

Gracias, ya estuvo, le he agregado la resistencia, ya hasta ahorita el programa ya realiza la mayoria de las cosas, como al momento de encender el verde se apagan el amarillo, rojo y azul, cuando se apagan el amarillo, rojo y azul se enciende el verde, y cuando estos tres estan encendidos se puede seleccionar uno solo y apagar los otros dos, pero hace correctamente esta función cuando les agrego delay, tengo que agregar dos funciones mas, cuando este el rojo, amarillo y azul y oprimo un cuarto boton estos tres se apagan y parpadea el verde, cuando la señal del motor sea alta se debe de quedar fijo, el verde solo parpadeara cuando el motrór este detenido.
Y el amarillo, igual debe parpadear cuando se oprima un quinto boton y apagarse los demas, el amarillo quedaria fijo y parpadeante con un boton cada función, ya solo me faltaria agregar esas dos funciones, hasta ahorita el codigo va así, aunque no entran bien los parpadeantes:[quote="gonpezzi, post:15, topic:922394, full:true"]
Cierto, buena observación . @metalmaster360 otra resistencia de 4k7 del pin 9 a GND.
Saludos.
[/quote]

int verde = 2;
int amarillo = 3;
int rojo = 4;
int azul = 5;
int bt_am = 6;
int bt_r = 7;
int bt_az = 8;
int bt_mq = 9;
int bt_parp_v = 10;
int bt_parp_am = 11;


int boton_amarillo;
int boton_rojo;
int boton_azul;
int boton_maquina;
int boton_parpadeante_verde;
int boton_parpadeante_amarillo;


void setup() 
{
  pinMode (amarillo, OUTPUT);
  pinMode (rojo, OUTPUT);
  pinMode (azul, OUTPUT);
  pinMode (verde, OUTPUT);
  pinMode (bt_am, INPUT);
  pinMode (bt_r, INPUT);
  pinMode (bt_az, INPUT);
  pinMode (bt_mq, INPUT);
  pinMode (bt_parp_v, INPUT);
  pinMode (bt_parp_am, INPUT);

}


void loop() 
{

   int boton_amarillo = digitalRead(bt_am);
   int boton_rojo = digitalRead(bt_r);
   int boton_azul = digitalRead(bt_az);
   int boton_maquina = digitalRead(bt_mq);
   int boton_parpadeante_verde = digitalRead(bt_parp_v);
   int boton_parpadeante_amarillo = digitalRead(bt_parp_am);



   if((boton_maquina) == HIGH)
  {
    digitalWrite(verde, HIGH);
    digitalWrite(amarillo, LOW);
    digitalWrite(rojo, LOW);
    digitalWrite(azul, LOW);
    
  }
   else
   {
     digitalWrite(verde, LOW);
     digitalWrite(amarillo, HIGH);
     digitalWrite(rojo, HIGH);
     digitalWrite(azul, HIGH);
     
   



    if(digitalRead (boton_amarillo) == LOW)
    {
      digitalWrite(amarillo, HIGH);
      digitalWrite(rojo, LOW);
      digitalWrite(azul, LOW);
      delay(100);
    }
     
     

    if(digitalRead (boton_rojo) == LOW)
    {
      digitalWrite(rojo, HIGH);
      digitalWrite(amarillo, LOW);
      digitalWrite(azul, LOW);
      delay(100);
    }
     
     

    if(digitalRead (boton_azul) == LOW)
    {
      digitalWrite(azul, HIGH);
      digitalWrite(amarillo, LOW);
      digitalWrite(rojo, LOW);
      delay(100);
    }
      
      
      
      if((boton_parpadeante_verde) == HIGH)
      {
        digitalWrite(verde, HIGH);
        delay(300); 
        digitalWrite(verde, LOW); 
        delay(300); 
        digitalWrite(amarillo, LOW);
        digitalWrite(rojo, LOW);
        digitalWrite(azul, LOW);
      }
      else
      {
        digitalWrite(verde, LOW);
        delay(300); 
        digitalWrite(verde, LOW); 
        delay(300); 
        digitalWrite(amarillo, HIGH);
        digitalWrite(rojo, HIGH);
        digitalWrite(azul, HIGH);
        
      }
       
      if((boton_parpadeante_amarillo) == HIGH)
      {
        digitalWrite(amarillo, HIGH);
        delay(300); 
        digitalWrite(amarillo, LOW); 
        delay(300); 
        digitalWrite(rojo, LOW);
        digitalWrite(azul, LOW);
      }
     else
      {
        digitalWrite(amarillo, LOW);
        delay(300); 
        digitalWrite(amarillo, LOW); 
        delay(300); 
        digitalWrite(rojo, HIGH);
        digitalWrite(azul, HIGH);
       
      }  
    }
  }