Introduction
In this project, I am going to teach you how to give multiple functions in a single push switch. Below is the list of different ways of using the switches for different functions,
- Single Tap
 - Double Tap
 - Triple Tap
 - Four Tap
 - Hold
 - Tap and hold
 
“there can be more if you can be creative”
Demo
Things Required
- Arduino or any other compatible board
 - Micro push button
 - RGB LED, for testing the switch functions.
 
Theory
- First, we calculate the time gap between each button press and the number of times the button is pressed
 - Then according to the no. of times, the button is pressed we are calling different functions
 - like the same way if the time gap is more than the preset value then we consider it as a “hold” and we call the functions which we associate to it
 
watch the full video for detailed programming instructions.
Hardware Required
Circuit
- Connect one leg of the push button to any digital pin.
 - connect the other leg to the ground of Arduino.
 
Full Video
Part 1
Part 2
Code
//www.diyusthad.com
//www.youtube.com/c/diyusthad
//www.facebook.com/diyusthad
//program by diyusthad
//code for programming multiple functions to a single push button
#define sw 5 //pin at push sw is connected
#define red 12
#define green 11
#define blue 10
int lastButtonState = HIGH;   // the previous reading from the input pin
unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
unsigned long debounceDelay = 50;    // the debounce time; increase if the output flickers
bool buttonState = HIGH; //saving state of the switch
byte tapCounter; //for saving no. of times the switch is pressed
int timediff; //for saving the time in between each press and release of the switch
bool flag1, flag2; //just two variables
long double presstime, releasetime; //for saving millis at press and millis at release
void setup() {
  Serial.begin(9600); //for serial monitor
  pinMode(sw, INPUT_PULLUP); //setting pin 5 as input with internal pull up resistor
  pinMode(red, OUTPUT); digitalWrite(red, HIGH);
  pinMode(green, OUTPUT); digitalWrite(green, HIGH);
  pinMode(blue, OUTPUT); digitalWrite(blue, HIGH);
//  digitalWrite(red, LOW);
//  delay(1000);
//  digitalWrite(red, HIGH);
//  delay(1000);
//  digitalWrite(green, LOW);
//  delay(1000);
//  digitalWrite(green, HIGH);
//  delay(1000);
//  digitalWrite(blue, LOW);
//  delay(1000);
//  digitalWrite(blue, HIGH);
}
void loop() {
  int reading = digitalRead(sw);
  if (reading != lastButtonState) {
    // reset the debouncing timer
    lastDebounceTime = millis();
  }
  if ((millis() - lastDebounceTime) > debounceDelay) {
    // whatever the reading is at, it's been there for longer than the debounce
    // delay, so take it as the actual current state:
    // if the button state has changed:
    if (reading != buttonState) {
      buttonState = reading;
    }
  }
  //Serial.println(buttonState);
  //when switch is pressed
  if (buttonState == 0 && flag2 == 0)
  {
    presstime = millis(); //time from millis fn will save to presstime variable
    flag1 = 0;
    flag2 = 1;
    tapCounter++; //tap counter will increase by 1
    //delay(10); //for avoiding debouncing of the switch
  }
  //when sw is released
  if (buttonState == 1 && flag1 == 0)
  {
    releasetime = millis(); //time from millis fn will be saved to releasetime var
    flag1 = 1;
    flag2 = 0;
    timediff = releasetime - presstime; //here we find the time gap between press and release and stored to timediff var
    //Serial.println(timediff);
    //delay(10);
  }
  if ((millis() - presstime) > 400 && buttonState == 1) //wait for some time and if sw is in release position
  {
    if (tapCounter == 1) //if tap counter is 1
    {
      if (timediff >= 400) //if time diff is larger than 400 then its a hold
      {
        Serial.println("Hold");
        hold(); //fn to call when the button is hold
      }
      else //if timediff is less than 400 then its a single tap
      {
        Serial.println("single tap");
        singleTap(); //fn to call when the button is single taped
      }
    }
    else if (tapCounter == 2 ) //if tapcounter is 2
    {
      if (timediff >= 400) // if timediff is greater than  400 then its single tap and hold
      {
        Serial.println("single tap and hold");
        tapAndHold(); //fn to call when the button is single tap and hold
      }
      else // if timediff is less than 400 then its just double tap
      {
        Serial.println("double tap");
        doubleTap(); //fn to call when doubletap
      }
    }
    else if (tapCounter == 3) //if tapcounter is 3 //then its triple tap
    {
      Serial.println("triple tap");
      tripleTap(); //fn to call when triple tap
    }
    else if (tapCounter == 4) //if tapcounter is 4 then its 4 tap
    {
      Serial.println("four tap");
      fourTap();//fn to call when four tap
    }
    tapCounter = 0;
  }
  lastButtonState = reading;
}
void nolight()
{
  digitalWrite(red, HIGH);
  digitalWrite(green, HIGH);
  digitalWrite(blue, HIGH);
}
void singleTap()
{
  nolight();
  digitalWrite(red, LOW);
}
void doubleTap()
{
  nolight();
  digitalWrite(green, LOW);
}
void tripleTap()
{
  nolight();
  digitalWrite(blue, LOW);
}
void fourTap()
{
  nolight();
  digitalWrite(red, LOW);
  digitalWrite(blue, LOW);
}
void hold()
{
  nolight();
  digitalWrite(red, LOW);
  digitalWrite(green, LOW);
}
void tapAndHold()
{
  nolight();
  digitalWrite(green, LOW);
  digitalWrite(blue, LOW);
}
To buy electronic components order from UTSOURCE

