Interface multiple keys with one wire and save pins of MCU

Usually, the keyboard is connected by using matrix type of connection – rows and columns. For instance, for a 12 button keyboard wee need 3+4 digital inputs of the microcontroller. There is a way to build a keyboard and connect it to the microcontroller using only one wire. For this, we will need only signal wire, power, and ground, and of course microcontroller must have analog ADC input. One wire keypad circuit:

The circuit is nothing more than simples digital to analog converter. The microcontroller reads the voltage from the signal line and calculates which key is pressed. Let’s see how it works. If no keys have been pressed, then the line has a voltage equal to a power source. If any key is pressed, the voltage divider divides the voltage according to the resistor connected to this button. A capacitor works as a filter of mechanical noise during button contact. This way microcontroller can check the voltage of the signal line and calculate which button is pressed.

How to choose resistors? For this first, we have to select pull up resistor first. This example is 10kOm. Some ADC may require lower input resistance to maintain desired conversion speed. But if you want to make a really low power application, you can increase pull-up resistance and decrease conversion speed.

Further, we have to divide voltage into even intervals with keyboard resistors. If B size of the interval, K- number of keys, N – number of ADC bits, then: B=2N/K. If ADC resolution is 10 bit and we have 8 keys, we will have B=1024/8=128 voltage steps for one interval. As the key value is in the middle of the interval, then its value will be XK=KB+B/2.

Resistor values needed for each key: RK=(XKR1)(2N-XK). This is why the first resistor has a value of 667Ohm, the second 23080Ohm, and so on. Closes values are displayed in the schematic. In this case, for 8 keys, the minimal accuracy of resistors is 1/8=12.5%, so, in reality, 5% accuracy resistors will do the job. If there will be more keys used like 16 and more, choose more accurate resistors like 1%.

This keyboard can be used in low-power devices because while buttons aren’t pressed, there is no current required. ADC input can be configured as interrupt activated when any button is pressed. Otherwise, the microcontroller can be in stand-by mode. I find this handy solution with AVR Tiny microcontrollers like Attiny15L, where the overall number of pins is 8. And for a large number of keys, you will only need one pin.

4 Comments:

  1. hello
    How can push multi keys in the same time and detecr what keys are push and send to the ar micro?
    thanks

  2. Well if you push multiple keys than you will get summary voltage. If there will be few buttons you might will be able to decode(Just a thought). But in fact this circuit is to work with one button at one time.

  3. Hello Sir,
    I too have the same doubt as Amin. What if more than one key is pressed. I am planning to interface a keypad of 30/40 keys. is it feasible using this design. If not kindly give me an alternative.
    Regards
    Sanoop B
    SIL

  4. Hi, small modification in circuit , then if you press multiple button , which one having higher voltage that key is pressed. the modification is make the resistor connection as series with each another

Leave a Reply