Varios botones con una sola entrada analógica

De forma muy sencilla podemos unir varios pulsadores y unas resistencias para que dependiendo del botón que pulsemos Arduino lea un valor distinto desde uno de sus pines analógicos, y así podamos diferenciar la pulsación de cada botón.

En concreto este circuito de ejemplo usa cuatro pulsadores y 5 resistencias de 1K (son de las que más tenia). Tiene como limitación que solo puede leer un botón a la vez, si pulsamos dos botones a la vez leerá el que oponga menos resistencia de todos ellos. Hay otros circuitos que si permiten leer varios botones al mismo tiempo. También los hay que funcionan con un pin digital mediante la carga de un condensador, dependiendo del tiempo que tarde en descargarse se calcula que botón fue pulsado…

Pero ahora vamos al circuito que nos ocupa (el que esta como imagen de portada). El código de ejemplo para probar el circuito es el siguiente:

Cuando pulsemos uno de los botones obtendremos un valor que no siempre sera fijo si no que variara levemente, para solventar este problema simplemente ampliaremos un poco el margen, de forma que si obtenemos una lectura entre 500 y 520, cuando lo normal es 510, sabremos que hemos pulsado el botón 1, así con todos los botones.

31 comentarios en “Varios botones con una sola entrada analógica”

  1. Hola buenos dias. tengo algunas dudas… quizas este muy descontextualizado…pero…para determinar los valores que corresponde a cada uno de los botones, lo hiciste aplicando divisor de tension?… y mas concretamente te digo mi necesidad… quisiera leer 6 botones por un solo pin analogico… osea simplemente extender a 2 botones mas lo que tu has hecho… espero no sea tarde para andar transmitiendo dudas… desde ya muchas… ah, he utilizado, alterado y adaptado a mis pruebas este ejemplo… la modificacion que hice fue convertir en una funcion que directamente me devuelve el boton pulsado, por lo que debo de reconocer y volver a agradecerte todo lo expuesto hasta aqui. saludos y espero que tengas un buen dia.

    1. Hola,

      En realidad simplemente se trata de leer la tensión que llega, sabes que la tensión inicial son 5V, entonces dependiendo de cuantas resistencias actúen el voltaje que llega es mayor o menor. Si pulsas el primer botón solo hay una resistencia entre VCC y el pin analógico, sin embargo si pulsas el ultimo hay 4 resistencias y al estar conectadas en serie disminuye el voltaje…

      Solo tienes que añadir dos botones y dos resistencias mas.

      Saludos.

  2. Hola, existe alguna manera de que se puedan identificar mas de un boton si se puelsan a la vez? Podria ser poniendo condiciones sumando las resistencias? Por ejemplo… Si el Boton 1 tiene una resistencia de 500 y el Boton 2 una de 10000, programamos que el valor resultado de sumar las dos resistencias corresponda a Boton 1 y Boton 2 activados a la vez. No se si se me ha entendido del todo…. Gracias igualmente 🙂

  3. casi parecido en mi protoboard conecte 3 push botton pero mi programacionq desarrolle en arduino creo es incorrecta porque no me sale nada en la pantalla de la pc

  4. la practika q me dejaron a investigar era como conectar mas de un push botton a una entrada digital. intente hacer mi programacion pero no me corre. que debo hacer?

  5. HOLA, tengo que hacer un proyecto ,y he elegido hacer una incubadora para pollitos, la cosa es que lo voy a controlar todo con un atmega328 , tengo hecho todo el circuito impreso, tengo que hacer un menu con 3 pulsadores y hacer la programacion para controlar los sensores volteo de huevos activar ventiladores o resistencia, pero ando muy escaso de programación en arduino , si alguien me puede ayudar sobre todo en como hacer el menu con tres pulsadores , la idea es hacer un menú simple, que ponga menú y elegir incubacion para pollos de gallina ó pollos de perdíz y pulsando en uno de ellos comience la programación, como puedo empezar?

    1. Si te fijas en el código lo que se hace es leer la resistencia del pin analógico, mientras más resistencias en serie mayor resistencia en total… también mientras mayor sea el valor de elles mayor será el total. Si entre botones o resistencia no limitas más de los 5V no tendrás problemas.

  6. Entiendo parcialmente, soy limitado para la electronica. Arduino en su entrada analogica tiene una resolucion de 1024 entonces lo que hacen las resistencias es segun el boton que presiona uno quedar entre determinados valores. Supongamos tengo 2 botones pongo 2 resistencia de 1k, un boton me daria abajo de 512 y otro arriba de 512. En que cambia si uso una resistencia de 330ohm, se comporta igual? me divide en 512 tambien? o cambian los valores?

    1. Cambiarán los valores al ser resistencias distintas, con resistencias de 1K el primer botón al que sólo actua una resistencia puede darte un vale de 200, y el segundo botón que actuan dos resistencias de 1K puede darte el valor de 400… y el tercero de 600, llegará un momento que sobrepasaras el valor máximo y el arduino no lo podrá leer.
      Con tus resistencia saldrá valores menores: 30, 60, 90…

      Todos la valores que te he escrito son de ejemplo, no son reales.

      Lo mejor es que conectes una sola resistencia y imprimas por pantalla el resultado, después añades otra resistencia y obtienes el segundo valor, y añades la tercera residencia y así tantas como necesites.

      Luego cambias el código para que funcione con esos valores, como por interferencias puede variar se debe comparar el valor con uno un poco por debajo y con otro un poco por encima para que no falle nunca.

  7. Hola buenas noches
    he analizado el código que creaste y esta perfecto. En el me estoy basando para realizar un proyecto que medirá el desplazamiento de una celda de carga. Quisiera hacerte una pregunta. como podría hacer para desplazar el cursor que selecciona la opción hacia la derecha y izquierda, es decir horizontalmente y no de arriba hacia abajo como lo tienes. Agradezco si puedes ayudarme.

  8. hola buenas tardes disculpe en mi pantalla lcd quiero que se manese solo con dos botones eso como podria hacerlo?
    y tambien quisiera saber si un arduino puede manejar 3 tipos diferentes de sensores y leer en lcd.

    1. Hola,

      Pues necesitas programar un código que te permita interactuar con la pantalla y sus diferentes opciones/menús con dos botones. Por ejemplo que el botón 1 avance/cambie la opción que aparece en la pantalla y el botón 2 permita entrar a esa opción y aumentar su valor con cada pulsación, para regresar se usa el botón 1 de nuevo.

      Con un Arduino puedes usar tantos sensores como quieras siempre y cuando dispongas de pines libres y de que los sensores no interfieran entre si.

      Por ejemplo los sensores I2C puedes tener tantos como quieras conectados al Arduino compartiendo todos 2 pines… pero cada sensor tiene una dirección de memoria que debe ser distinta al resto de sensores ya que si no «chocan» entre ellos y no se pueden manejar, algunos sensores permiten cambiar esa dirección puenteando unos pads en el modulo del sensor.

      Si el sensor funciona por UART Arduino suele tener un único conector de ese tipo, algunos Arduinos tienen 4, también puedes emular ese conector con otros pines mediante una librería.

      Otros sensores pueden usar cualquier otro pin por lo que solo necesitas tener pines libres, no requieren unos específicos.

      Saludos.

    1. Hola Diegon,

      Si necesitas más pulsadores solo tienes que aumentar el circuito con dos pulsadores mas montandolos igual que el resto, para calcular la resistencias imprimes por el puerto serial el valor que te esta dando cada pulsador y luego ya puedes usarlo en las condiciones del código para realizar una u otra acción.

      Saludos.

    1. Hola Williams,

      El problema es que el botón esta funcionando como pulsador, sin embargo entiendo que tus conectores magnéticos funcionarían como interruptor, es decir están constantemente en un estado de cerrado o abierto, no es como los pulsadores que solo es un pulso durante unos milisegundos. Entonces este circuito no te permitirá detectar varios de esos interruptores al mismo tiempo.

      Si no tienes suficientes pines en tu microcontrolador entonces es mejor que busques algún chip que permita ampliar los pines de tu microcontrolador.

      Saludos.

  9. antes que cualquier otra cosa gracias Gil eres un crack, mi duda es¿ si tu circuito y programación presentan algun problema con el rebote mecanico de los botones o ya se considero eso?

    1. Gracias Ricardo,

      Pues viendo el código en principio no tiene un control sobre los rebotes de las pulsaciones, lo único que tiene es un delay tras leer la pulsación para que no lea mas de una pulsación por cada medio segundo… pero eso es muy básico (¡la entrada es de 2012!), se puede mejorar mucho.

      Este otro articulo el código bloquea el programa hasta que sueltas el botón:
      https://giltesa.com/2015/01/24/shield-lcd-para-arduino
      https://giltesa.com/2016/10/24/menu-submenus-shield-lcd-arduino

      Aunque aun se podría mejorar añadiendo código para que solo acepte la pulsación si ha pasado X tiempo desde la anterior pulsación, sé que tengo eso en el blog pero ahora no encuentro dónde, en principio simplemente es capturar el tiempo del sistema y comprarlo con el valor previo cuando se hizo la anterior pulsación y su ha pasado mas de ese tiempo aceptarla.

      Saludos.

  10. hola
    quisiera saber si hay opcion de integrar tambien led,es decir que cada vez que pulse un pulsador se encienda un led

  11. Buenos dias
    tengo 6 botones para la entrad analogica A0 y quiero que cada vez que pulse un boton me suene una cancion eso es posible?
    no consigo averiguar cual podria ser el codigo

    1. Hola Ivan,

      Es posible, primero tienes que hacer lo de los botones y cuando lo consigas ya te pones con lo de la canción que eso es otro cantar y no tengo ni idea.

      En cuanto a los de los botones es replicar lo de esta entrada, lo único que tendrás que usar otros valores de resistencias ya que ahora tienes que repartir una tensión de 5V para 6, o lo que es lo mismo, un valor analógico de 1024 para 6, y no para 4 como hacia en este articulo.

      Con resistencias de 1K el valor mas grande leído era de unos 500, y el menor de unos 200, cambia las resistencias por unas menores de 1K y el valor mayor sera mas grande y hasta el valor menor tendrás mas margen para mas botones.

      El código es lo mismo pero añadiendo mas else if y ajustando los valores de cada if e else if para que coincidan con las nuevas resistencias.

      Saludos

  12. Seria un detalle poner aqui la funcion, no es mucho trabajo, pero facilitas a los demas la tarea, es un poco»a mi me ayudan, yo ayudo».Gracias por tu comentario.

Escriba aquí su comentario