Создатель световой последовательности
Компоненты и расходные материалы
| | × | 1 | |
| | × | 2 | |
| | × | 55 | |
| | × | 1 | |
| | × | 4 | |
| Поворотный потенциометр (общий) | | × | 1 | |
| | × | 8 | |
| | × | 9 | |
| | × | 4 | |
Приложения и онлайн-сервисы
Об этом проекте
Я развлекался с огнями и массивами и думал, что воспользуюсь сдвиговым регистром и ЖК-экраном, чтобы создать программу, в которой вы можете изменять и отображать свои световые анимации, не заходя в код и создавая анимацию вручную. каждый раз.
Есть 4 кнопки, слева направо они пронумерованы от 1 до 4. Они позволяют перемещаться по меню и изменять переменные. Кнопка 1 используется для увеличения значений и для переключения состояния света на ВЫСОКИЙ. Кнопка 2 используется для уменьшения значений и для переключения состояния света на НИЗКОЕ. Кнопка 3 может перемещать курсор назад при создании кадра, а кнопка 4 используется как кнопка «назад».
Программа может изменять скорость анимации и количество циклов. Я мог бы выпустить другую версию, позволяющую использовать несколько анимаций.
Вы можете изменить фреймы, изменив ARR_SIZE вверху кода
Наслаждайтесь
Код
Light Sequencer C / C ++
Вставьте этот код и запустите его, если проводка правильная, то проблем быть не должно!
Наслаждайтесь #include #define ARR_SIZE 16 // ИЗМЕНИТЕ это на любое количество кадров # define LIGHTS 8 // Управляет вводом игровых кнопокconst int btn1 =7, btn2 =8, btn3 =9, btn4 =10; // Переменная для чтения статуса кнопки int bs1 =0, bs2 =0, bs3 =0, bs4 =0; // Вывод подключен к ST_CP 74HC595const int latchPin =11; // Вывод подключен к SH_CP 74HC595const int clockPin =13; // Пин, подключенный к DS 74HC595const int dataPin =12; // Держатели информации, которую вы собираетесь передавать в байтах; // Используется для чтения 1 или 0bool ArrOne [ARR_SIZE] [LIGHTS] ={false}; // анимация // переводится для регистра как bytesbyte lightArrOne [ARR_SIZE] ={0xFF}; // Переменные, влияющие на анимациюint animSpeed =50; // мс между каждым кадром int loopCount =5; // количество запусков // Контролирует значения ЖК-дисплеяconst int rs =15, en =14, d4 =3, d5 =4, d6 =5, d7 =6; LiquidCrystal lcd (rs, en, d4, d5, d6 , d7); void setup () {// Устанавливаем каждую кнопку вверх pinMode (btn1, INPUT_PULLUP); pinMode (btn2, INPUT_PULLUP); pinMode (btn3, INPUT_PULLUP); pinMode (btn4, INPUT_PULLUP); // Устанавливаем количество столбцов и строк ЖК-дисплея:lcd.begin (16, 2); // Установить регистр защелки pinMode (latchPin, OUTPUT); PrintMenu ();} цикл void () {bs1 =digitalRead (btn1); bs2 =digitalRead (btn2); bs3 =digitalRead (btn3); bs4 =digitalRead (btn4); // Воспроизвести анимацию if (bs1 ==HIGH) {bs1 =LOW; // просто используется для предотвращения плохой / двойной задержки ввода (150); Играть в(); // Изменяем анимацию} else if (bs2 ==HIGH) {bs2 =LOW; задержка (150); Создать (ArrOne); // Изменение скорости анимации} else if (bs3 ==HIGH) {bs3 =LOW; задержка (150); SetSpeed (); // Изменение количества воспроизведений анимации} else if (bs4 ==HIGH) {bs4 =LOW; задержка (150); SetLoop (); } PrintMenu (); delay (150);} // Функция вывода информации для главного менюvoid PrintMenu () {ClearScreen (); lcd.print («1 игра, 3 скорости»); lcd.setCursor (0, 1); lcd.print ("2-Create 4-Loops");} // Функция для вывода информации для создания рамки без рамки PrintCreate (bool Arr [] [LIGHTS], int frame, int _bit) {ClearScreen (); lcd.print ("Рамка:"); lcd.print (рамка + 1); если (кадр <9) lcd.print (""); для (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]);} // Функция для печати информации для установки спидвояса PrintSetSpeed () {ClearScreen (); lcd.print ("Установить скорость (мс)"); lcd.setCursor (0, 1); lcd.print (animSpeed);} // Функция для вывода информации об изменении количества циклов анимацииvoid PrintSetLoop () {ClearScreen (); lcd.print («Установить количество циклов»); lcd.setCursor (0, 1); lcd.print (loopCount);} // Функция для воспроизведения анимации с заданными параметрамиvoid Play () {// Анимация for (int count =0; count 0) {b =LIGHTS-1; Рамка--; } bs1 =digitalRead (btn1); bs2 =digitalRead (btn2); bs3 =digitalRead (btn3); bs4 =digitalRead (btn4); если (bs1 ==HIGH) {задержка (150); Arr [кадр] [b] =истина; b ++; } иначе, если (bs2 ==HIGH) {задержка (150); Arr [кадр] [b] =ложь; b ++; } иначе, если (bs3 ==HIGH) {задержка (150); б-; } иначе, если (bs4 ==HIGH) {задержка (150); leave =true; } задержка (10); } PrintCreate (Arr, frame, b); IntToHexToByte (Arr); задержка (500); }} // Функция для преобразования массива в байт для регистра, чтобы он не читал IntToHexToByte (bool Arr [] [LIGHTS]) {for (int row =0; row 1) animSpeed--; } // Увеличиваем скорость if (bs4 ==HIGH) {delay (150); leave =true; } задержка (30); }} // Функция для изменения количества циклов анимации, чтобы избежать SetLoop () {bool leave =false; пока (! выход) {PrintSetLoop (); bs1 =digitalRead (btn1); bs2 =digitalRead (btn2); bs3 =digitalRead (btn3); bs4 =digitalRead (btn4); если (bs1 ==HIGH) {задержка (10); loopCount ++; } если (bs2 ==HIGH) {задержка (10); если (animSpeed> 1) loopCount--; } если (bs4 ==HIGH) {задержка (150); leave =true; } задержка (30); }} // Функция для фактического сдвига битов в регистре. low // настройка внутренней функции int i =0; int pinState; pinMode (myClockPin, ВЫХОД); pinMode (myDataPin, ВЫХОД); // очищаем все на всякий случай, // чтобы подготовить сдвиговый регистр для сдвига битов digitalWrite (myDataPin, 0); digitalWrite (myClockPin, 0); // Каждый бит байта myDataOut for (i =7; i> =0; i--) {digitalWrite (myClockPin, 0); если (myDataOut &(1 <<я)) {pinState =1; } еще {pinState =0; } // Устанавливает вывод на ВЫСОКИЙ или НИЗКИЙ в зависимости от pinState digitalWrite (myDataPin, pinState); // регистр сдвигает биты при движении вывода синхронизации вверх digitalWrite (myClockPin, 1); // обнулить вывод данных после сдвига digitalWrite (myDataPin, 0); } // прекращаем смещение digitalWrite (myClockPin, 0);} // Функция для очистки ЖК-дисплея путем печати пробеловvoid ClearScreen () {// Итерирует по каждой строке и печатает пустой lcd.setCursor (0, 0); для (int col =0; col <16; col ++) lcd.print (""); lcd.setCursor (0, 1); для (int col =0; col <16; col ++) lcd.print (""); lcd.setCursor (0, 0);}
Схема
Тщательно следуйте линиям, из-за ограничений на длину резисторов в программе и для удобства чтения я не смог сжать его так, как это было в моей реальной сборке. После постройки я призываю вас найти способы его очистить.