ArduinoTutorials_template_BLOG_OP
Do you have an application where you want multiple buttons for different user inputs?  Maybe you have a timer and you want one button for minutes and another for hours.
But there is a problem – you only have room for one button!
In this tutorial, we are going to use Arduino to explore how to make one button have the functionality of two or more.

You Will Need:

(1) Momentary push button
(5) Jumper wires
(1) Solderless breadboard
(2) LEDs
(2) 220 Ohm resistors

Set Up The Circuit:

To demonstrate using a single button for multiple functions, we will set up a simple circuit with 2 LEDs and a button.  Based on how we press the button, different LEDs will illuminate.
Follow the instruction and schematic below to get the circuit setup before we dive into the mechanics of the Arduino code.
  1. Using a jumper wire, connect any GND pin from the Arduino, to the ground rail on your breadboard.
  2. Place an LED on your breadboard, make sure to note which way the long leg is facing.
  3. Using a jumper wire, connect pin 13 from your Arduino to the breadboard in the same channel where you have the long leg of the LED attached.
  4. Now connect one side of the 220 Ohm resistor to the short leg of the LED, and the other leg connect to the ground rail on the breadboard.  The orientation of the resistor doesn’t matter.
  5. Now repeat this using pin 12, and another LED and resistor.
  6. Finally, place your push button on the breadboard.  Depending on the style of your pushbutton, they often fit well straddling the long trench that goes through the breadboard.
  7. Connect a jumper wire form one side of the button to pin 2 on the Arduino.
  8. Connect a jumper wire from the other side of the button to the ground rail on the breadboard.
That's it for the circuit setup.  Now, when you press the push button (which will electrically connect both sides of the button), pin 2 to will have ground voltage applied.  We will use this ground voltage input to trigger our different functions.
Mutiple Button Presses_bb_OP

Examine the Sketch:

There are couple ways to implement the multi-function button press using Arduino.
One way is to have the number of presses determine the output.  For example, a single click might highlight the “hour” field of an LCD timer and a double click might highlight the “minute” field of the display.
Another way we can implement multiple functions with one button is for the user to hold down the button for different lengths of time, the length of the hold determining the output.
For example, if the user holds the button for half a second and releases, something happens.  If she holds it for 2 seconds, something different happens.
This latter method of using button hold length time to determine separate functions is the strategy we will learn here.
Before I go any further though, I would like to thank Steve for creating the base Arduino code that we will be using.  Steve is a member of the Premium Arduino course (a couple months ago he was new to Arduino).
While creating a home automation project he was in need of using a single button to do multiple things, and came up with a very simple way to make it happen.  Thanks Steve!
Here is the complete sketch, I recommend looking it over first, and then we will discuss it piece by piece below.


/*
    The circuit:
     * LED attached from pin 13 to ground through a 220 ohm resistor
     * LED attached from pin 12 to ground through a 220 ohm resistor
     * one side of momentary pushbutton attached to pin 2
     * other side of momentary pushbutton attached to Ground
    
     * Note 1: on most Arduinos there is already an LED on the board
     attached to pin 13.
     * Note 2: In this circuit, when the button is pressed, Ground Volatage is what will be
    
     Created DEC 2014 by Scuba Steve
     Modified JAN 2015 by Michael James
     Both members of https://OpenSourceHardwareGroup.com
    
     This code is in the public domain
     */


    /////////Declare and Initialize Variables////////////////////////////

    //We need to track how long the momentary pushbutton is held for in order to exectute different commands
    //This value will be recorded in seconds
    float pressLength_milliSeconds = 0;

    // Define the *minimum* length of time, in milli-seconds, that the button must be pressed for a particular option to occur
    int optionOne_milliSeconds = 100;
    int optionTwo_milliSeconds = 2000;       

    //The Pin your button is attached to
    int buttonPin = 2;

    //Pin your LEDs are attached to
    int ledPin_Option_1 = 13;
    int ledPin_Option_2 = 12;

    void setup(){

      // Initialize the pushbutton pin as an input pullup
      // Keep in mind, when pin 2 has ground voltage applied, we know the button is being pressed
      pinMode(buttonPin, INPUT_PULLUP);    

      //set the LEDs pins as outputs
      pinMode(ledPin_Option_1, OUTPUT);
      pinMode(ledPin_Option_2, OUTPUT);

      //Start serial communication - for debugging purposes only
      Serial.begin(9600);                                    

    } // close setup


    void loop() {

      //Record *roughly* the of tenths of seconds the button in being held down
      while (digitalRead(buttonPin) == LOW ){

        delay(100);  //if you want more resolution, lower this number
        pressLength_milliSeconds = pressLength_milliSeconds + 100;  

        //display how long button is has been held
        Serial.print("ms = ");
        Serial.println(pressLength_milliSeconds);

      }//close while


      //Different if-else conditions are triggered based on the length of the button press
      //Start with the longest time option first

      //Option 2 - Execute the second option if the button is held for the correct amount of time
      if (pressLength_milliSeconds >= optionTwo_milliSeconds){

        digitalWrite(ledPin_Option_2, HIGH);    

      }

      //option 1 - Execute the first option if the button is held for the correct amount of time
      else if(pressLength_milliSeconds >= optionOne_milliSeconds){

        digitalWrite(ledPin_Option_1, HIGH); 

      }//close if options


      //every time through the loop, we need to reset the pressLength_Seconds counter
      pressLength_milliSeconds = 0;

    } // close void loop