How to make the LED's on after pressing the button once and turn off when pressed again?

Hi everyone,

for a school project we have to build a car indicator system which can do the following 6 things:

  1. continuously blink the right blinker(with a certain dutycycle) after pressing a button.

  2. continuously blink the left blinker(with a certain dutycycle) after pressing another button.

  3. make the led on the left side blink 5 times then stop(blinking again with a certain dutycycle).

4.make the led on the right side blink 5 times then stop(blinking again with a certain dutycycle)

  1. make both left and right LED's blink continuously (blinking again with a certain duty cycle)

  2. keep all lights off

this all has to be done with a maximum of 3 buttons and you cannot keep pressing the buttons. I'm still pretty new at programming and building with the arduino and I am having trouble making all of these requirements work. At the moment i have made a code that allowed me to do the 1st, 2nd, 5th and 6th requirements. the only problem with it is that i have to keep pressing the button. My first question is how do i code it so it keeps blinking when i press the button once and turn off when that button is pressed again.

My second question is how i can make the 3rd and 4th requirements work with the same 3 buttons( maybe press the middle button(danger lights) simultaniously with the left or right side corresponding with which needs to blink 5 times.

the code i have written so far is this:

int buttonrechts = 3;     // the number of the pushbutton pin
 int ledrechts =  12;      // the number of the LED pin
 
 int buttonlinks = 6;     // the number of the pushbutton pin
 int ledlinks =  13;      // the number of the LED pin

 int buttonalarm = 5;

// variables will change:
int buttonrechtsstatus = 0;         // variable for reading the pushbutton status
int vorige_rechts_status = 0;
int buttonlinksstatus = 0;         // variable for reading the pushbutton status
int vorige_links_status = 0;
int buttonalarmstatus = 0;
int vorige_alarm_status = 0;

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledrechts, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonrechts, INPUT);

  pinMode(ledlinks, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonlinks, INPUT);

  pinMode(buttonalarm,INPUT);

   Serial.begin(9600);
}

void loop() {
  // read the state of the pushbutton value:

  buttonrechtsstatus = digitalRead(buttonrechts);
 

  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (buttonrechtsstatus == HIGH) {
    // turn LED on:
    digitalWrite(ledrechts, HIGH);
    delay(197);
    digitalWrite(ledrechts, LOW);
    delay(167);
  } else {
    // turn LED off:
    digitalWrite(ledrechts, LOW);
  } 
  
  buttonlinksstatus = digitalRead(buttonlinks);
  
    if (buttonlinksstatus == HIGH) {
    // turn LED on:
    digitalWrite(ledlinks, HIGH);
    delay(197);
    digitalWrite(ledlinks, LOW);
    delay(167);
  } else {
    // turn LED off:
    digitalWrite(ledlinks, LOW);
  }

   buttonalarmstatus = digitalRead(buttonalarm);
  
    if (buttonalarmstatus == HIGH) {
    // turn LED on:
    digitalWrite(ledlinks, HIGH);
    digitalWrite(ledrechts, HIGH);
    delay(197);
    digitalWrite(ledlinks, LOW);
    digitalWrite(ledrechts, LOW);
    delay(167);
    } else {
    // turn LED off:
    digitalWrite(ledlinks, LOW);
    digitalWrite(ledrechts, LOW);
  }
}

this is how my board looks at the moment:

Don't You have an instructor to ask at the school?

Take a look at arduino/reference. Look for switch - case. Might be useful.
There are libraries for reading buttons. Your code read the current status of the button but looking for "button just pressed down", and the opposite, of pays better.

Can you do short press versus long press or double press to distinguish between features?

Single press on left or right = blinker. Turn off with same single press.
Double press on left or right = 5 blinks
Third button single press Is for warnings. Turn off with same single press
All off with double press on third button

Or replace single press by short press and double press by long press

You can study Button libraries (For example OneButton) to see how this is done.

Then you should make yourself familiar with state machines. That will give you a way for coding without blocking the code

Unfortunately our instructor told us what the assignment was and told us we needed to do our own research on yt and googl etc. To make the code

Is there more information or even examples about this library that you know of?

it's written right in the readme of the GitHub link

You can find more details on this library at Arduino OneButton Library

Matthias Hertel explains the concept behind the state machine in his library.

What does that mean?

  • You can't hold the button down to (eg) keep a light flashing?
  • Or, you can't press the button again and again to (eg) start blinking and then again to stop blinking and then again to start once more?
  • Or, something else? If so what?

Can you quote the exact text of the assignment?

you can't hold down the button to keep the light flashing

it is translated from dutch to english but this is our assignment:
Use Arduino and breadboard + components to create a system that controls the car's flashing light
simulates.
There are six states:
- All lights off
- Continuous right flashing light on
- Right flashing light flashes 5x
-Continuous left flashing light on
 -Left flashing light flashes 5x
- Continuous hazard lights (i.e. left and right flashes simultaneously) on
For the flashing light frequency, see Excel list. Enter your student number here, not your pcn number.
Make sure you don't have to hold down the push buttons. Use up to 3
push buttons. Describe in your comment what exactly your code does (for example, which code runs
exactly which state off, choice of statements).
Turn your assignment into a flow chart, electrical diagram, your own code in Arduino with comments and
a video showing the operation of your assignment (must be recognizable that you made this). Liver
this assignment in Gradework.

I was taught to start there; in this case I'd go for a state diagram.

One of the worst things to do, imo, is dive into the code too early and then get painted into a corner with an approach which might not suit the parts added later.

this is a trial code i just wrote to test out the OneButton commands and the problem i am having is that the LED just blinks twice and then turns of, is there a way to keep it blinking until i press the button again?

  // initialize the LED pin as an output:
  pinMode(ledrechts, OUTPUT);
  // initialize the pushbutton pin as an input:
buttonrechts.attachDoubleClick(doubleclick);


  pinMode(ledlinks, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonlinks, INPUT);

  pinMode(buttonalarm,INPUT);

   Serial.begin(9600);
}

void loop() {
  // read the state of the pushbutton value:

 buttonrechts.tick();
 delay(10);
}


void doubleclick()
{
  
   digitalWrite(ledrechts, HIGH);
    delay(197);
   digitalWrite(ledrechts, LOW);
    delay(167);
  
  

yes there is.

Don't post snippets (Snippets R Us!)

sorry, here is my code now. I tried it and it works as I intended it to so i just need to make a flowchart of it. Here is my code :

//Opdracht 1: knipperlicht
//Versie B
//Code van Wail Lahrech
//A2C Voor het vak ABP8

#include "OneButton.h"            //roept de OneButton library aan zodat deze gebruikt kan worden
 OneButton buttonrechts(3,true);  // OneButton variabelenaam(pinnummer,aan of uit)
 OneButton buttonlinks(5,true);
 OneButton buttonalarm(4,true);
 int ledrechts =  10;      // LEDpin nummer van de rechter led
 int ledlinks =  11;       // LEDpin nummer van de linker led



 // variabelen die veranderen met de button state(HIGH OF LOW)
 int buttonrechtsstatus = 0;                                 // variabele voor de rechter button
 int buttonlinksstatus = 0;                                  // variabele voor de linker button
 int buttonalalarmstatus = 0;                                //variabele voor de middelste button

 void setup() {
  
  // de buttons koppelen aan een command(double click, long press of click
  buttonlinks.attachDoubleClick(knipperlichtL);              //linkt de linker button aan een double click, deze roept wanneer er 2 keer gedruk wordt de void knipperlichtL aan
  buttonlinks.attachLongPressStop(snelwegknipperlichtL);     // linkt de linker button aan een longpress, deze roept de void snelwegknipperlichtL aan wanneer hij 1sec vastgehouden wordt
 
  buttonrechts.attachDoubleClick(knipperlichtR);             //linkt de rechter button aan een double click, deze roept wanneer er 2 keer gedruk wordt de void knipperlichtR aan
  buttonrechts.attachLongPressStop(snelwegknipperlichtR)    ;// linkt de rechter button aan een longpress, deze roept de void snelwegknipperlichtR aan wanneer hij 1sec vastgehouden wordt
  

  
  buttonalarm.attachLongPressStop(stopalles);          // linkt de middelste button aan een longpress, deze roept de void stopalles aan wanneer hij 1sec vastgehouden word
  buttonalarm.attachClick(gevarenlamp);                // linkt de middelste button aan een click, deze roept de void gevarenlamp aan wanneer hij 1x snel ingedrukt wordt


  pinMode(ledrechts, OUTPUT);                          //zet de rechter LED als output
  pinMode(ledlinks, OUTPUT);                           //zet de linker LED als output

   Serial.begin(9600);                                 // start de serial op 9600(gewoonlijk voor normale USB's)om gebruik te maken van de seriele plotter en dingen te kunnen controleren
}

void loop() {

 buttonrechts.tick();                                  //kijkt naar de waarde van de rechter button
 buttonlinks.tick();                                   //kijkt naar de waarde van de linker button
 buttonalarm.tick();                                   //kijkt naar de waarde van de middelste button
 delay(50);                                            //zorgt voor een delay tussen het opnieuw kijken van de waardes van de buttons

 //Knipperlicht rechts code
  if (buttonrechtsstatus==HIGH)                        //if-statement die kijkt wat de waarde van de rechterbutton is, die bepaald wordt in de void onderaan.
  {
    // LED code
    digitalWrite(ledrechts, HIGH);                     //zet de rechter LED aan
    delay(197);                                        //wacht een aantal ms(veranderd met PCN) voordat hij naar de volgende command gaat
    digitalWrite(ledrechts, LOW);                      //zet de rechter LED uit
    delay(167);                                        //wacht een aantal ms(veranderd met PCN) voordat hij naar de volgende command gaat


    
  } 
  
  else                                                 //is de if-statement hierboven niet gehaald blijft de lamp uit
  {
    digitalWrite(ledrechts, LOW);                      //laat de rechter LED uit
  } 





//Knipperlicht links code
  if (buttonlinksstatus==HIGH)                         //if-statement die kijkt wat de waarde van de linkerbutton is, die bepaald wordt in de void onderaan.
  {
    // LED code
    digitalWrite(ledlinks, HIGH);                      //zet de linker LED aan
    delay(197);                                        //wacht een aantal ms(veranderd met PCN) voordat hij naar de volgende command gaat
    digitalWrite(ledlinks, LOW);                       //zet de linker LED uit
    delay(167);                                        //wacht een aantal ms(veranderd met PCN) voordat hij naar de volgende command gaat


    
  } 
  
  else                                                 //is de if-statement hierboven niet gehaald blijft de lamp uit
  {
    digitalWrite(ledlinks, LOW);                       //zet de LED uit
  } 



  
//Gevarenlampen code

  if (buttonalalarmstatus==HIGH)                        //if-statement die kijkt wat de waarde van de middelste button is, die bepaald wordt in de void onderaan.
  {
    // LED code
    digitalWrite(ledrechts, HIGH);                      //zet de rechter LED aan
    digitalWrite(ledlinks, HIGH);                       //zet de linker LED aan
    delay(197);                                         //wacht een aantal ms(veranderd met PCN) voordat hij naar de volgende command gaat
    digitalWrite(ledrechts, LOW);                       //zet de rechter LED uit
    digitalWrite(ledlinks, LOW);                        //zet de linker LED uit
    delay(167);                                         //wacht een aantal ms(veranderd met PCN) voordat hij naar de volgende command gaat
    
  } 
  
  else                                                  //is de if-statement hierboven niet gehaald blijft de lamp uit
  {
    digitalWrite(ledrechts, LOW);                       //zet de rechter LED uit
    digitalWrite(ledlinks, LOW);                        //zet de linker LED uit
  } 
  

}


void knipperlichtR()                                    //deze void kijkt of de waarde behaald wordt die in de setup genoemd is en voerd deze command uit als deze behaald worden.
{
  buttonrechtsstatus=HIGH;                              //Maakt de variabele van de rechterkant HIGH en start dus een if-statement
  Serial.println("knipperlicht rechts aan");            //print "knipperlicht rechts aan" in de seriele plotter als de code werkt
}

void snelwegknipperlichtR()                             //deze void kijkt of de waarde behaald wordt die in de setup genoemd is en voerd deze command uit als deze behaald worden.
{
    digitalWrite(ledrechts, HIGH);//1è keer naar rechts
    delay(197);
    digitalWrite(ledrechts, LOW);
    delay(167);
    digitalWrite(ledrechts, HIGH);//2è keer naar rechts
    delay(197);
    digitalWrite(ledrechts, LOW);
    delay(167);
    digitalWrite(ledrechts, HIGH);//3è keer naar rechts
    delay(197);
    digitalWrite(ledrechts, LOW);
    delay(167);
    digitalWrite(ledrechts, HIGH);//4è keer naar rechts
    delay(197);
    digitalWrite(ledrechts, LOW);
    delay(167);
    digitalWrite(ledrechts, HIGH);//5è keer naar rechts
    delay(197);
    digitalWrite(ledrechts, LOW);
    delay(167);
  Serial.println("snelwegknipperlicht naar rechts aan");   //print "snelwegknipperlicht naar rechts aan" in de seriele plotter als de code werkt
}

void knipperlichtL()                                        //deze void kijkt of de waarde behaald wordt die in de setup genoemd is en voerd deze command uit als deze behaald worden.
{
  buttonlinksstatus = HIGH;                                //Maakt de eerder gemaakte variabele HIGH en start hiermee de if-statement
  Serial.println("knipperlicht links aan");                //print "knipperlicht links aan" in de seriele plotter als de code werkt
}
void snelwegknipperlichtL()                                 //deze void kijkt of de waarde behaald wordt die in de setup genoemd is en voerd deze command uit als deze behaald worden.
{
    digitalWrite(ledlinks, HIGH);//1è keer naar links
    delay(197);
    digitalWrite(ledlinks, LOW);
    delay(167);
    digitalWrite(ledlinks, HIGH);//2è keer naar links
    delay(197);
    digitalWrite(ledlinks, LOW);
    delay(167);
    digitalWrite(ledlinks, HIGH);//3è keer naar links
    delay(197);
    digitalWrite(ledlinks, LOW);
    delay(167);
    digitalWrite(ledlinks, HIGH);//4è keer naar links
    delay(197);
    digitalWrite(ledlinks, LOW);
    delay(167);
    digitalWrite(ledlinks, HIGH);//5è keer naar links
    delay(197);
    digitalWrite(ledlinks, LOW);
    delay(167);
  Serial.println("snelwegknipperlicht naar links aan");    //print "snelwegknipperlicht naar links aan" in de seriele plotter als de code werkt
}

void stopalles()                                      //deze void kijkt of de waarde behaald wordt die in de setup genoemd is en voerd deze command uit als deze behaald worden.
{
  buttonrechtsstatus=LOW;                             //Maakt de eerder gemaakte variabele LOW en stopt hiermee de if-statement
  buttonlinksstatus = LOW;                            //Maakt de eerder gemaakte variabele LOW en stopt hiermee de if-statement
  buttonalalarmstatus = LOW;                          //Maakt de eerder gemaakte variabele LOW en stopt hiermee de if-statement
  Serial.println("alle knipperlichten uit");          //print "alle knipperlichten uit" in de seriele plotter als de code werkt
}

void gevarenlamp()                                    //deze void kijkt of de waarde behaald wordt die in de setup genoemd is en voerd deze command uit als deze behaald worden.
{
  buttonalalarmstatus = HIGH;                         //Maakt de eerder gemaakte variabele HIGH en start hiermee een if-statement
  Serial.println("gevarenlampen aan");                //print "gevarenlampen aan" in de seriele plotter als de code werkt
}

you don't want any delay...

some of the call backs are blocking for a long time (almost 2 seconds for snelwegknipperlichtL) which means buttons won't be responsive during that time

so make remove this delay so it keeps checking the state of the buttons?

for the people who are interested or for people in the future this is my flow chart, it is in dutch but it corresponds to the names used in the code.

You can’t have technically 3 branches in parallel from the start node (unless you are multi tasking but then the flow chart won’t look like this)

I'd have gone for a state diagram rather than a traditional square and diamond flow chart.

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