The overview of my code is that I want a toggle button to be pushed and each button push will move the code to the next case statement. In each case statement, there will be different LED functions. I need help with a few things
- I need help with blinking 4 of the LEDs continuously with 100ms pause in case 1. Because it is not in the main loop, I am having trouble getting the 4 LEDs to switch on and off. Normally, I could just have a simple code that turns it on, then compares previous to last and if different, turns it off, and this continues.
- I need the code to go back to case 0 once the button has been held for 2 seconds.
- I cannot get my button debounce code to work from case 0 to case 1. If I add the debounce code in case 0 how I have it in the rest of the cases, it wont run through the rest of the cases. Below is the code:
//LED variables for left turn signal OUT
int LED_1 = 2;
int LED_2 = 3;
int LED_3 = 4;
int LED_4 = 5;
//LED variables for right turn signal OUT
int LED_5 = 6;
int LED_6 = 7;
int LED_7 = 8;
int LED_8 = 9;
//break signal OUT
int BS_OUT = A5;
//reverse signal OUT
int RS_OUT = 10;
//toggle switch button between different modes
int toggle_IN = A4;
//switch case statement variable for togglemodes
int toggleState = 0;
//variables to see if the toggle button has been pressed or not
boolean oldSwitchStateToggle = LOW;
boolean newSwitchStateToggle = LOW;
//true or false to save whether button has been pressed for switching case statements
bool enabledToggle;
//debounce time to take care of button bouncing
const int debounce = 100; //ms
//time for holding a current time of millis()
unsigned long t = 0;
void setup()
{
Serial.begin(9600);
//toggle button input
pinMode(toggle_IN, INPUT);
//led outputs
pinMode(LED_4, OUTPUT);
pinMode(LED_3, OUTPUT);
pinMode(LED_2, OUTPUT);
pinMode(LED_1, OUTPUT);
pinMode(LED_5, OUTPUT);
pinMode(LED_6, OUTPUT);
pinMode(LED_7, OUTPUT);
pinMode(LED_8, OUTPUT);
}
void loop()
{
//checking to see if toggle button has been pushed
newSwitchStateToggle = digitalRead(toggle_IN);
if(newSwitchStateToggle != oldSwitchStateToggle)
{
if(newSwitchStateToggle == HIGH)
{
//enabling toggle for if statements
enabledToggle = true;
//case switch for flow through 4 different LED output options
toggleButtonState();
}
else
enabledToggle = false;
oldSwitchStateToggle = newSwitchStateToggle;
}
}
void toggleButtonState()
{
unsigned long nowToggle = millis();
switch (toggleState)
{
case 0:
Serial.println("0000");
if(enabledToggle)
{
digitalWrite(LED_1, HIGH);
t = nowToggle;
toggleState = 1;
}
break;
case 1:
Serial.println("1111");
if(enabledToggle)
{
digitalWrite(LED_1, LOW);
digitalWrite(LED_2, HIGH);
//alows going to next state after 100ms for button debounce
if(nowToggle - t > debounce)
{
toggleState = 2;
t = nowToggle;
}
}
break;
case 2:
Serial.println("2222");
if(enabledToggle)
{
digitalWrite(LED_2, LOW);
digitalWrite(LED_3, HIGH);
if(nowToggle - t > debounce)
{
toggleState = 3;
t = nowToggle;
}
}
break;
case 3:
Serial.println("3333");
if(enabledToggle)
{
digitalWrite(LED_3, LOW);
digitalWrite(LED_4, HIGH);
if(nowToggle - t > debounce)
{
toggleState = 4;
t = nowToggle;
}
}
break;
case 4:
Serial.println("44444");
if(enabledToggle)
{
turnOffLeds();
if(nowToggle - t > debounce)
{
toggleState = 0;
t = nowToggle;
}
}
break;
}
}
void turnOffLeds()
{
digitalWrite(LED_1, LOW);
digitalWrite(LED_2, LOW);
digitalWrite(LED_3, LOW);
digitalWrite(LED_4, LOW);
}
updated code: trying to add in debounce but it will not work
int LED_1 = 2;
int LED_2 = 3;
int LED_3 = 4;
int LED_4 = 5;
int LED_5 = 6;
int LED_6 = 7;
int LED_7 = 8;
int LED_8 = 9;
//toggle switch button between different modes
int toggle_IN = A4;
//switch case statement variable for togglemodes
int toggleState = 0;
//variables to see if the toggle button has been pressed or not
boolean oldSwitchStateToggle = LOW;
boolean newSwitchStateToggle = LOW;
//true or false to save whether button has been pressed for switching case statements
bool enabledToggle;
//debounce time to take care of button bouncing
const int debounce = 100; //ms
//time for holding a current time of millis()
unsigned long t = 0;
int ledBlinkState = LOW;
unsigned long prevBlinkMillis = 0;
const int blinkInterval = 150;
bool state1 = false;
bool state2 = false;
bool state3 = false;
bool state4 = false;
bool state0 = false;
void setup()
{
Serial.begin(9600);
//toggle button input
pinMode(toggle_IN, INPUT);
//led outputs
pinMode(LED_4, OUTPUT);
pinMode(LED_3, OUTPUT);
pinMode(LED_2, OUTPUT);
pinMode(LED_1, OUTPUT);
pinMode(LED_5, OUTPUT);
pinMode(LED_6, OUTPUT);
pinMode(LED_7, OUTPUT);
pinMode(LED_8, OUTPUT);
}
void loop()
{
unsigned long nowToggle = millis();
Serial.print("NOWWWWWW");
Serial.println(nowToggle);
//checking to see if toggle button has been pushed
newSwitchStateToggle = digitalRead(toggle_IN);
if(newSwitchStateToggle != oldSwitchStateToggle)
{
t = nowToggle;
Serial.print("TIMEEEEE");
Serial.println(t);
if(newSwitchStateToggle == HIGH)
{
if(nowToggle - t > debounce)
{
//enabling toggle for if statements
enabledToggle = true;
//case switch for flow through 4 different LED output options
toggleButtonState();
}
}
else
enabledToggle = false;
oldSwitchStateToggle = newSwitchStateToggle;
}
unsigned long currentBlinkMillis = millis();
if(state0 == true)
{
digitalWrite(LED_5, HIGH);
digitalWrite(LED_6, HIGH);
digitalWrite(LED_7, HIGH);
digitalWrite(LED_8, HIGH);
if(currentBlinkMillis - prevBlinkMillis >= blinkInterval)
{
prevBlinkMillis = currentBlinkMillis;
if(ledBlinkState == LOW)
{
ledBlinkState = HIGH;
}
else
{
ledBlinkState = LOW;
}
digitalWrite(LED_1, ledBlinkState);
digitalWrite(LED_2, ledBlinkState);
digitalWrite(LED_3, ledBlinkState);
digitalWrite(LED_4, ledBlinkState);
}
}
if(state1 == true)
{
digitalWrite(LED_1, HIGH);
digitalWrite(LED_2, HIGH);
digitalWrite(LED_3, HIGH);
digitalWrite(LED_4, HIGH);
if(currentBlinkMillis - prevBlinkMillis >= blinkInterval)
{
prevBlinkMillis = currentBlinkMillis;
if(ledBlinkState == LOW)
{
ledBlinkState = HIGH;
}
else
{
ledBlinkState = LOW;
}
digitalWrite(LED_5, ledBlinkState);
digitalWrite(LED_6, ledBlinkState);
digitalWrite(LED_7, ledBlinkState);
digitalWrite(LED_8, ledBlinkState);
}
}
if(state2 == true)
{
if(currentBlinkMillis - prevBlinkMillis >= blinkInterval)
{
prevBlinkMillis = currentBlinkMillis;
if(ledBlinkState == LOW)
{
ledBlinkState = HIGH;
}
else
{
ledBlinkState = LOW;
}
digitalWrite(LED_1, ledBlinkState);
digitalWrite(LED_2, ledBlinkState);
digitalWrite(LED_3, ledBlinkState);
digitalWrite(LED_4, ledBlinkState);
digitalWrite(LED_5, ledBlinkState);
digitalWrite(LED_6, ledBlinkState);
digitalWrite(LED_7, ledBlinkState);
digitalWrite(LED_8, ledBlinkState);
}
}
if(state3 == true)
{
digitalWrite(LED_1, HIGH);
digitalWrite(LED_2, HIGH);
digitalWrite(LED_3, HIGH);
digitalWrite(LED_4, HIGH);
digitalWrite(LED_5, HIGH);
digitalWrite(LED_6, HIGH);
digitalWrite(LED_7, HIGH);
digitalWrite(LED_8, HIGH);
}
if(state4 == true)
{
turnOffLeds();
}
}
void toggleButtonState()
{
switch (toggleState)
{
case 0:
Serial.println("0000");
if(enabledToggle)
{
turnOffLeds();
state4 = false;
state0 = true;
toggleState = 1;
}
break;
case 1:
Serial.println("1111");
if(enabledToggle)
{
turnOffLeds();
state0 = false;
state1 = true;
toggleState = 2;
}
break;
case 2:
Serial.println("2222");
if(enabledToggle)
{
turnOffLeds();
state1 = false;
state2 = true;
toggleState = 3;
}
break;
case 3:
Serial.println("3333");
if(enabledToggle)
{
turnOffLeds();
state2 = false;
state3 = true;
toggleState = 4;
}
break;
case 4:
Serial.println("44444");
if(enabledToggle)
{
turnOffLeds();
state3 = false;
state4 = true;
toggleState = 0;
}
break;
}
}
void turnOffLeds()
{
digitalWrite(LED_1, LOW);
digitalWrite(LED_2, LOW);
digitalWrite(LED_3, LOW);
digitalWrite(LED_4, LOW);
digitalWrite(LED_5, LOW);
digitalWrite(LED_6, LOW);
digitalWrite(LED_7, LOW);
digitalWrite(LED_8, LOW);
}