Single Double Click and Long Press Detection

Solving Approach

How do you plan to solve it?

 
 

 

 

 

Code

/*Paste your code here*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define BUTTON_PIN     7
#define LONG_PRESS_MS 1000
#define DOUBLE_CLICK_MS 400
#define RESET_DELAY   2000
#define DEBOUNCE_MS     50

LiquidCrystal_I2C lcd(0x27, 16, 2);

void showWaiting() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Waiting for");
  lcd.setCursor(0, 1);
  lcd.print("button press...");
}

void showMessage(const char* line1, const char* line2) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(line1);
  lcd.setCursor(0, 1);
  lcd.print(line2);
  delay(RESET_DELAY);
  showWaiting();
}

void setup() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  lcd.init();
  lcd.backlight();
  showWaiting();
}

void loop() {
  if (digitalRead(BUTTON_PIN) == LOW) {
    delay(DEBOUNCE_MS);
    if (digitalRead(BUTTON_PIN) != LOW) return;

    unsigned long pressStart = millis();
    bool longDetected = false;

    while (digitalRead(BUTTON_PIN) == LOW) {
      if (!longDetected && (millis() - pressStart >= LONG_PRESS_MS)) {
        showMessage("Long Press", "Detected");
        longDetected = true;
      }
      delay(10);
    }

    if (longDetected) {
      delay(200);
      return;
    }

    delay(DEBOUNCE_MS);

    unsigned long waitStart = millis();
    bool secondPressed = false;

    while (millis() - waitStart < DOUBLE_CLICK_MS) {
      if (digitalRead(BUTTON_PIN) == LOW) {
        delay(DEBOUNCE_MS);
        if (digitalRead(BUTTON_PIN) == LOW) {
          while (digitalRead(BUTTON_PIN) == LOW) delay(10);
          secondPressed = true;
        }
        break;
      }
      delay(10);
    }

    if (secondPressed) {
      showMessage("Double Click", "Detected");
    } else {
      showMessage("Single Click", "Detected");
    }

    delay(200);
  }
}

 

 

 

Output

Video

Add a video of the output (know more)

 

 

 



Photo of Output

No description available.
Upvote
Downvote

Submit Your Solution

Note: Once submitted, your solution goes public, helping others learn from your approach!