Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Создатель световой последовательности

Компоненты и расходные материалы

Arduino UNO
× 1
Макет (общий)
× 2
Перемычки (общие)
× 55
Регистр сдвига 74HC595
× 1
кнопка
× 4
Поворотный потенциометр (общий)
× 1
LED (общий)
× 8
Резистор 221 Ом
× 9
Резистор 10 кОм
× 4

Необходимые инструменты и машины

руки

Приложения и онлайн-сервисы

IDE Arduino

Об этом проекте

Я развлекался с огнями и массивами и думал, что воспользуюсь сдвиговым регистром и ЖК-экраном, чтобы создать программу, в которой вы можете изменять и отображать свои световые анимации, не заходя в код и создавая анимацию вручную. каждый раз.

Есть 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);} 

Схема

Тщательно следуйте линиям, из-за ограничений на длину резисторов в программе и для удобства чтения я не смог сжать его так, как это было в моей реальной сборке. После постройки я призываю вас найти способы его очистить.

Производственный процесс

  1. Детектор языка TinyML на основе Edge Impulse и Arduino
  2. Игра с гироскопом Arduino с MPU-6050
  3. Цифровые игральные кости Arduino
  4. Рулетка DIY 37 LED
  5. Мини-аркада ATtiny85:Змейка
  6. Переносимый детектор дальности
  7. Реактивный настольный светильник для звука Arduino
  8. Умный автомобиль-робот с отслеживанием лиц
  9. Гальваника медью
  10. NeoMatrix Arduino Pong