fbpixel
Etiquetas: , , ,

Neste projeto, vamos utilizar botões iluminados e gerir botões e LEDs utilizando o registo de deslocamento. Para o efeito, vamos utilizar um módulo que desenvolvemos, o módulo AC SR Breakout Board. Este módulo é uma placa de extensão compatível com vários microcontroladores, constituída por dois shift registers e pinos para ligação de componentes.

Hardware

  • Microcontrolador Arduino
  • Botão de pressão iluminado x5 (ou botões + LEDs)
  • Módulo de registo de deslocação AC SR Breakout Board

Princípio

O módulo AC SR Breakout Board consiste em dois registos de deslocamento que utilizaremos para controlar um grupo de LEDs e um grupo de botões. As saídas do primeiro registo de deslocamento serão ligadas aos botões, enquanto as do segundo serão ligadas aos LEDs. Vários módulos podem ser ligados em série para aumentar o número de entradas e saídas.

ac-sr-breakout-board-v2 Gerir botões e LEDs com um registo de deslocamento

Esquema elétrico

N.B.: Para facilitar a leitura, apenas um LED e um botão são apresentados no esquema elétrico.

acsrmodule-btn-led_bb Gerir botões e LEDs com um registo de deslocamento

Código

Vimos em tutoriais anteriores como utilizar registos de deslocamento:

  • o código básico para ligar e desligar LEDs
  • O código básico para ler vários botões utilizando registos de deslocamento

Combinaremos estes dois códigos para acender o LED correspondente ao botão premido. Isto é particularmente útil quando se trabalha com botões iluminados. Neste projeto, vamos utilizar os botões luminosos como interruptores para ligar e desligar os seus próprios LEDs.

/ Constants
#define number_of_74hc595s 2
#define numOfRegisterPins number_of_74hc595s * 8
#define SER_Pin 2
#define RCLK_Pin 3
#define SRCLK_Pin 4

//Parameters
const int grpBtnPin = A0;

//Variables
boolean registers[numOfRegisterPins];
boolean grpBtnState[numOfRegisterPins];
boolean grpLedState[numOfRegisterPins];

boolean oldGrpBtnState[numOfRegisterPins];
int grpBtnVal[numOfRegisterPins];

void setup() {
  //Init Serial USB
  Serial.begin(9600);
  Serial.println(F("Initialize System"));
  //Init register
  pinMode(SER_Pin, OUTPUT);
  pinMode(RCLK_Pin, OUTPUT);
  pinMode(SRCLK_Pin, OUTPUT);
  pinMode(grpBtnPin, INPUT_PULLUP);
}

void loop() {
  readGrpBtn();
}

void clearRegisters() { /* function clearRegisters */
  //// Clear registers variables
  for (int i = numOfRegisterPins - 1; i >=  0; i--) {
    registers[i] = LOW;
  }
}

void writeRegisters() { /* function writeRegisters */
  //// Write register after being set
  digitalWrite(RCLK_Pin, LOW);
  for (int i = numOfRegisterPins - 1; i >=  0; i--) {
    digitalWrite(SRCLK_Pin, LOW); int val = registers[i];
    digitalWrite(SER_Pin, val);
    digitalWrite(SRCLK_Pin, HIGH);
  }
  digitalWrite(RCLK_Pin, HIGH);
}

void setRegisterPin(int index, int value) { /* function setRegisterPin */
  ////Set register variable to HIGH or LOW
  registers[index] = value;
}

void readGrpBtn() { /* function readGrpBtn */
  //// Read each btn
  for (int i = numOfRegisterPins - 1; i >=  0; i--) {
    if (i < 16 && i >= 8) {
      grpBtnState[i] = false;
      setRegisterPin(i, HIGH);
      writeRegisters();
      delay(20);
      grpBtnVal[i] = analogRead(grpBtnPin);
      setRegisterPin(i, LOW);
      writeRegisters();
      Serial.println(grpBtnVal[i]);
      if (grpBtnVal[i] > 500) {
        grpBtnState[i] = true;
        if (oldGrpBtnState[i] != grpBtnState[i]) {
          grpLedState[i - 8] = !grpLedState[i - 8];
          Serial.print(F("Btn "));
          Serial.print(i);
          Serial.print(F(" detected -> State =  "));
          Serial.println(grpBtnVal[i]);
        }
      }

    } else { // i<8 && i>=0
      Serial.print("Set LED"); Serial.print(i); Serial.print(" to "); Serial.println(grpLedState[i]);
      setRegisterPin(i, grpLedState[i]);
      writeRegisters();
    }
  }
}

Resultados

Depois de premir alguns botões, pode ver no monitor de série que os estados dos LEDs correspondentes mudaram.

acsrbreakoutboard-leds-buttons-results Gerir botões e LEDs com um registo de deslocamento

Não hesite em deixar-nos um comentário para nos dar a sua opinião, feedback e sugestões de melhoria para este tutorial.

Aplicação

  • Construir uma consola MIDI
  • Criar uma consola HID interactiva

Fontes