En este proyecto, vamos a utilizar botones luminosos y gestionar botones y LEDs utilizando el registro de desplazamiento. Para ello, vamos a utilizar un módulo que hemos desarrollado, el módulo AC SR Breakout Board. Este módulo es una placa de extensión compatible con varios microcontroladores, que consta de dos registros de desplazamiento y pines para conectar componentes.
Hardware
- Microcontrolador Arduino
- Pulsador luminoso x5 (o pulsadores + LED)
- AC SR Breakout Board módulo de registro de desplazamiento
Principio
El módulo AC SR Breakout Board consta de dos registros de desplazamiento que utilizaremos para controlar un grupo de LEDs y un grupo de botones. Las salidas del primer registro de desplazamiento se conectarán a los botones, mientras que las del segundo se conectarán a los LEDs. Se pueden conectar varios módulos en serie para aumentar el número de entradas y salidas.
Esquema eléctrico
N.B.: Para facilitar la lectura, sólo se muestran un LED y un botón en el diagrama de cableado.
Código
En tutoriales anteriores hemos visto cómo utilizar registros de desplazamiento:
- el código básico para encender y apagar los LEDs
- El código básico para leer varios botones utilizando registros de desplazamiento
Combinaremos estos dos códigos para encender el LED correspondiente al botón pulsado. Esto es particularmente útil cuando se trabaja con botones iluminados. En este proyecto, vamos a utilizar los botones iluminados como interruptores para encender y apagar sus propios 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
Después de pulsar algunos botones, puede ver en el monitor serie que los estados de los LED correspondientes han cambiado.
No dudes en dejarnos un comentario para darnos tu opinión, feedback y sugerencias de mejora para este tutorial.
Aplicación
- Construir una consola MIDI
- Crear una consola HID interactiva