Problema con 4 botones y 3 LEDs

Hola a todos, soy nuevo en el foro, me disculpo si me equivoqué de categoría o si cometí algún otro error.

Les cuento que estoy desarrollando un sistema de señaletica vehicular, aquí estoy empezando desde un simulador, este consiste de 3 botones LED y 4 botones, cada uno con 1 resistencia de 1kΩ, tal como muestro en la imagen:

-1 botón junto a 1 LED de señalética izquierda (Al pulsar se enciende y se apaga al volver a pulsar)
-1 botón junto a 1 LED de señalética derecha (Al pulsar se enciende y se apaga al volver a pulsar)
-1 botón junto a 1 LED de freno (Mientras se mantiene pulsado enciende los 3 LEDS juntos)
-1 botón de luces de emergencia (Al pulsar parpadean los 3 LEDS juntos y se apagan al volver a pulsar))

Aquí adjunto el código:

//Definimos constantes de Pines de Botones y LEDS
const int buttonLeft = 13;
const int buttonRight = 12;
const int buttonBrake = 11;
const int buttonEmergency = 10;
const int ledLeft = 1;
const int ledRight = 2;
const int ledBrake = 3;

//Definimos Valores iniciales de Botones
int buttonLeftValue = 0;
int buttonRightValue = 0;
int buttonBrakeValue = 0;
int buttonEmergencyValue = 0;


//Definimos Valores de estado antiguo de Botones
int buttonLeftOldValue = 0;
int buttonRightOldValue = 0;
int buttonBrakeOldValue = 0;
int buttonEmergencyOldValue = 0;


//Definimos estado de LED
int ledLeftValue = 0;
int ledRightValue = 0;
int ledBrakeValue = 0;
int ledEmergencyValue = 0;

//Variables de tiempo para Luz de Emergencia
unsigned long previousMillis = 0; //Almacenar ultimo tiempo de LED encendido
const long interval = 500; //Definir Intervalo de 1/2 segundo

//Setear estado para LED de emergencia
int ledState = LOW;  


void setup()
{
  //Activación de Pines de Botones y LEDS
  pinMode(buttonLeft, INPUT);
  pinMode(buttonRight, INPUT);
  pinMode(buttonBrake, INPUT);
  pinMode(buttonEmergency, INPUT);
  pinMode(ledLeft, OUTPUT);
  pinMode(ledRight, OUTPUT);
  pinMode(ledBrake, OUTPUT);

}

void loop()
{
  //Definir milisegundos actuales para boton Emergencia
  unsigned long currentMillis = millis();
  
  
  //Leer valores de botones
  buttonLeftValue = digitalRead(buttonLeft);
  buttonRightValue = digitalRead(buttonRight);
  buttonBrakeValue = digitalRead(buttonBrake);
  buttonEmergencyValue = digitalRead(buttonEmergency);


  //ENCENDIDO Y APAGADO de PINES de LED ---------------------------

  //BOTON Y LED IZQUIERDO -----------------------------------------
  
  if(buttonLeftValue == LOW && buttonLeftOldValue == HIGH) {
    ledLeftValue = 1 - ledLeftValue;
    delay(10);
  } 
  buttonLeftOldValue = buttonLeftValue;

  if(ledLeftValue == 1) {
      digitalWrite(ledLeft, HIGH);
      digitalWrite(ledRight, LOW); //NO FUNCIONA APAGADO DERECHO
  } else {
      digitalWrite(ledLeft, LOW);
  }

  //BOTON Y LED DERECHO -------------------------------------------
  
  if(buttonRightValue == LOW && buttonRightOldValue == HIGH) {
    ledRightValue = 1 - ledRightValue;
    delay(10);
  } 
  buttonRightOldValue = buttonRightValue;

  if(ledRightValue == 1) {
      digitalWrite(ledLeft, LOW); //NO FUNCIONA APAGADO IZQUIERDO
      digitalWrite(ledRight, HIGH);
  } else {
      digitalWrite(ledRight, LOW);
  }

  //BOTON DE FRENO ------------------------------------------------
  
  if(buttonBrakeValue == LOW) {
    digitalWrite(ledLeft, HIGH);
    digitalWrite(ledRight, HIGH);
    digitalWrite(ledBrake, HIGH);
  } else {
    digitalWrite(ledLeft, LOW);
    digitalWrite(ledRight, LOW);
    digitalWrite(ledBrake, LOW);
  }

  //BOTON DE EMERGENCIA ------------------------------------------
  
  if(buttonEmergencyValue == LOW && buttonEmergencyOldValue == HIGH) {
    ledEmergencyValue = 1 - ledEmergencyValue;
    delay(10);
  } 
  buttonEmergencyOldValue = buttonEmergencyValue;
  
  if(ledEmergencyValue == 1) {
    if (currentMillis - previousMillis >= interval) {
      // Guarda el ultimo tiempo de parpadeo de LED
      previousMillis = currentMillis;

      // Si el LED está apagado, se enciende o vice-versa:
      if (ledState == LOW) {
        ledState = HIGH;
      } else {
        ledState = LOW;
      }

      // Setear LED con ledState de la variable:
      digitalWrite(ledLeft, ledState);
      digitalWrite(ledRight, ledState);
      digitalWrite(ledBrake, ledState);
    }
  }
}
  

La luz izquierda, la luz derecha y las luces de freno funcionan sin problemas. El problema es que el botón de luces de emergencia me enciende las luces pero con muy baja intensidad. Para las luces de emergencia utilicé un código para el parpadeo sin usar delay().

No sé cómo resolver este problema de la baja intensidad, para testear, comenté el código del funcionamiento de los otros 3 botones, ahí recien enciende.

¿Cuál será el problema? Intenté colocar una batería de 9V adicional, pero sigue iluminando bajo.

Agradezco este espacio y estaré muy agradecido por la ayuda.

En general esta muy bien pero si quieres hilar mas fino te puedo hacer unas sugerencias. Ahora si esto lleva una calificación no solo estas aprobado sino que tienes un 8 o 9 depende el profesor.
Que mejorararía?
Pues no se si observas que ledleft, ledright, ledbrake van a activarse o desactivarse en cada ciclo del loop. Asi que una pequeña mejora sería que solo lo hagan cuando hay cambios.
Para eso en cada caso miro el estado que controla el led, pregunto si es igual al anterior y solo si es diferente le doy una orden de cambiar el estado del pin.
Como veras es sutil, muy sutil.

ledLeftValue controla el estado de LedLeft entonces solo si cambia de valor hago algo

if (ledLeftValue != ledLeftValueAnt) {
    digitalWrite( ledLeft, ledLeftValue);
    ledLeftValueAnt = ledLeftValue;
}

Esto lo repites para ledRight y LedBrake e incluso puedes generalizarlo para el ultimo caso tamb.

1 Like

Muchas gracias por la retroalimentación, me funcionó refactorizar el código con el control del value, desapareció el problema de la baja intensidad, por si a alguien le sirve, el código resultante queda:

//Definimos constantes de Pines de Botones y LEDS
const int buttonLeft = 13;
const int buttonRight = 12;
const int buttonBrake = 11;
const int buttonEmergency = 10;
const int ledLeft = 1;
const int ledRight = 2;
const int ledBrake = 3;

//Definimos Valores iniciales de Botones
int buttonLeftValue = 0;
int buttonRightValue = 0;
int buttonBrakeValue = 0;
int buttonEmergencyValue = 0;


//Definimos Valores de estado antiguo de Botones
int buttonLeftOldValue = 0;
int buttonRightOldValue = 0;
int buttonBrakeOldValue = 0;
int buttonEmergencyOldValue = 0;


//Definimos estado de LED
int ledLeftValue = 0;
int ledRightValue = 0;
int ledBrakeValue = 0;
int ledEmergencyValue = 0;

//Almacenar estado anterior de LED
int ledLeftValueAnt = 0;
int ledRightValueAnt = 0;
int ledBrakeValueAnt = 0;
int ledEmergencyValueAnt = 0;


//Variables de tiempo para Luz de Emergencia
unsigned long previousMillis = 0; //Almacenar ultimo tiempo de LED encendido
const long interval = 500; //Definir Intervalo de 1/2 segundo

//Setear estado para LED de emergencia
int ledBrakeState = LOW;  


void setup()
{
  //Activación de Pines de Botones y LEDS
  pinMode(buttonLeft, INPUT);
  pinMode(buttonRight, INPUT);
  pinMode(buttonBrake, INPUT);
  pinMode(buttonEmergency, INPUT);
  pinMode(ledLeft, OUTPUT);
  pinMode(ledRight, OUTPUT);
  pinMode(ledBrake, OUTPUT);

}

void loop()
{
  //Definir milisegundos actuales para boton Emergencia
  unsigned long currentMillis = millis();
  
  
  //Leer valores de botones
  buttonLeftValue = digitalRead(buttonLeft);
  buttonRightValue = digitalRead(buttonRight);
  buttonBrakeValue = digitalRead(buttonBrake);
  buttonEmergencyValue = digitalRead(buttonEmergency);


  //ENCENDIDO Y APAGADO de PINES de LED ---------------------------

  //BOTON Y LED IZQUIERDO -----------------------------------------
  
  if(buttonLeftValue == LOW && buttonLeftOldValue == HIGH) {
    ledLeftValue = 1 - ledLeftValue;
    delay(10);
  } 
  buttonLeftOldValue = buttonLeftValue;

  if (ledLeftValue != ledLeftValueAnt) {
      digitalWrite( ledLeft, ledLeftValue);
      ledLeftValueAnt = ledLeftValue;
  }

  //BOTON Y LED DERECHO -------------------------------------------
  
  if(buttonRightValue == LOW && buttonRightOldValue == HIGH) {
    ledRightValue = 1 - ledRightValue;
    delay(10);
  } 
  buttonRightOldValue = buttonRightValue;

  if (ledRightValue != ledRightValueAnt) {
      digitalWrite( ledRight, ledRightValue);
      ledRightValueAnt = ledRightValue;
  }

  //BOTON DE FRENO ------------------------------------------------
  
  if(buttonBrakeValue == LOW) {
    ledBrakeValue = 1 - ledBrakeValue;
    delay(10);
  } 
  
   buttonBrakeOldValue = buttonBrakeValue;

  if (ledBrakeValue != ledBrakeValueAnt) {
    digitalWrite(ledLeft, ledBrakeValue);
    digitalWrite(ledRight, ledBrakeValue);
    digitalWrite(ledBrake, ledBrakeValue);
    ledBrakeValueAnt = ledBrakeValue;
  }
  

  //BOTON DE EMERGENCIA ------------------------------------------
  
  if(buttonEmergencyValue == LOW && buttonEmergencyOldValue == HIGH) {
    ledEmergencyValue = 1 - ledEmergencyValue;
    delay(10);
  } 
  buttonEmergencyOldValue = buttonEmergencyValue;
  
  if(ledEmergencyValue == 1) {
    if (currentMillis - previousMillis >= interval) {
      // Guarda el ultimo tiempo de parpadeo de LED
      previousMillis = currentMillis;

      // Si el LED está apagado, se enciende o vice-versa:
      if (ledBrakeState == LOW) {
        ledBrakeState = HIGH;
      } else {
        ledBrakeState = LOW;
      }

      // Setear LED con ledState de la variable:
      digitalWrite(ledLeft, ledBrakeState);
      digitalWrite(ledRight, ledBrakeState);
      digitalWrite(ledBrake, ledBrakeState);

    }
  } 
}
  

Nunca debes tener una variable que se modifica en muchos sitios. Debes llegar a un lugar donde las situaciones con X prioridad determinen su valor y no al revés.
Porque si no lo haces asi, el resultado puede ser impredecible y en general no tenemos debugger en Arduino y eso complica la resolución de problemas.

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