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.
Esquema elétrico
N.B.: Para facilitar a leitura, apenas um LED e um botão são apresentados no esquema elétrico.
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.
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