ArtsAutosBooksBusinessEducationEntertainmentFamilyFashionFoodGamesGenderHealthHolidaysHomeHubPagesPersonal FinancePetsPoliticsReligionSportsTechnologyTravel

Starting with arduino: Multiple buttons on 1 pin

Updated on April 28, 2013

There might be a project where you want to use a lot of buttons. But there is a problem, if you connect each of the buttons to a different digital pin, you won't have any pins left for any other items you might want to connect to arduino. To avoid that I am going to show you, how you can use multiple buttons with 1 analog pin.

What you'll need:

  • 5 Different value resistors ( I used 100, 220, 360 and 2x470 Ω resistors)
  • 4 buttons

Theory behind it

The way it works is quite simple. First you need to understand how voltage divider works. Here is example of one:

Source

As you can see there are 2 resistors and in between there is an output wire which has voltage Vout. The value of Vout is always the same as voltage drop across resistor R2. If instead of Vout we connect the wire to arduino pin, we can read digital value of voltage drop across resistor R2. Now if we remove resistor R1 and use button in its place, we create circuit in which all of the voltage Vin drops across the button, because button is not pressed, therefore has infinite resistance.

If all of the voltage drops across button, there is zero voltage drop across resistor R2, therefore Vout would be zero and arduino would read it as 0(LOW) if connected to digital pin or 0 if connected to analog pin. But if the button is pressed, all of the voltage would drop across resistor R2, because button would act like a wire with almost 0 resistance. In this case arduino would read incoming singal as 1(HIGH) if connected to digital pin or 1023 if connected to analog pin.

Now we can create a circuit in which Vout value changes depending on which button is pressed. The circuit is shown below:

As you can see there are 4 resistors and 4 buttons connected in parallel. Once one of the button is pressed the total resistance of R1-4 changes, because one of the resistor becomes shorted by the button. Therefore the voltage drops changes, more voltage drops across resistor R5 and less on R1-4.

Now as you can see all of the resistors have different values, therefore the impact of one of them being shorted will be different. Resistor with least resistance has least impact on the value of Vout. So when you pick the resistors for your circuit try to select ones with somewhat similar value, don't put 100 ohms together with 1k+ ohms resistors, because the readings may become inaccurate.

Finding out values of button presses

In order to know which button is pressed we are going to create a program in which every 2 seconds button will be pressed and the value of readings from analog pin 0 will be posted in serial monitor. Program code is shown below.

const int buttons = 0;
void setup()
{
Serial.begin(9600);
pinMode(buttons,INPUT);
}
void loop()
{
int value = analogRead(buttons);
Serial.println("No button is pressed: ");
Serial.println(value);
delay(2000);
value = analogRead(buttons);
Serial.println("Button S1 is pressed: ");
Serial.println(value);
delay(2000);
value = analogRead(buttons);
Serial.println("Button S2 is pressed: ");
Serial.println(value);
delay(2000);
value = analogRead(buttons);
Serial.println("Button S3 is pressed: ");
Serial.println(value);
delay(2000);
value = analogRead(buttons);
Serial.println("Button S4 is pressed: ");
Serial.println(value);
delay(2000);
}

Results

These values are not entirely correct, because resistors tend to heat up and their resistance increases. Therefore we have to make some changes to these values. As I tested button presses I noticed an error of ±1. So if button is pressed the readings have to satisfy this condition: ButtonValue-1<=Readings<=Buttonvalue + 1

Using buttons

Since we now know how to detect button presses with single analog pin, we are going to write simple program that detects which button is pressed and lights up one of the 4 LEDs.

Connect 4 LEDs with resistors to 5, 6, 7, 8 digital pins.

Code

const int buttons = 0;
const int LEDs[4] = {5,6,7,8};
void setup()
{
  pinMode(buttons,INPUT);
  for (int i = 5; i<9; i++)
  {
    pinMode(LEDs[i],OUTPUT);
  }
}
void loop()
{
  int value = analogRead(buttons); // Readings
  if(value>=314 && value <= 316) // Checking if first button is pressed
  {
    digitalWrite(LEDs[0],HIGH);
    for(int i = 0; i<4; i++)
    {
      if(i != 0)
      {
        digitalWrite(LEDs[i],LOW);
      }
    }  
  }
  if(value>=341 && value <= 343)// Checking if second button is pressed
  {
    digitalWrite(LEDs[1],HIGH);
    for(int i = 0; i<4; i++)
    {
      if( i!=1)
      {
        digitalWrite(LEDs[i],LOW);
      }
    }
  }
  if(value>=378 && value <= 380)// Checking if third button is pressed
  {
    digitalWrite(LEDs[2],HIGH);
    for(int i = 0; i<4; i++)
    {
      if(i!=2)
      {
        digitalWrite(LEDs[i],LOW);
      }
    }
  }
  if(value>=409 && value <= 411)// Checking if fourth button is pressed
  {
    digitalWrite(LEDs[3],HIGH);
    for(int i = 0; i<4; i++)
    {
      if(i!=3)
      {
        digitalWrite(LEDs[i],LOW);
      }
    }
  }
}

If you did everything as I said you should see your LEDs turning off and on depending which button is pressed. It is also possible to detect if several buttons have been pressed at once, it works the same way as with 1 button.

working

This website uses cookies

As a user in the EEA, your approval is needed on a few things. To provide a better website experience, hubpages.com uses cookies (and other similar technologies) and may collect, process, and share personal data. Please choose which areas of our service you consent to our doing so.

For more information on managing or withdrawing consents and how we handle data, visit our Privacy Policy at: https://corp.maven.io/privacy-policy

Show Details
Necessary
HubPages Device IDThis is used to identify particular browsers or devices when the access the service, and is used for security reasons.
LoginThis is necessary to sign in to the HubPages Service.
Google RecaptchaThis is used to prevent bots and spam. (Privacy Policy)
AkismetThis is used to detect comment spam. (Privacy Policy)
HubPages Google AnalyticsThis is used to provide data on traffic to our website, all personally identifyable data is anonymized. (Privacy Policy)
HubPages Traffic PixelThis is used to collect data on traffic to articles and other pages on our site. Unless you are signed in to a HubPages account, all personally identifiable information is anonymized.
Amazon Web ServicesThis is a cloud services platform that we used to host our service. (Privacy Policy)
CloudflareThis is a cloud CDN service that we use to efficiently deliver files required for our service to operate such as javascript, cascading style sheets, images, and videos. (Privacy Policy)
Google Hosted LibrariesJavascript software libraries such as jQuery are loaded at endpoints on the googleapis.com or gstatic.com domains, for performance and efficiency reasons. (Privacy Policy)
Features
Google Custom SearchThis is feature allows you to search the site. (Privacy Policy)
Google MapsSome articles have Google Maps embedded in them. (Privacy Policy)
Google ChartsThis is used to display charts and graphs on articles and the author center. (Privacy Policy)
Google AdSense Host APIThis service allows you to sign up for or associate a Google AdSense account with HubPages, so that you can earn money from ads on your articles. No data is shared unless you engage with this feature. (Privacy Policy)
Google YouTubeSome articles have YouTube videos embedded in them. (Privacy Policy)
VimeoSome articles have Vimeo videos embedded in them. (Privacy Policy)
PaypalThis is used for a registered author who enrolls in the HubPages Earnings program and requests to be paid via PayPal. No data is shared with Paypal unless you engage with this feature. (Privacy Policy)
Facebook LoginYou can use this to streamline signing up for, or signing in to your Hubpages account. No data is shared with Facebook unless you engage with this feature. (Privacy Policy)
MavenThis supports the Maven widget and search functionality. (Privacy Policy)
Marketing
Google AdSenseThis is an ad network. (Privacy Policy)
Google DoubleClickGoogle provides ad serving technology and runs an ad network. (Privacy Policy)
Index ExchangeThis is an ad network. (Privacy Policy)
SovrnThis is an ad network. (Privacy Policy)
Facebook AdsThis is an ad network. (Privacy Policy)
Amazon Unified Ad MarketplaceThis is an ad network. (Privacy Policy)
AppNexusThis is an ad network. (Privacy Policy)
OpenxThis is an ad network. (Privacy Policy)
Rubicon ProjectThis is an ad network. (Privacy Policy)
TripleLiftThis is an ad network. (Privacy Policy)
Say MediaWe partner with Say Media to deliver ad campaigns on our sites. (Privacy Policy)
Remarketing PixelsWe may use remarketing pixels from advertising networks such as Google AdWords, Bing Ads, and Facebook in order to advertise the HubPages Service to people that have visited our sites.
Conversion Tracking PixelsWe may use conversion tracking pixels from advertising networks such as Google AdWords, Bing Ads, and Facebook in order to identify when an advertisement has successfully resulted in the desired action, such as signing up for the HubPages Service or publishing an article on the HubPages Service.
Statistics
Author Google AnalyticsThis is used to provide traffic data and reports to the authors of articles on the HubPages Service. (Privacy Policy)
ComscoreComScore is a media measurement and analytics company providing marketing data and analytics to enterprises, media and advertising agencies, and publishers. Non-consent will result in ComScore only processing obfuscated personal data. (Privacy Policy)
Amazon Tracking PixelSome articles display amazon products as part of the Amazon Affiliate program, this pixel provides traffic statistics for those products (Privacy Policy)
ClickscoThis is a data management platform studying reader behavior (Privacy Policy)