Turning LED off after 3 clicks

So as the question says, after pressing a button 3 times the LED needs to blink 3 times. I have already wrote some code that if you press it once it blinks 3 times, but I don’t really know yet how to make it for 3 clicks.

void loop() {
 b = digitalRead(PIN_BUTTON_1);

 if (b == LOW)
 {
 for (i = 1; i <= 3; i=i+1)
 {
 digitalWrite(PIN_LED_RED, HIGH);
 delay(1000);
 digitalWrite(PIN_LED_RED, LOW);
 delay(1000);
 }
 }
}

Forget about the blinks for now, concentrate on counting the transitions

Is this supposed to happen only with 3? For example, if the button is pressed 5 times, should it blink 5 times?

Try this code
setting blinkCounter to >0 starts blinking that many times

//https://forum.arduino.cc/index.php?topic=733312.0
// RepeatingMillisDelay.ino

#include <millisDelay.h>
// from SafeString library from Arduino library manager
// see https://www.forward.com.au/pfod/ArduinoProgramming/TimingDelaysInArduino.html


int led = 13;
// Pin 13 has an LED connected on most Arduino boards.
bool ledOn = false; // keep track of the led state

millisDelay ledDelay;
unsigned long ledDelay_ms = 500;

millisDelay restartLedBlink;
unsigned long restartLedBlink_ms = 6000ul; // each 10 sec blink 3 times

int blinkCounter = 0;

void setup() {
  Serial.begin(9600);
  for (int i = 10; i > 0; i--) {
    Serial.print(' '); Serial.print(i);
    delay(1000);
  }
  Serial.println();

  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);   // initialize the digital pin as an output.
  digitalWrite(led, LOW); // turn led off
  ledOn = false;

  // start delay
  ledDelay.start(ledDelay_ms);
  blinkCounter = 3; // blink only 3 times
  restartLedBlink.start(restartLedBlink_ms);

}

void ledBlink() {
  // check if delay has timed out
  if (ledDelay.justFinished()) {
    ledDelay.repeat(); // start delay again without drift
    if (blinkCounter <= 0) {
      return; // nothing to do
    }
    // toggle the led
    ledOn = !ledOn;
    if (ledOn) {
      digitalWrite(led, HIGH); // turn led on
    } else {
      digitalWrite(led, LOW); // turn led off
      blinkCounter--;
    }
  }
}

void loop() {
  ledBlink(); // call this every loop
  
  // set counter to > 0 to start blinking
  if (restartLedBlink.justFinished()) {
    restartLedBlink.repeat();
    Serial.println(F("restart blink"));
    blinkCounter = 3;
  }
}

For button presses check out my tutorial on Debouncing Switches in Arduino

The below code includes debouncing, blink without delay, and counting

#include <ezButton.h> // ezButton library
#include <ezOutput.h> // ezOutput library

ezButton button(7); // create ezButton object that attach to pin 7;
ezOutput led(9);    // create ezOutput object that attach to pin 9;

unsigned long lastCount = 0;

void setup() {
  Serial.begin(9600);
  button.setDebounceTime(50); // set debounce time to 50 milliseconds
  button.setCountMode(COUNT_FALLING);
}

void loop() {
  button.loop(); // MUST call the loop() function first
  led.loop(); // MUST call the led1.loop() function in loop()

  unsigned long count = button.getCount();
  if (count != lastCount) {
    Serial.println(count);

    if ((count % 3) == 0)
      led.blink(1000, 1000, 0, 6); // 0 milliseconds OFF, 100 milliseconds ON, start immediately,
                                   // since toggle times is 6. it changes: OFF -> ON, ON -> OFF 6 times <=> blink 3 time

    lastCount = count;
  }
}

I managed to make it work that if I press the button 3 times the LED turns on, but now I want the opposite. So if I press the button 3 times again the LED turns off.

[pre][code]void loop(){
  if (digitalRead(PIN_BUTTON_1) == LOW) 
  {
    buttonPresses++;                  
    delay(250);                      
  }
  if (buttonPresses == 3)
  {
    for (int i = 0; i <= buttonPresses; i++)
    {
        digitalWrite(PIN_LED_RED, HIGH);
    }
    lastPressCount = buttonPresses;    
  }
}

[/pre]
[/code]

Merged 2 closely related topics

@viperwave - please don't do that again !

Oops :sweat_smile:

Thought I opened a new topic mb.

Thought I opened a new topic mb.

You did but I don’t understand why

I merged them to avoid duplication when it came to providing help

viperwave:
, but now I want the opposite. So if I press the button 3 times again the LED turns off.

Look here: timer counter state change toggle FSM tutorial

The action of toggleBool will do what you want.