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
}