Arduino long-short button press

One of the basic user interactions is button press. You can specify how the arduino program behaves when you press a long or short button. The following arduino sample codes show a few options.

The following arduino example, on a single keypress, writes to the serial console that the key has been pressed. It doesn’t matter how long we pressed the button.

/**************************************/
/*      https://myhomethings.eu       */
/**************************************/

const byte buttonPin = 8;
bool printFlag = false;

void setup() 
{
  Serial.begin(9600);
  pinMode(buttonPin, INPUT_PULLUP);
}
void loop() 
{
  buttonState = digitalRead(buttonPin);
  if(buttonState == LOW && printFlag == false) 
  {
    Serial.println("button is pressed");
    printFlag = true;
    delay(200);
  }
  else
  {
    printFlag = false;
  }
}

The following example code already runs according to the three different states of the pushbutton. These states are the key pressed, the short key press, and the long key press.

/**************************************/
/*      https://myhomethings.eu       */
/**************************************/

const byte buttonPin = 8;

long holdingTime;
long previousHoldingTime;
unsigned long firstButtonPressTime;
byte buttonState;
byte previousButtonState = HIGH;

void setup() 
{
  Serial.begin(9600);
  pinMode(buttonPin, INPUT_PULLUP);
}

void loop() 
{
  buttonState = digitalRead(buttonPin);

  if (buttonState == LOW && previousButtonState == HIGH && (millis() - firstButtonPressTime) > 200) 
  {
    firstButtonPressTime = millis();
  }
  holdingTime = (millis() - firstButtonPressTime);

  if (holdingTime > 50) 
  {
    if (buttonState == LOW && holdingTime > previousHoldingTime) 
    {
      Serial.println("button is pressed");
    }
    if (buttonState == HIGH && previousButtonState == LOW) 
    {
      if (holdingTime <= 400)
      {
        Serial.println("short button press");       
      }
      if (holdingTime > 400) 
      {
        Serial.println("long button press");
      }
    }
  }
   previousButtonState = buttonState;
   previousHoldingTime = holdingTime;
}

For example, the pressed button can be followed by light or sound feedback. According to the following arduino diagram, the on-board LED lights up when the button is pressed. When the button is pressed briefly, the beeper beeps once, and when the button is pressed for a long time, it beeps twice. Let’s build this circuit first.

Arduino Uno - push button and beeper
Arduino Uno – push button and beeper

Then upload the code to Arduino Uno .

/**************************************/
/*      https://myhomethings.eu       */
/**************************************/

const byte buttonPin = 8;
const byte tweeter = 9;
const byte ledPin = 13;

long holdingTime;
long previousHoldingTime;
unsigned long firstButtonPressTime;
byte buttonState;
byte previousButtonState = HIGH;

const int note = 4699;

void beepsOnce()
{
  tone(tweeter, note, 125);
  delay(180);
  noTone(tweeter);
}
void beepsTwice()
{
  for (int i = 0; i < 2; i++) 
  {
    tone(tweeter, note, 125);
    delay(60);
    noTone(tweeter);
    delay(60);
  }
}
void setup() 
{
  Serial.begin(9600); 
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
}
void loop() 
{
  buttonState = digitalRead(buttonPin);

  if (buttonState == LOW && previousButtonState == HIGH && (millis() - firstButtonPressTime) > 100) 
  {
    firstButtonPressTime = millis();
  }
  holdingTime = (millis() - firstButtonPressTime);

  if (holdingTime > 50) 
  {
    if (buttonState == LOW && holdingTime > previousHoldingTime) 
    {
      Serial.println("button is pressed");
      digitalWrite(ledPin, HIGH);
    }
    if (buttonState == HIGH && previousButtonState == LOW) 
    {
      if (holdingTime <= 400)
      {         
        Serial.println("short button press");
        beepsOnce();
        digitalWrite(ledPin, LOW);
      }
      if (holdingTime > 400) 
      {
        Serial.println("long button press");
        beepsTwice();
        digitalWrite(ledPin, LOW);
      }
    }
  }
  previousButtonState = buttonState;
  previousHoldingTime = holdingTime;
}

Another option is to abort the arduino program by pressing the button. Use attachInterrupt () to exit the infinite while loop. Iterrupt pins on Arduino Uno, Nano, boards is: 2, 3.

const byte interruptPin = 3;

void buttonInterrupt() 
{
  Serial.println("Button is pressed!");
}
void setup() 
{
  Serial.begin(9600);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), buttonInterrupt, CHANGE);
}
void loop() 
{
  while(true)
  {
    delay(100);
  }
}

See other examples as well. ESP32, ESP8266, Arduino sketches, examples