LED brightness is different depending on which button I press, very confused

I have recorded a short video to demonstrate the problem. Arduino problem - YouTube

Some context:

You are looking at 4 green LEDs which illuminate for 1 second each in a random order (NOTE: For the sake of demonstration I have sped up the interval such that the LEDs blink very rapidly. This made it easier to show the problem). Opposite each LED, you will notice a switch. When a green LED is illuminated, and if the corresponding switch is pressed before the LED extinguishes, then this will cause the single RED LED to illuminate. Think of it as a game - you have to hit the button before the LED goes out. If you get it right, the red LED lights up.

THE PROBLEM:
For some reason, the red LED is very dim when buttons 1 - 3 (from left to right) are pressed, then it is very bright when button 4 is pressed. I can't figure out why this is and I'd really appreciate some help.

I have tried changing the LED, buttons and changing the IO pin to no avail. I've scrutinised my code and wiring and can't see any issue (but I'm a beginner so maybe I'm missing something obvious).

//This version has 4 leds blinking randomly + 4 buttons. When correct button pressed, indicator led illuminates
//it includes a pushbutton which switches between two different if statements (i.e. manual and auto modes on toy
//it includes a 4 pushbutton controller. leds turn on/off via toggle switches when in manual mode
//Rev 6 added random led generation with no repeating twice in a row, also added sliding pot for interval

int redLED = 6;       //The red LED indicating successful hit
int ledState = LOW;   //state of red LED
int interval;         //LED duration
long prevTime = 0;

int ButtonState     = 0;   // take current button state
int LastButtonState = 0;   // take last button state
int programState        = 0;   // to determine which loop to run i.e. manual or auto game mode
int buttonPin = 12;        // this is the button which switches between manual and auto game modes

// These are the buttons for the controller which control the LEDs in manual game mode
int remPin1 = A0;
int remPin2 = A1;
int remPin3 = A2;
int remPin4 = A3;

int remPin1StateOld = 0;
int remPin1StateNew;
int remPin2StateOld = 0;
int remPin2StateNew;
int remPin3StateOld = 0;
int remPin3StateNew;
int remPin4StateOld = 0;
int remPin4StateNew;

//This is for the random number generator to illuminate LEDs randomly in auto game mode
int Generator;
int OldGenerator;


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

// These are the GREEN LEDs
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);

// RED LED
  pinMode(redLED, OUTPUT);

//Corresponding buttons which match with GREEN LEDS
  pinMode(8, INPUT);
  pinMode(9, INPUT);
  pinMode(10, INPUT);
  pinMode(11, INPUT);

// Manual/Auto button
  pinMode(buttonPin, INPUT);

//Remote Control Buttons
  pinMode(remPin1, INPUT);
  pinMode(remPin2, INPUT);
  pinMode(remPin3, INPUT);
  pinMode(remPin4, INPUT);

//Sliding pot 
  pinMode(A5, INPUT);

randomSeed(analogRead(A3)); //generate a randomseed from noise on A3.
}



void loop() {
  // put your main code here, to run repeatedly:
  interval = analogRead(A5); //Speed controller via slide pot
  unsigned long currentTime = millis();
  int ledState2 = digitalRead(2); //state of GREEN LEDS
  int ledState3 = digitalRead(3);
  int ledState4 = digitalRead(4);
  int ledState5 = digitalRead(5);

  int buttonState8 = digitalRead(8); //state of corresponding buttons
  int buttonState9 = digitalRead(9);
  int buttonState10 = digitalRead(10);
  int buttonState11 = digitalRead(11);


  ButtonState = digitalRead(buttonPin);

//This if statement is to switch between manual or auto game modes by pressing a toggle switch
  if (LastButtonState == 0 && ButtonState == 1)
  {
    if (programState == 0)
    {
      programState = 1;
    }

    else
    {
      programState = 0;
    }
  }
  LastButtonState = ButtonState;

  
//if program state = 1, play auto game mode

  if (programState == 1) {

    if (currentTime - prevTime >= interval) {
      prevTime = currentTime;
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);

      RandomGen();
      int randLED = Generator;

      if (ledState == LOW) {
        digitalWrite(randLED, HIGH);
      }
      else {
        digitalWrite(randLED, LOW);
      }
      //ledState = digitalWrite(randLED, LOW);
    }

    if (ledState2 == HIGH && buttonState8 == HIGH) {
      digitalWrite(redLED, HIGH);
    } else digitalWrite(redLED, LOW);

    if (ledState3 == HIGH && buttonState9 == HIGH) {
      digitalWrite(redLED, HIGH);
    } else digitalWrite(redLED, LOW);

    if (ledState4 == HIGH && buttonState10 == HIGH) {
      digitalWrite(redLED, HIGH);
    } else digitalWrite(redLED, LOW);

    if (ledState5 == HIGH && buttonState11 == HIGH) {
      digitalWrite(redLED, HIGH);
    } else digitalWrite(redLED, LOW);

  }


// else play manual mode if button is pressed again

  else {
    
    int remPin1StateNew = digitalRead(A0);
    
    if (remPin1StateOld == 0 && remPin1StateNew == 1) {
      if (ledState2 == 0) {
        digitalWrite(2, HIGH);
        ledState2 = 1;
      } 
      else {
        digitalWrite(2, LOW);
        ledState2 = 0;
      }

      
    }
    remPin1StateOld = remPin1StateNew;

     int remPin2StateNew = digitalRead(A1);
    
    if (remPin2StateOld == 0 && remPin2StateNew == 1) {
      if (ledState3 == 0) {
        digitalWrite(3, HIGH);
        ledState3 = 1;
      } 
      else {
        digitalWrite(3, LOW);
        ledState3 = 0;
      }

      
    }
    remPin2StateOld = remPin2StateNew;

    

    int remPin3StateNew = digitalRead(A2);
    
    if (remPin3StateOld == 0 && remPin3StateNew == 1) {
      if (ledState4 == 0) {
        digitalWrite(4, HIGH);
        ledState4 = 1;
      } 
      else {
        digitalWrite(4, LOW);
        ledState4 = 0;
      }

      
    }
    remPin3StateOld = remPin3StateNew;



    int remPin4StateNew = digitalRead(A3);
    
    if (remPin4StateOld == 0 && remPin4StateNew == 1) {
      if (ledState5 == 0) {
        digitalWrite(5, HIGH);
        ledState5 = 1;
      } 
      else {
        digitalWrite(5, LOW);
        ledState5 = 0;
      }

      
    }
    remPin4StateOld = remPin4StateNew;



  }
Serial.println(Generator);


}


void RandomGen()
{
  Generator = random(2, 6);
  while (Generator == OldGenerator) //check if new is same as old
  {

    Generator = random(2, 6); // if they are, regenerate.
  }
  OldGenerator = Generator; // update OldGenerator
}

Look at the data sheets for your various color of LEDs. You should quickly notice the each takes a DIFFERENT current to produce the sale level of light. Is this your problem?

1 Like

Assuming the resistors are correct there is a mis wiring. Post a schematic showing the circuit as you have wired it. Nice movie but not much help.

Welcome

I think it's your logic that is wrong in this part :

if (ledState2 == HIGH && buttonState8 == HIGH) {
  digitalWrite(redLED, HIGH);
} else digitalWrite(redLED, LOW);

if (ledState3 == HIGH && buttonState9 == HIGH) {
  digitalWrite(redLED, HIGH);
} else digitalWrite(redLED, LOW);

if (ledState4 == HIGH && buttonState10 == HIGH) {
  digitalWrite(redLED, HIGH);
} else digitalWrite(redLED, LOW);

if (ledState5 == HIGH && buttonState11 == HIGH) {
  digitalWrite(redLED, HIGH);
} else digitalWrite(redLED, LOW);

If you press for example the button on pin 8 so the first if is true, the LED will turn on, but the next if will turn it off immediately after, and it happens thousand times every second, so the LED appears very dim because it is constantly switching on and off

You can verify it by changing for example this:

...
if (ledState4 == HIGH && buttonState10 == HIGH) {
  digitalWrite(redLED, HIGH);
} else digitalWrite(redLED, LOW);

if (ledState5 == HIGH && buttonState11 == HIGH) {
  digitalWrite(redLED, HIGH);
} else digitalWrite(redLED, LOW);
...

to this :

...
if (ledState5 == HIGH && buttonState11 == HIGH) {
  digitalWrite(redLED, HIGH);
} else digitalWrite(redLED, LOW);

if (ledState4 == HIGH && buttonState10 == HIGH) {
  digitalWrite(redLED, HIGH);
} else digitalWrite(redLED, LOW);
...

then it's the third button that will make the red LED bright and the fourth button will make it dim, so it excludes an hardware problem.

Here is a working program, but it's radically different than yours : t962424.ino - Wokwi Arduino and ESP32 Simulator

2 Likes

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