Hello, i am pretty new to arduino and is seeking assistance,
so i had a school project with trafficlights where the project was to make one function for a normal trafficlight sequence and another function for a "maintenance" sequence.
In the maintenance sequence the lights will always blink yellow if the button is low and then if the button is HIGH it will return with the value 1, if the value is 1 in that if statement, then it will return to the void loop.
I wanted to add in a interrupt to that code so that if the normal traffic light loop is running then i can interrupt it and start the yellow blinking instantly, and then with another push of the "Maintenance" button i want to stop the yellow blinking and go back to void loop.
i got the interrupt working but it seems to jump back to the while loop (Without completing it) so my question is if anyone could help me make this code work?
Code:
// Definerer utganger til konstante variabler
int const BUTTON_A = 8; // Trykknapp
int const BUTTON_B = 2; // Trykknapp
int const LED_ROD = 6; // Rødt lys
int const LED_GUL = 5; // Gult lys
int const LED_GRONN = 4; // Grønt lys
int const LED_ROD1 = 3; // Rødt lys
int const LED_GUL1 = 7; // Gult lys
int const LED_GRONN1 = 1; // Grønt lys
// Definerer verdi til variabler som vil endres når programmet kjører
int Button_State_A = 0;
volatile int Button_State_B = 0;
int last_state = LOW; // Viser knappen sin siste posisjon
void setup()
{
pinMode(13, OUTPUT);
pinMode(LED_ROD, OUTPUT); // Sitter LED som utgang
pinMode(LED_GUL, OUTPUT); // Sitter LED som utgang
pinMode(LED_GRONN, OUTPUT); // Sitter LED som utgang
pinMode(LED_ROD1, OUTPUT); // Sitter LED som utgang
pinMode(LED_GUL1, OUTPUT); // Sitter LED som utgang
pinMode(LED_GRONN1, OUTPUT); // Sitter LED som utgang
pinMode(BUTTON_A, INPUT); // BUTTON_A (Knapp A) som inngang
pinMode(BUTTON_B, INPUT); // BUTTON_B (Knapp B) som inngang
}
void loop()
{
digitalWrite(LED_GRONN1, HIGH);
digitalWrite(LED_ROD, HIGH);
//Definerer at Button_State_X leser av verdien til BUTTON_X).
Button_State_A = digitalRead(BUTTON_A);
attachInterrupt(0, pin_mode, CHANGE);
if (Button_State_A == HIGH && last_state == LOW)
{
delay(50);
digitalWrite(13, LOW);
trafikklys();
}
}
int pin_mode() {
Button_State_B = digitalRead(BUTTON_B);
int retur = gulelys();
if (Button_State_B == HIGH)
{
gulelys();
}
if(retur == 1)
{
return;
}
}
void trafikklys() // kjører trafikklys sekvens når knapp A er trykket
{
delay(1000);
digitalWrite(LED_GUL, LOW);
digitalWrite(LED_GUL1, LOW);
delay(50);
digitalWrite(LED_GRONN1, LOW);
digitalWrite(LED_GUL1, HIGH);
delay(500);
digitalWrite(LED_GUL1, LOW);
digitalWrite(LED_ROD1, HIGH);
delay(500);
digitalWrite(LED_ROD, HIGH);
digitalWrite(LED_GUL, HIGH);
delay(500);
digitalWrite(LED_ROD, LOW);
digitalWrite(LED_GUL, LOW);
digitalWrite(LED_GRONN, HIGH);
delay(2000);
digitalWrite(LED_GRONN, LOW);
digitalWrite(LED_GUL, HIGH);
delay(500);
digitalWrite(LED_GUL, LOW);
digitalWrite(LED_ROD, HIGH);
delay(500);
digitalWrite(LED_ROD1, HIGH);
digitalWrite(LED_GUL1, HIGH);
delay(500);
digitalWrite(LED_ROD1, LOW);
digitalWrite(LED_GUL1, LOW);
digitalWrite(LED_GRONN1, HIGH);
}
int gulelys() // Kjører gulelys sekvens når knapp B er trykket
{
while (digitalRead(BUTTON_B) == LOW)
{
detachInterrupt(0);
digitalWrite(13, HIGH);
digitalWrite(LED_ROD, LOW);
digitalWrite(LED_ROD1, LOW);
digitalWrite(LED_GRONN, LOW);
digitalWrite(LED_GRONN1, LOW);
digitalWrite(LED_GUL, HIGH);
digitalWrite(LED_GUL1, HIGH);
delay(500);
digitalWrite(13, LOW);
digitalWrite(LED_ROD, LOW);
digitalWrite(LED_ROD1, LOW);
digitalWrite(LED_GRONN, LOW);
digitalWrite(LED_GRONN1, LOW);
digitalWrite(LED_GUL, LOW);
digitalWrite(LED_GUL1, LOW);
delay(50);
}
return 1;
attachInterrupt(0, pin_mode, CHANGE);
}