Publicidade:

quinta-feira, 15 de janeiro de 2015

Arduino - Vários botões no mesmo pino + OO

Algum tempo atrás fiz um vídeo mostrando como ligar vários botões no mesmo pino, utilizando as portas analógicas.

Hoje estou postando um vídeo novo, onde dei uma boa melhorada no código, onde implemento uma classe que facilita o uso desse tipo de solução.






vídeo anterior:




código atualizado:



class BotaoSerialAnalogico{
  private:
    int  _pino;
    int  _quantidade;
    int* _ref_botao;              
  public:
    BotaoSerialAnalogico(int pino, int quantidade, int resistores[], int resistor_gnd){
      _ref_botao = new int[quantidade];
      _pino          = pino;
      _quantidade    = quantidade;
      
      float r_eq = 0;
      for(int i=0;i<_quantidade;i++){
        r_eq += resistores[i];
        _ref_botao[i] = 1023 - ( r_eq*1023 / (resistor_gnd + r_eq) ); 
      }
      
      int anterior;
      for(int i=0;i<_quantidade;i++){
        int temp = _ref_botao[i];
        _ref_botao[i] = (i==0 ? 1024 : ( anterior + temp ) / 2);
       
        anterior = temp;
      }
    }
  
  int get_button(){
    int v = analogRead(_pino);
    if (v == 0) return -1; //nenhum botao pressionado
    int b = 0;
    for(int i=0;i<_quantidade;i++){ if (_ref_botao[i] > v) { b=i; } else { break; } }
    return b;
  }
  
  void print(){
    Serial.print("|");
    for(int i=0;i<_quantidade;i++){
      Serial.print(_ref_botao[i]);
      Serial.print("|");
    }
    Serial.print("analog=");
    Serial.print(analogRead(_pino));
    Serial.print("|b=");
    Serial.println(get_button());
  }
};



BotaoSerialAnalogico *b;

int RESISTORES[] = {0, 1500, 1500, 2700, 4700};   //resistores dos botões

void setup() {
  Serial.begin(9600);
  
  b  = new BotaoSerialAnalogico(A0, 5, RESISTORES, 1000); //1000-> 1K -> resistor ligado entre o gnd e o pino analógico
}

void loop() {
  
  int botao = b->get_button();
  
  if (botao >= 0) {
    b->print();
    delay(200);
  }
  
  if (botao == 0){}  //programar botao 01
  if (botao == 1){}  //programar botao 02
  if (botao == 2){}  //programar botao 03
  if (botao == 3){}  //programar botao 04
  if (botao == 4){}  //programar botao 05
  
}

3 comentários:

  1. excelente seu post e muito obrigado. fiz os testes aqui e me ocorreu apenas um probleminha, as vezes o arduino lê valores de ate 40 mas geralmente menos de 5 no analog do seu codigo dai ele interpreta o b como sendo o ultimo botão. deve ser pela qualidade dos resistores sei la. Uma sugestão é que você colocasse uma porcentagem minima para o ultimo botão pra evitar este problema. Eu estou usando o codigo como acrescentando um botão a mais que na realidade não existe dessa maneira não tive problema mas seria legal se vc colocasse essa barragem no ultimo botão. Mas uma vez muito obrigado pelo post. vou colocar algumas linhas aqui do monitor serial. abraço


    |1024|891|819|758|706|analog=0|b=-1
    |1024|891|819|758|706|analog=0|b=-1
    |1024|891|819|758|706|analog=3|b=4
    |1024|891|819|758|706|analog=0|b=-1
    |1024|891|819|758|706|analog=20|b=4
    |1024|891|819|758|706|analog=0|b=4
    |1024|891|819|758|706|analog=0|b=-1
    |1024|891|819|758|706|analog=0|b=-1
    |1024|891|819|758|706|analog=0|b=-1
    |1024|891|819|758|706|analog=0|b=4
    |1024|891|819|758|706|analog=11|b=4
    |1024|891|819|758|706|analog=0|b=-1
    |1024|891|819|758|706|analog=16|b=-1
    |1024|891|819|758|706|analog=0|b=-1
    |1024|891|819|758|706|analog=0|b=-1
    |1024|891|819|758|706|analog=0|b=-1
    |1024|891|819|758|706|analog=0|b=4
    |1024|891|819|758|706|analog=0|b=-1

    ResponderExcluir
  2. Boa noite .ótimo código e apresentação parabéns , teria como acrescentar mais um código, quando aperta botão , ele apagasse todos os leds e apertar o mesmo ele acender eles ?

    ResponderExcluir
  3. Willian Darol, implementado uma porta lógica not no código, seria a solução, para sua pergunta.

    ResponderExcluir