As vezes quando precisamos controlar um grupo de botões isso pode tomar a maior parte das portas digitais e limitar a capacidade do dispositivo. Nesses casos em que não temos portas digitais suficientes, uma boa solução é utilizar uma porta analógica para gerenciar uma série de botões e resistores.
English version of this article: Controlling multiple buttons with only one Arduino's analog port.
A classe ButtonEvent do ebl-arduino agora é capaz de controlar séries de botões analógicos. Considere o seguinte projeto de protboard:
Note que essa é uma série de resistores de 10k. Clique aqui para baixar o arquivo do Fritzing de fonte dessa imagem.
No intuito de controlar esses botões você deve proceder como no código fonte abaixo:
#include <ButtonEvent.h> short Button1 = 230; short Button2 = 365; short Button3 = 460; void setup() { //initial buffer for 3 buttons ButtonEvent.initialCapacity = sizeof(ButtonInformation)*3; ButtonEvent.addButton(0, //analog button pin Button1, //analog value 20, //deviation onDown, //onDown event function onUp, //onUp event function onHold, //onHold event function 1000, //hold time in milliseconds onDouble, //onDouble event function 200); //double time interval ButtonEvent.addButton(0, //analog button pin Button2, //analog value 20, //deviation onDown, //onDown event function onUp, //onUp event function onHold, //onHold event function 1000, //hold time in milliseconds onDouble, //onDouble event function 200); //double time interval ButtonEvent.addButton(0, //analog button pin Button3, //analog value 20, //deviation onDown, //onDown event function onUp, //onUp event function onHold, //onHold event function 1000, //hold time in milliseconds onDouble, //onDouble event function 200); //double time interval Serial.begin(9600); } void loop() { ButtonEvent.loop(); } void onDown(ButtonInformation* Sender) { Serial.print("Button "); if (Sender->analogValue == Button1) Serial.print(1); else if (Sender->analogValue == Button2) Serial.print(2); else if (Sender->analogValue == Button3) Serial.print(3); Serial.println(" down!"); } void onUp(ButtonInformation* Sender) { Serial.print("Button "); if (Sender->analogValue == Button1) Serial.print(1); else if (Sender->analogValue == Button2) Serial.print(2); else if (Sender->analogValue == Button3) Serial.print(3); Serial.println(" up!"); } void onHold(ButtonInformation* Sender) { Serial.print("Button "); if (Sender->analogValue == Button1) Serial.print(1); else if (Sender->analogValue == Button2) Serial.print(2); else if (Sender->analogValue == Button3) Serial.print(3); Serial.print(" hold for "); Serial.print(Sender->holdMillis); Serial.println("ms!"); } void onDouble(ButtonInformation* Sender) { Serial.print("Button "); if (Sender->analogValue == Button1) Serial.print(1); else if (Sender->analogValue == Button2) Serial.print(2); else if (Sender->analogValue == Button3) Serial.print(3); Serial.print(" double click in "); Serial.print(Sender->doubleMillis); Serial.println("ms!"); }
Esse projeto possui um repositório com maiores informações sobre as classes, instruções de uso e opções para download. Ele pode ser acessado pela URL http://code.google.com/p/ebl-arduino/.
Cara,
ReplyDeleteParabéns pelo post que é muito informativo. Quero agradecê-lo pela *ebl-arduino*, vou utilizá-la no meu próximo projeto. Dei uma analisada no código e está muito bem estruturado. Mais uma vez parabéns, e obrigado por dedicar seu tempo e liberar o código fonte! Abraço.
:) valeu, colega!
DeleteMuito legal tua rotina, como adicionar mais botões, ou melhor como definir os valores para os novos votãoes, por exemplo, você definiu:
ReplyDeleteshort Button1 = 230;
short Button2 = 365;
short Button3 = 460;
Como você chegou a estes valores, como definir estes valores para 10 botões por exemplo?
Legal, daria para carregar sons em cada um dos botões, botão-1 = 0,00 segundos até 3,00 minutos, botão-2 = acionado aos 0,25 segundos até 1,30 minutos e assim por diante tocando sons simultâneos com uma mixagem.
ReplyDeleteGood sharee
ReplyDelete