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

MAX72XX Светодиодный матричный дисплей для астероидов, игра

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

Arduino Mega 2560
× 1
Maxim Integrated MAXREFDES99 # MAX7219 Display Driver Shield
× 1
Кнопочный переключатель SparkFun, 12 мм
× 2
Зуммер
× 1
Макет (общий)
× 1

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

Это простая игра, в которой используется светодиодная матрица MAX72XX в качестве дисплея, два микропереключателя в качестве кнопок и активный зуммер для звукового эффекта.

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

Код

  • код игры астероиды
код игры астероидов Arduino
 / ********************************************* ********** * Это простая игра с использованием светодиодной матрицы MAX72XX. * Вы - звездный корабль, и вам нужно избегать контакта с * падающими астероидами. * * (c) 2018, Джошуа Весснер * * * ************************************* ***************** /// LedControl от Эберхарда Фале // см .:http://wayoda.github.io/LedControl/#include "LedControl.h" / * Сейчас нам нужен LedControl для работы. ***** Эти номера контактов, вероятно, не будут работать с вашим оборудованием. ***** Контакт 12 подключен к DataIn, контакт 11 подключен к CLK, контакт 10 подключен к LOAD. У нас есть только один MAX72XX. * / LedControl lc =LedControl (12,11,10,1); / ******************************** **************************** * Глобальные переменные * / / * задержка между обновлениями дисплея * / unsigned long delaytime =1000; / * для отображения оценки * / String scoreString; int score; int сотен; String scoreStr; String scoreArr [] ={"", "", ""}; / * микропереключатели для управления * / int pinLeft =2; int pinRight =3; изменчивая беззнаковая длинная кнопка нажата; int buttonDelay =150; // обрабатываем контакт bouncevolatile bool gameOver =false; / * "ритм" игры в миллисекундах * / int tick; int tickCounter =1; / * временная метка * / unsigned long now; / * display * / int ship; / * Начальная позиция корабля * / int columns [] ={0,0,0,0,0,0,0,0}; // 8 столбцов, каждое int - это строка 1-8. Int randomInt; / ********************************* **************************** * setup * / void setup () {/ * Инициализация * / gameOver =false; сотни =0; scoreArr [0] =""; scoreArr [1] =""; scoreArr [2] =""; оценка =0; галочка =300; tickCounter =1; корабль =3; now =millis (); buttonPressed =миллис (); randomSeed (analogRead (15)); // лучшие случайные числа для (int i =0; i <8; i ++) columns [i] =0; // Отладка // Serial.begin (9600); // Serial.print (columns [0]); / * MAX72XX находится в режиме энергосбережения при запуске, мы должны сделать пробуждение * / lc.shutdown (0, false); / * Устанавливаем средние значения яркости * / lc.setIntensity (0,1); / * и очищаем отображение * / lc.clearDisplay (0); pinMode (pinLeft, INPUT_PULLUP); pinMode (pinRight, INPUT_PULLUP); / * нажатие кнопки прикрепления для прерывания * / attachInterrupt (digitalPinToInterrupt (pinLeft), left, FALLING); attachInterrupt (digitalPinToInterrupt (pinRight), right, ПАДЕНИЕ); } / *********************************************** ************** * обрабатывать нажатие левой кнопки * / void left () {if (millis () - buttonPressed> buttonDelay) // обрабатывать отскок контакта переключателя {if (ship! =0) судно--; иначе корабль =7; lc.clearDisplay (0); buttonPressed =миллис (); } // после окончания игры нажатие кнопки перезапустит игру if (gameOver ==true) {gameOver =false; настраивать(); }} / ********************************************* *************** * обрабатывать нажатие правой кнопки * / void right () {if (millis () - buttonPressed> buttonDelay) // обрабатывать отскок контакта переключателя {if (ship! =7 ) корабль ++; иначе корабль =0; lc.clearDisplay (0); buttonPressed =миллис (); } // после окончания игры нажатие кнопки перезапустит игру if (gameOver ==true) {gameOver =false; настраивать(); }} / ********************************************* *************** * loop * / void loop () {if (millis () - now> tick) {// делать каждый тик // оценка:сколько тиков вы пережили оценка ++; now =millis (); if (tickCounter ==1) {// каждый 4-й тик // ускоряем игру со временем tick =tick / 1.02; // случайный выбор столбца randomInt =random (0, 8); // если в столбце нет астероида, создайте его в строке 1. if (columns [randomInt] ==​​0) {columns [randomInt] =1; }} if (tickCounter! =4) tickCounter ++; иначе tickCounter =1; // делаем для каждого столбца for (int i =0; i <8; i ++) {if (columns [i] ==10) // удаляем астероиды, когда они не отображаются в столбцах [i] =0; if (columns [i]! =0) // заставляем астероиды падать вниз columns [i] ++; } lc.clearDisplay (0); } / * запись на дисплей * / // ship lc.setLed (0, 7, ship, true); // астероиды для (int i =0; i <8; i ++) {if (columns [i]> 0) lc.setLed (0, columns [i] -2, i, true); lc.setLed (0, столбцы [i] -3, i, true); } // обнаруживаем столкновение корабля с астероидом if (columns [ship] ==10 или columns [ship] ==9) {lc.clearDisplay (0); // анимировать взрыв for (int i =0; i <4; i ++) {lc.setLed (0,7, ship + i, true); lc.setLed (0,7, ship-i, true); lc.setLed (0,7-i, ship + i, true); lc.setLed (0,7-i, ship-i, true); lc.setLed (0,7-1,5 * i, корабль, правда); // звук взрыва беззнаковый long time =millis (); int randomSound =1000; while (millis () - время <=250) {randomSound--; тон (9, случайный (randomSound, 1000)); // меняем параметры random () на другой звук} lc.clearDisplay (0); noTone (9); } задержка (500); / * отображение счета * / scoreStr =String (score); // получить однозначные числа из результата int scoreArr [0] =scoreStr.charAt (0); scoreArr [1] =scoreStr.charAt (1); scoreArr [2] =scoreStr.charAt (2); // матрица может отображать только до 2 цифр (до 99) if (score <100) {for (int i =0; i <2; i ++) {if (scoreArr [i] =="0") draw0 ( 1 + я * 4); если (scoreArr [i] =="1") draw1 (1 + i * 4); если (scoreArr [i] =="2") draw2 (1 + i * 4); если (scoreArr [i] =="3") draw3 (1 + i * 4); если (scoreArr [i] =="4") draw4 (1 + i * 4); если (scoreArr [i] =="5") draw5 (1 + i * 4); если (scoreArr [i] =="6") draw6 (1 + i * 4); если (scoreArr [i] =="7") draw7 (1 + i * 4); если (scoreArr [i] =="8") draw8 (1 + i * 4); если (scoreArr [i] =="9") draw9 (1 + i * 4); }} // если оценка> 100, отображать только две последние цифры оценки else {for (int i =1; i <3; i ++) {if (scoreArr [i] =="0") draw0 (1+ ( i-1) * 4); если (scoreArr [i] =="1") draw1 (1+ (i-1) * 4); если (scoreArr [i] =="2") draw2 (1+ (i-1) * 4); если (scoreArr [i] =="3") draw3 (1+ (i-1) * 4); если (scoreArr [i] =="4") draw4 (1+ (i-1) * 4); если (scoreArr [i] =="5") draw5 (1+ (i-1) * 4); если (scoreArr [i] =="6") draw6 (1+ (i-1) * 4); если (scoreArr [i] =="7") draw7 (1+ (i-1) * 4); если (scoreArr [i] =="8") draw8 (1+ (i-1) * 4); если (scoreArr [i] =="9") draw9 (1+ (i-1) * 4); } // первая цифра оценки («сотни») отображается точками:одна точка на каждую сотню. для (int я =1; я <10; я ++) {если (scoreArr [0] ==String (я)) сотни =я; } для (int я =1; я <=сотни; я ++) {lc.setLed (0,0, я-1, истина); lc.setLed (0,1, i-1, истина); задержка (200); }} gameOver =true; while (gameOver ==true) {// ничего не делать, кроме ожидания нажатия кнопки}}} /////////////////////////// Draw цифры счета ///////////////////////////////////////// void draw1 (int position) { lc.setColumn (0,0 + позиция, B00001000); lc.setColumn (0,1 + позиция, B00011111); } void draw2 (int position) {lc.setColumn (0,0 + position, B00010111); lc.setColumn (0,1 + позиция, B00010101); lc.setColumn (0,2 + позиция, B00011101); } void draw3 (int position) {lc.setColumn (0,0 + position, B00010001); lc.setColumn (0,1 + позиция, B00010101); lc.setColumn (0,2 + позиция, B00011111); } void draw4 (int position) {lc.setColumn (0,0 + position, B00011100); lc.setColumn (0,1 + позиция, B00000100); lc.setColumn (0,2 + позиция, B00011111); } void draw5 (int position) {lc.setColumn (0,0 + position, B00011101); lc.setColumn (0,1 + позиция, B00010101); lc.setColumn (0,2 + позиция, B00010111); } void draw6 (int position) {lc.setColumn (0,0 + position, B00011111); lc.setColumn (0,1 + позиция, B00010101); lc.setColumn (0,2 + позиция, B00010111); } void draw7 (int position) {lc.setColumn (0,0 + position, B00010000); lc.setColumn (0,1 + позиция, B00010011); lc.setColumn (0,2 + позиция, B00011100); } void draw8 (int position) {lc.setColumn (0,0 + position, B00011111); lc.setColumn (0,1 + позиция, B00010101); lc.setColumn (0,2 + позиция, B00011111); } void draw9 (int position) {lc.setColumn (0,0 + position, B00011101); lc.setColumn (0,1 + позиция, B00010101); lc.setColumn (0,2 + позиция, B00011111); } void draw0 (int position) {lc.setColumn (0,0 + position, B00011111); lc.setColumn (0,1 + позиция, B00010001); lc.setColumn (0,2 + позиция, B00011111); } 

Схема


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

  1. Шахматы
  2. Пинбол
  3. Футбол
  4. Игра Arduino Pong - OLED-дисплей
  5. Рулетка DIY 37 LED
  6. Игра Arduino Pong на матрице 24x16 с MAX7219
  7. Игра Arduino Nano Tetris на самодельной матрице 16x8
  8. Игра с джойстиком
  9. Светодиодная матрица + датчик движения дверной дисплей [Arduino Holiday]
  10. 8-кратное светодиодное освещение со звуком