Publicidade:

sexta-feira, 3 de novembro de 2017

Arduino - Charlieplex com botões

Demonstração de como utilizar vários botões com poucos pinos através da multiplexação Charlieplex.

Vídeo:



Código-fonte:
#define NUM_PINS 4

const int pins[] = {2,3,4,5};

void init_pins(){
  for (int i = 0; i< NUM_PINS; i++) { 
    pinMode(pins[i], INPUT_PULLUP); 
    digitalWrite(pins[i], HIGH);
  }
}

byte readCharlieplexButons(int pin1, int pin2){
  init_pins();
  pinMode(pin1, OUTPUT);
  digitalWrite(pin1, LOW);
  return !digitalRead(pin2);
}

int getButton(){
  byte index_button = 0;
  for (int i=0; i<NUM_PINS; i++) { 
    for (int j=i+1; j<NUM_PINS; j++) { 
      if (i!=j) { 
        if (readCharlieplexButons(pins[j], pins[i])) {
          return index_button;
        }
        index_button++;
        if (readCharlieplexButons(pins[i], pins[j])) {
          return index_button;
        }
        index_button++;
      }
    }
  }
  return -1;  //-1 --> nenhum botão pressionado
}
  
int getButtonOnce(){
  static int lastVal = -1;
  static unsigned long m = 0;
  int val = getButton();
  if (lastVal != val && millis() > (m+100) ) { //M+100 -->DEBOUNCING 100ms
    lastVal = val;
    m = millis();
    return lastVal;
  } 
  return -1;
}


void setup() { 
  init_pins(); 
  Serial.begin(9600);
}

void loop() { 
  int button = getButtonOnce();
  if ( button >=0){
    Serial.println(button);
  }
  delay(10);   //necessário apenas no simulador.
}


3 comentários:

  1. Nesse esquema eu tenho 12 botões? Se eu apertar vai sair números dos botões?

    ResponderExcluir
    Respostas
    1. sim, conforme você pode ver no final do vídeo. Caso queira mais botões, é possível ir aumentando a quantidade de pinos. No caso se aumentar mais um pino, você poderá ter mais 8 botões.

      Excluir
  2. Esse Fabiano Arndt é fera . Valeu pela postagem

    ResponderExcluir