Me he estado divirtiendo con luces y matrices y pensé que haría uso del registro de desplazamiento y la pantalla LCD para crear un programa en el que puedas modificar y mostrar tus animaciones de luz sin tener que entrar en el código y crear una animación a mano. cada vez.
Hay 4 botones, de izquierda a derecha están numerados del 1 al 4. Le permiten navegar por el menú y cambiar las variables. El botón 1 se usa para incrementar valores y para cambiar el estado de una luz a ALTO. El botón 2 se usa para disminuir valores y para cambiar el estado de una luz a BAJO. El botón 3 puede mover el cursor hacia atrás mientras se hace un marco, y el botón 4 se usa como botón de 'retroceso'.
El programa puede modificar la velocidad de la animación y la cantidad de veces que se repetirá. Podría lanzar otra versión que permita múltiples animaciones.
Código
Secuenciador ligero C / C ++
Conecte este código y ejecútelo, si el cableado es correcto, ¡NO debería tener problemas!
Enjoy #include #define ARR_SIZE 16 // CAMBIAR esto a cualquier número de fotogramas # define LIGHTS 8 // Controla el botón del juego inputconst int btn1 =7, btn2 =8, btn3 =9, btn4 =10; // Variable para leer el estado del pulsador bs1 =0, bs2 =0, bs3 =0, bs4 =0; // Pin conectado a ST_CP de 74HC595const int latchPin =11; // Pin conectado a SH_CP de 74HC595const int clockPin =13; // Pin conectado al DS de 74HC595const int dataPin =12; // Titulares de la información que vas a pasar por datos; // Se usa para leer 1 o 0bool ArrOne [ARR_SIZE] [LIGHTS] ={false}; // animación // Traducido para el registro como bytesbyte lightArrOne [ARR_SIZE] ={0xFF}; // Variables para afectar la animaciónint animSpeed =50; // ms entre cada frameint loopCount =5; // cantidad de veces que se ejecutará // Controla los valores de LCD const int rs =15, en =14, d4 =3, d5 =4, d6 =5, d7 =6; LiquidCrystal lcd (rs, en, d4, d5, d6 , d7); void setup () {// Establece cada botón en pinMode (btn1, INPUT_PULLUP); pinMode (btn2, INPUT_PULLUP); pinMode (btn3, INPUT_PULLUP); pinMode (btn4, INPUT_PULLUP); // Configure el número de columnas y filas de la pantalla LCD:lcd.begin (16, 2); // Establecer registro latch pinMode (latchPin, OUTPUT); PrintMenu ();} bucle vacío () {bs1 =digitalRead (btn1); bs2 =digitalRead (btn2); bs3 =digitalRead (btn3); bs4 =digitalRead (btn4); // Reproduce el anim if (bs1 ==HIGH) {bs1 =LOW; // solo se usa para evitar un retraso de entrada malo / doble (150); Tocar(); // Modifica el anim} else if (bs2 ==HIGH) {bs2 =LOW; retraso (150); Crear (ArrOne); // Cambia la velocidad del anim} else if (bs3 ==HIGH) {bs3 =LOW; retraso (150); Velocidad fijada(); // Cambia el número de veces que se reproducirá el anim} else if (bs4 ==HIGH) {bs4 =LOW; retraso (150); SetLoop (); } PrintMenu (); delay (150);} // Función para imprimir información para el menú principal. void PrintMenu () {ClearScreen (); lcd.print ("1 reproducción de 3 velocidades"); lcd.setCursor (0, 1); lcd.print ("2-Create 4-Loops");} // Función para imprimir información para crear un framevoid PrintCreate (bool Arr [] [LIGHTS], int frame, int _bit) {ClearScreen (); lcd.print ("Marco:"); lcd.print (marco + 1); if (marco <9) lcd.print (""); para (int j =0; j <_bit; j ++) lcd.print (""); lcd.print ("v"); lcd.setCursor (0, 1); lcd.print (""); for (int j =0; j <8; j ++) lcd.print (Arr [frame] [j]);} // Función para imprimir información para configurar el speedvoid PrintSetSpeed () {ClearScreen (); lcd.print ("Establecer velocidad (ms)"); lcd.setCursor (0, 1); lcd.print (animSpeed);} // Función para imprimir información para cambiar el número de bucles de animaciónvoid PrintSetLoop () {ClearScreen (); lcd.print ("Establecer recuento de bucles"); lcd.setCursor (0, 1); lcd.print (loopCount);} // Función para reproducir la animación con los parámetros dadosvoid Play () {// La animación for (int count =0; count 0) {b =LIGHTS-1; marco--; } bs1 =digitalRead (btn1); bs2 =digitalRead (btn2); bs3 =digitalRead (btn3); bs4 =digitalRead (btn4); if (bs1 ==ALTO) {retraso (150); Arr [fotograma] [b] =verdadero; b ++; } más si (bs2 ==ALTO) {retraso (150); Arr [fotograma] [b] =falso; b ++; } más si (bs3 ==ALTO) {retraso (150); B--; } más si (bs4 ==ALTO) {retraso (150); dejando =verdadero; } retraso (10); } PrintCreate (Arr, frame, b); IntToHexToByte (Arr); retraso (500); }} // Función para convertir la matriz en un byte para que el registro readvoid IntToHexToByte (bool Arr [] [LIGHTS]) {for (int fila =0; fila 1) animSpeed--; } // Incrementa la velocidad if (bs4 ==HIGH) {delay (150); dejando =verdadero; } retraso (30); }} // Función para cambiar el número de veces que el anim loopsvoid SetLoop () {bool dejando =falso; while (! dejando) {PrintSetLoop (); bs1 =digitalRead (btn1); bs2 =digitalRead (btn2); bs3 =digitalRead (btn3); bs4 =digitalRead (btn4); if (bs1 ==ALTO) {retraso (10); loopCount ++; } if (bs2 ==ALTO) {retraso (10); if (animSpeed> 1) loopCount--; } if (bs4 ==ALTO) {retraso (150); dejando =verdadero; } retraso (30); }} // Función para cambiar realmente los bits en el registro. baja // configuración de la función interna int i =0; int pinState; pinMode (myClockPin, SALIDA); pinMode (myDataPin, SALIDA); // borra todo por si acaso // prepara el registro de desplazamiento para el desplazamiento de bits digitalWrite (myDataPin, 0); escritura digital (myClockPin, 0); // Cada bit en el byte myDataOut for (i =7; i> =0; i--) {digitalWrite (myClockPin, 0); if (myDataOut &(1 < Esquemas
Siga las líneas con cuidado, debido a las limitaciones en la longitud de las resistencias en el programa, y por motivos de legibilidad, no pude compactarlo de la misma manera que lo hice en mi construcción real. Después de construir, te desafío a que encuentres formas de limpiarlo.