Wednesday, July 27, 2011

Controlando múltiplos botões com somente uma porta analógica do Arduino

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.


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/.

5 comments:

  1. Cara,

    Parabé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.

    ReplyDelete
  2. Muito legal tua rotina, como adicionar mais botões, ou melhor como definir os valores para os novos votãoes, por exemplo, você definiu:
    short Button1 = 230;
    short Button2 = 365;
    short Button3 = 460;
    Como você chegou a estes valores, como definir estes valores para 10 botões por exemplo?

    ReplyDelete
  3. 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.

    ReplyDelete