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

Ретро-аркадные часы

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

Arduino Mega 2560
× 1

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

3D-принтер (общий)

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

IDE Arduino

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

Введение:Ретро-аркадные часы - Arduino

Создайте интерактивные прикроватные аркадные часы с сенсорным экраном и анимированными аркадными фигурками, которые вы можете записать для будильника по своему выбору.

Проект включает в себя корпус, напечатанный на 3D-принтере, и четыре отдельные программы на выбор

1. Аркадные часы - анимация DK Mario, Space Invaders и Pac-Man

2. Pacman Clock - интерактивная анимированная игра Pac-Man с функциями часов

3. DK Clock - интерактивная анимированная игра DK с функциями часов

4. Tumble Ghost - Анимированная игра-призрак Пакмана, основанная на Flappy Bird

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

Шаг 1. Соберите материалы

  • Плата Arduino - Arduino Mega 2560 (элементы 1, 2 и 3 можно приобрести в одном комплекте)
  • Сенсорный экран Arduino Shield - плата расширения Mega Touch LCD с диагональю 3,2 дюйма.
  • Сенсорный экран - 3,2-дюймовый TFT ЖК-дисплей + сенсорный экран для Arduino Mega 2560
  • Модуль часов реального времени - DS3231 RTC
  • Модуль диктофона - диктофон ISD1820
  • Нить PLA для 3D-принтера
  • Двухкомпонентная эпоксидная смола для склеивания корпуса
  • Кабель USB Зарядное устройство USB длиной 2 м (используется для питания часов).
  • Пистолет для горячего клея
  • Кабельные стяжки X 3

Дополнительные компоненты с автоматическим затемнением подсветки требуются только в том случае, если прикроватные часы:

  • Резистор 270 кОм
  • Стабилитрон 3,3 В
  • Резистор 0,5 Вт 47 Ом
  • Светозависимый резистор (LDR)

Я напечатал корпус часов на Creality Ender 3. Все файлы для 3D-печати и инструкции для корпуса можно найти здесь, на Thingiverse.

Шаг 3. Постройте схему

Общая схема состоит из часов реального времени, Arduino Mega, звукового модуля, сенсорного экрана и экрана.

1. Часы реального времени

Установите часы реального времени на задней панели Arduino Mega, как показано на рисунке. Я использовал пистолет для горячего клея и упаковочную пену, чтобы убедиться, что они не соприкасаются и есть какая-то амортизация, чтобы поглотить движение. В моем случае я припаял 2 ножки RTC непосредственно к Arduino и использовал соединительный провод для подключения 5 В и GND к Arduino.

2. Модуль звукозаписи

Они действительно классные и простые в использовании. Таким же образом, как описано выше, используйте пену и горячий клей, чтобы расположить модуль и динамик на задней панели Arduino, следя за тем, чтобы они были изолированы от соприкосновения. Звуковой модуль запускается D8 на Arduino, поэтому его и источник питания необходимо подключить в соответствии с предоставленной схемой.

3. Автоматический диммер подсветки (опционально)

Если вы собираетесь использовать часы в качестве прикроватных, то, вероятно, вы захотите автоматически приглушать подсветку ночью, чтобы она не влияла на ваш сон. (В противном случае вы можете пропустить этот шаг!) К сожалению, подсветка экрана TFT жестко подключена к напряжению + 3,3 В и не может быть отрегулирована с помощью Arduino. Это означает, что мы должны отключить его и снова подключить к выводу PWM на Arduino, чтобы управлять яркостью подсветки. Я хотел сделать это с минимальным повреждением штифтов или дорожек на компонентах, поэтому применил следующий подход. Внимательно следуйте инструкциям ниже

(a) Для этого на задней панели устройства расположен светозависимый резистор (LDR), который обнаруживает свет. Просверлите в корпусе два отверстия диаметром 3 мм и проденьте в них ножки LDR. Нанесите горячий клей на внутреннюю часть шкафа, чтобы удерживать ножки на месте. Припаяйте два провода с внутренней стороны корпуса и подключите их согласно принципиальной схеме. Добавьте резистор 270 кОм к A7 Arduino в соответствии с принципиальной схемой.

(b) Снимите TFT-дисплей и положите его на твердую поверхность. Найдите штырь 19 (LED_A) и осторожно удалите несколько миллиметров пластмассы у основания штифта. Согните штифт в сторону от разъема, как показано на рисунке выше. Убедитесь, что крышка TFT может плотно вставляться и что изогнутый штифт не закрывает вилку или розетку.

(c) Припаяйте регистр 47 Ом к загнутому контакту и подключите провод от резистора к D9 Arduino Mega. Вывод Arduino D9 может потреблять до 40 мА, поэтому резистор ограничивает это значение. Подключите стабилитрон на 3,3 В к тому же выводу (LED_A) и подключите его к земле, как показано на схеме. Это сделано для защиты подсветки от перенапряжения, так как она будет регулировать напряжение до 3,3 В.

4. Экран TFT и Arduino Shield

Осторожно вставьте разъемы 3,2-дюймового сенсорного экрана TFT в TFT Arduino Shield. Затем осторожно подключите его к верхней части Arduino, как показано на рисунке. В часах реального времени есть аккумулятор, поэтому он будет показывать правильное время даже после отключения питания. Время будильника хранится в Eeprom на Arduino, что означает, что оно будет сохранено в случае отключения электроэнергии.

Шаг 4. Загрузите код

Для проекта потребуется загрузить следующие файлы и библиотеки, прежде чем он будет скомпилирован и запущен. Код уникален и основан на возможностях библиотек, оборудования, некоторой настраиваемой графики и других проектов, из которых я позаимствовал.

Обратите внимание:при разработке кода для этого проекта использовалась среда IDE v1.06, и некоторые из необходимых библиотек устарели. Это означает, что у некоторых людей возникают проблемы с новой версией IDE 1.6 и выше при загрузке кода. Поэтому в интересах простоты я рекомендую людям использовать IDE v1.06 и включить файлы библиотеки правильных версий в zip-файлы в конце шага 4 руководства.

1. IDE Arduino

Я использовал более раннюю версию Arduino IDE, поэтому в интересах простоты я рекомендую вам загрузить Arduino IDE версии 1.06 на свой настольный компьютер перед установкой кода. Вы можете получить его версию здесь.

2. Библиотеки

Их необходимо загрузить и добавить в IDE (интегрированную среду разработки), работающую на вашем компьютере, для записи и загрузки компьютерного кода на физическую плату.

  • UTFT.h и URtouch.h находятся в zip-файле ниже.
  • Time.h находится в zip-файле ниже.
  • DS1307RTC.h находится в zip-файле ниже.
  • Wire.h и EEPROM.h уже включены в IDE V1.06.

Кредит для UTFT.h и URtouch.h принадлежит Rinky-Dink Electronics. Я включил эти zip-файлы, так как кажется, что исходный веб-сайт не работает.

4. Варианты экрана TFT

Расплывчатость экранов TFT и производителей привела к этим заметкам.

(а) Sainsmart - если вы приобрели 3,2-дюймовый TFT-экран с маркой Sainsmart на задней панели устройства TFT, вы обнаружите, что им необходимо изменить библиотеки для решения проблем с отображением. Если вы уже приобрели TFT-дисплей Sainsmart, исправление можно найти ниже

Отредактируйте файл "initlcd.h" и измените следующую строку из

LCD_Write_COM_DATA (0x01, 0x2B3F);

в

LCD_Write_COM_DATA (0x01, 0x3B3F);

Вам нужно будет перезапустить IDE, а затем перезагрузить код в Arduino.

(б.) Набор микросхем контроллера TFT. Люди, которые приобрели экран TFT с диагональю 3,2 дюйма, могут обнаружить, что у них также может быть один из двух разных наборов микросхем:SSD1289 или ILI9341. Раздражает то, что различить разницу в Интернете нелегко. Хорошая новость заключается в том, что это легко исправить. Если после загрузки кода вы видите пустой экран, это, вероятно, связано с контроллером ILI9341.

Чтобы исправить это, вам необходимо внести в код следующие изменения. Отредактируйте код и измените следующую строку кода

с

UTFT myGLCD (SSD1289, 38, 39, 40, 41); // Параметры должны быть адаптированы к вашей модели Display / Schield

в

UTFT myGLCD (ILI9341_16, 38, 39, 40, 41); // Параметры должны быть адаптированы к вашей модели Display / Schield

Теперь попробуйте перезагрузить код в Arduino.

(в.) Элементы управления перевернутым сенсорным экраном

Некоторые производители сообщили, что кнопки сенсорного экрана оси Y были перевернуты. Было обнаружено исправление, когда две строки кода нужно было изменить, чтобы перевернуть чтение с сенсорного экрана.

Найдите для:"yT =myTouch.getY ();" Измените его на:"yT =240 - myTouch.getY ();"

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

5. Графические файлы

Есть группа файлов растровых изображений, которые я включил ниже, которые должны находиться в том же подкаталоге, что и код Arduino, когда вы начинаете загружаться в Arduino. Поэтому загрузите файлы ниже и используйте IDE для загрузки.

6. Настройте часы

После успешной загрузки кода нажмите в центре экрана, и появится экран настройки. Используйте меню, чтобы установить время и будильник в 24-часовом формате. Нажмите кнопку SAVE, чтобы сохранить настройку. В часах реального времени есть аккумулятор, поэтому он будет показывать правильное время даже после отключения питания. Время срабатывания будильника хранится в EEPROM, что означает, что оно будет сохранено при отключении питания.

7. Проверка будильника

Звуковой модуль используется для подачи сигнала тревоги. ISD1820 управляется выводом Arduino D8. Звук можно легко добавить, проиграв звук в микрофон, одновременно нажав кнопку записи на ISD1820. В моем случае я записал оригинальную вступительную музыку Pac-Man из аудиофайла, проигрываемого через другое устройство. После того, как звук записан, запись можно проверить, нажав кнопку PLAY-E, которая должна воспроизводить звук через динамик. Используйте меню настройки, чтобы установить время на часах и время будильника с интервалом в несколько минут. Обязательно «УСТАНОВИТЕ» будильник и нажмите кнопки меню «СОХРАНИТЬ». Вернувшись к главному экрану, должен прозвучать сигнал, когда наступит время. Выключить будильник можно, нажав на центр сенсорной панели, что приведет к появлению экрана настройки.

8. Калибровка сенсорного экрана

Некоторые производители обнаружили, что кнопки на экране настройки не совпадают с сенсорными элементами управления TFT. В этих случаях сенсорный экран требует калибровки. Это легко сделать с помощью кода калибровки сенсорного экрана и инструкций из библиотеки URtouch. Следуйте этим инструкциям, если вы заметили эту проблему.

9. Четыре разные программы на выбор

1. Аркадные часы - анимация DK Mario, Space Invaders и Pacman2. Pacman Clock - интерактивная анимированная игра Pacman / Ms Pacman с функциями часов

3. DK Clock - интерактивная анимированная игра DK с функциями часов

4. Tumble Ghost - Анимированная игра Pacman Ghost, основанная на Flappy Bird

1.% 2BRetroArcadeClockTechKiwigadgetsV1.zip 2.% 2BRetro_Pacman_Clock_V10.zip 3.% 2BRetro_DK_Clock_V3.zip 4.% 2BTumble_Ghost_V10.zip DS1307RTC.zip Time.zip URTouch.zip UTFT.zip

Шаг 5. Собираем все вместе

1. Добавление внешнего источника питания

Последний шаг - добавить внешний источник питания. С помощью сверла проделайте отверстие в задней части шкафа. Пропустите USB-кабель через заднюю панель, а затем подключите провода USB-кабеля VCC, GND, D + и D- к основанию USB-коннектора Arduino в соответствии со схемой. Это имеет два преимущества:во-первых, USB-вход для Arduino Mega Boards имеет защиту от перегрузки по току, а во-вторых, вы можете использовать USB-кабель для загрузки изменений кода, не разбирая коробку. Приклейте изоляцию кабеля питания к задней части Arduino горячим способом, чтобы обеспечить защиту от натяжения кабеля при сборке передней и задней панелей. Добавьте кабелю зажим для кабеля, плотно обернув его кабельной стяжкой внутри корпуса на силовом кабеле на расстоянии 6–8 см от разъема Arduino. Кабельная стяжка не должна натягивать соединения, когда кабель USB натягивается встык внутри корпуса.

2. Установка электроники в корпус

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

3. Окончательная сборка

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

Надеюсь, вам понравится!

Код

  • Ретро-аркадные часы
Ретро-аркадные часы C / C ++
Arduino IDE
 / * Ретро аркадные часы - TechKiwigadgets V1 - Первый производственный выпуск * / #include  #include  #include  #include  #include  #include  // базовая библиотека DS1307, которая возвращает время в виде time_t // Переменные сигналов тревогиboolean alarmstatus =false; // флаг, где false выключено, а true - включеноboolean soundalarm =false; // Флаг, указывающий на необходимость инициирования сигнала тревоги int alarmhour =0; // час установки будильникаint alarmminute =0; // Минута установки будильникаbyte ahour; // Байтовая переменная для часа amin; // Байтовая переменная для minuteint actr =300; // Когда звучит сигнал тревоги, это счетчик, используемый для сброса звуковой карты до тех пор, пока экран не коснется int act =0; int p =0; // Положение анимации E.G. Графический флаг Pacman 0 =Закрыто, 1 =Средне открыто, 2 =Широко открыто, 3 =Среднее открытое int m =0; // Положение анимации mario 3 postions // Графические координаты X, Y // myGLCD.drawBitmap (30, 14, 40, 40, rd_ghost); // Закрытый Ghostint ghostX =15; int ghostY =14; int ghostD =0; // направление d ==0 =вправо, 1 =вниз, 2 =влево, 3 =вверх // myGLCD.drawBitmap (140, 14, 40, 40, MarioR3); // Закрытый Ghostint MarioX =141; int MarioY =14; int MarioD =0; // направление d ==0 =вправо, 1 =вниз, 2 =влево, 3 =вверх // myGLCD.drawBitmap (240, 14, 40, 40, Monkey2); // Закрытый Ghostint MonkeyX =261; int MonkeyY =14; int MonkeyD =0; // направление d ==0 =вправо, 1 =вниз, 2 =влево, 3 =вверх // myGLCD.drawBitmap (30, 180, 40, 40, pacman); // Закрытый Ghostint pacmanX =15; int pacmanY =185; int pacmanD =2; // направление d ==0 =вправо, 1 =вниз, 2 =влево, 3 =вверх // myGLCD.drawBitmap (140, 180, 40, 40, Alien); // Закрытый Ghostint AlienX =141; int AlienY =185; int AlienD =2; // направление d ==0 =вправо, 1 =вниз, 2 =влево, 3 =вверх // myGLCD.drawBitmap (240, 180, 40, 40, Cannon); // Закрытый призрак int CannonX =270; int CannonY =185; int CannonD =2; // направление d ==0 =вправо, 1 =вниз, 2 =влево, 3 =вверх // Инициализирует значения времени RTC:const int DS1307 =0x68; // Адрес DS1307 см. Технические данные // Переменные диммера дисплеяint dimscreen =255; // Эта переменная используется для управления яркостью экрана, где 255 - максимальная яркость int LDR =100; // Переменная LDR, измеренная непосредственно из Аналога 7 // ====Создание объектовUTFT myGLCD (SSD1289,38,39,40,41); // Параметры должны быть адаптированы к вашей модели Display / SchieldURTouch myTouch (6, 5, 4, 3, 2); // ====Определение Fontsextern uint8_t SmallFont []; extern uint8_t BigFont []; extern uint8_t SevenSegNumFont []; extern uint8_t SevenSeg_XXXL_Num []; // Определить bitmapsextern unsigned int Alien1 [0x640]; // Чужой 1 graphicextern unsigned int Alien2 [0x640]; // Чужой 2 graphicextern unsigned int Cannon [0x640]; // Космические захватчики cannonextern unsigned int MarioL1 [0x310]; // M Left 1extern без знака int MarioL2 [0x310]; // Призрачное растровое изображение прямо aheadextern unsigned int MarioL3 [0x310]; // Призрачное растровое изображение прямо aheadextern unsigned int MarioR1 [0x310]; // Призрачное растровое изображение прямо aheadextern unsigned int MarioR2 [0x310]; // Призрачное растровое изображение прямо aheadextern unsigned int MarioR3 [0x310]; // Призрачное растровое изображение прямо aheadextern unsigned int MarioStop [0x310]; // Призрачное растровое изображение прямо aheadextern unsigned int MarioU1 [0x310]; // Призрачное растровое изображение прямо aheadextern unsigned int MarioU2 [0x310]; // Призрачное растровое изображение прямо aheadextern unsigned int MarioU3 [0x310]; // Призрачное растровое изображение прямо aheadextern unsigned int MarioU4 [0x310]; // Призрачное растровое изображение прямо aheadextern unsigned int rd_ghost [784]; // Призрачное растровое изображение прямо aheadextern unsigned int ru_ghost [784]; // Призрачное растровое изображение прямо aheadextern unsigned int rl_ghost [784]; // Призрачное растровое изображение прямо aheadextern unsigned int rr_ghost [784]; // Призрачное растровое изображение прямо aheadextern unsigned int r_o_pacman [784]; // Призрачное растровое изображение прямо aheadextern unsigned int r_m_pacman [784]; // Призрачное растровое изображение прямо aheadextern unsigned int l_o_pacman [784]; // Призрачное растровое изображение прямо aheadextern unsigned int l_m_pacman [784]; // Призрачное растровое изображение прямо aheadextern без знака int u_m_pacman [784]; // Призрачное растровое изображение прямо aheadextern unsigned int u_o_pacman [784]; // Призрачное растровое изображение прямо aheadextern unsigned int d_m_pacman [784]; // Призрачное растровое изображение прямо aheadextern unsigned int d_o_pacman [784]; // Призрачное растровое изображение прямо aheadextern unsigned int c_pacman [784]; // Призрачное растровое изображение прямо aheadextern unsigned int Monkey2 [0x640]; // Призрачное растровое изображение прямо aheadextern unsigned int Monkey3 [0x640]; // Призрачное растровое изображение Прямо вперед // Координаты сенсорного экранаboolean screenPressed =false; int xT, yT; int userT =4; // флаг для указания направления касания на экранеboolean setupscreen =false; // используется для доступа к экрану настройки // Переменные настройки сигналов тревогиboolean xsetup =false; // Флаг для определения наличия существующего режима настройки // Задержка анимации для замедления движения int dly =0; // Обычно 30 // Счетчик обновления времени int rfcvalue =300; // ждать это долгое время, пока не будет проверяться изменения int rfc =1; // Объявить глобальные переменные для предыдущего раза, чтобы разрешить обновление только цифр, которые изменились // Четыре цифры, которые должны быть нарисованы независимо, чтобы гарантировать последовательное позиционирование времени int c1 =20; // Цифра десятков часов int c2 =20; // Единая цифра часа int c3 =20; // Цифра десятков минут int c4 =20; // Единая минута digitvoid setup () {// Инициализируем RTC Serial.begin (9600); // while (! Serial); // ждем, пока Arduino Serial Monitor откроет delay (200); setSyncProvider (RTC.get); // функция для получения времени из RTC setSyncInterval (60); // синхронизировать время каждые 60 секунд (1 минуту) if (timeStatus ()! =timeSet) {Serial.println ("Невозможно синхронизировать с RTC"); RTC.set (1408278800); // установить RTC на 25 августа 2014 г., 9:00 утра setTime (1408278800); } else {Serial.println ("RTC установил системное время"); } // Настройка вывода включения сигнала тревоги для воспроизведения звука на плате ISD1820 pinMode (8, OUTPUT); // D8 используется для переключения звука digitalWrite (8, LOW); // Установите низкий уровень, чтобы выключить звук // Запуск отображения myGLCD.InitLCD (); myGLCD.clrScr (); myTouch.InitTouch (); myTouch.setPrecision (PREC_LOW); drawscreen (); // Запускаем игру UpdateDisp (); // обновить значение до часов} void loop () {// увеличить флаг Pacman Graphic 0 =Closed, 1 =Medium Open, 2 =Wide Openp =p + 1; если (p ==4) {p =0; // Сбрасываем счетчик на закрытый} // увеличиваем графический флаг Pacman 0 =закрыто, 1 =средне открыто, 2 =широко открытоm =m + 1; если (m ==3) {m =0; // Сбросить счетчик на закрытие} // Установить яркость экрана // Проверить окружающее освещение и отрегулировать яркость светодиода в соответствии с Окружающим ок. 500 темнота ниже 100LDR =analogRead (A7); / * Диапазон тестовых значений LDR myGLCD.setColor (237, 28, 36); myGLCD.setBackColor (0, 0, 0); myGLCD.printNumI (LDR, 250,60); * / если (LDR> =121) {dimscreen =255; } если (LDR <=120) {dimscreen =45; } analogWrite (9, тусклый экран); // Регулирует яркость 0 - темно, в комнате около 25, а 70 - прямой солнечный свет // Считываем текущую дату и время по RTC и сбрасываем boardrfc ++; if (rfc> =rfcvalue) {// подсчитываем циклы и время печати UpdateDisp (); // обновляем значение на часы, затем ... dly =18; // сбросить задержку rfc =0; } // ===Проверяем, нужно ли подавать сигнал будильника if (alarmstatus ==true) {if ((alarmhour ==hour ()) &&(alarmminute ==minute ())) {// Подавать сигнал будильника soundalarm =true; }} // ===Запуск звука будильника - звук оплачивается в течение 10 секунд, затем перезапускается через 20 секунд markif ((alarmstatus ==true) &&(soundalarm ==true)) {// Установить счетчик и предпринять действия для перезапуска звук, если к экрану не прикасались if (act ==0) {// Отключение будильника переключением D8, записанный звук срабатывает при переходе от НИЗКОГО к ВЫСОКОМУ digitalWrite (8, HIGH); // Устанавливаем высокое значение digitalWrite (8, LOW); // Устанавливаем низкий UpdateDisp (); // обновляем значение до часов} act =act +1; if (act ==actr) {// Отключить тревогу переключением D8, записанный звук инициирован переходом от LOW к HIGH digitalWrite (8, HIGH); // Устанавливаем высокое значение digitalWrite (8, LOW); // Устанавливаем низкий уровень act =0; // Сбрасывать счетчик поочередно каждые 20 секунд}} // Проверяем, вводится ли пользователь на сенсорный экран // UserT устанавливает направление 0 =вправо, 1 =вниз, 2 =влево, 3 =вверх, 4 =без сенсорного ввода myTouch.read (); если (myTouch.dataAvailable () &&! screenPressed) {xT =myTouch.getX (); yT =myTouch.getY (); // ********************************* // ******* Войдите в режим настройки ** ******* // ********************************* if (((xT> =120) &&(xT <=200) &&(yT> =105) &&(yT <=140)) &&(soundalarm! =True)) {// Вызов программы настройки, если сигнал тревоги не звучит xsetup =true; // Переключаем флаг clocksetup (); // Вызов процедуры установки часов UpdateDisp (); // обновить значение до часов} else // Если центр экрана коснулся во время срабатывания будильника, выключите звук и сбросьте будильник, чтобы он не устанавливался if (((xT> =120) &&(xT <=200) &&(yT> =105) &&(yT <=140)) &&((alarmstatus ==true) &&(soundalarm ==true))) {alarmstatus =false; soundalarm =false; digitalWrite (8, LOW); // Устанавливаем низкий уровень} screenPressed =true; } // Не позволяет удерживать экран / вы должны нажать его, иначе if (! MyTouch.dataAvailable () &&screenPressed) {screenPressed =false; } drawghost (ghostX, ghostY, ghostD, p); // Увеличение позиции и рисование изображения // Направление призрака //// направление d ==0 =вправо, 1 =вниз, 2 =влево, 3 =вверхif (ghostD ==0) {// Вправо // Счетчик увеличения и проверка результаты ghostX =ghostX + 3; если (ghostX ==270) {myGLCD.fillRect (ghostX-3, ghostY, ghostX, ghostY + 28); // Очистить график перед изменением положения ghostD =1; // Изменить направление вниз}} else if (ghostD ==1) {// Вниз // Увеличить счетчик и результаты тестирования ghostY =ghostY + 3; если (ghostY ==185) {myGLCD.fillRect (ghostX + 3, ghostY-3, ghostX + 36, ghostY); // Очистить график перед изменением положения ghostD =2; // Изменить направление вниз}} else if (ghostD ==2) {// Влево // Увеличить счетчик и результаты тестирования ghostX =ghostX - 3; если (ghostX ==12) {myGLCD.fillRect (ghostX + 28, ghostY, ghostX + 31, ghostY + 28); // Очистить графику следа перед печатью нового positi ghostD =3; // Изменить направление вниз}} else if (ghostD ==3) {// Вверх // Увеличить счетчик и результаты тестирования ghostY =ghostY - 3; если (ghostY ==14) {myGLCD.fillRect (ghostX, ghostY + 29, ghostX + 28, ghostY + 28); // Очистить графику следа перед печатью новой позиции ghostD =0; // Смена направления вниз}} drawMonkey (MonkeyX, MonkeyY, MonkeyD, p); // Увеличение позиции и рисование изображения // Направление обезьяны //// направление d ==0 =вправо, 1 =вниз, 2 =влево, 3 =вверхif (MonkeyD ==0) {// Вправо // Счетчик увеличения и проверка результаты MonkeyX =MonkeyX + 3; если (MonkeyX ==270) {myGLCD.fillRect (MonkeyX-3, MonkeyY, MonkeyX, MonkeyY + 40); // Очистить график перед изменением направления MonkeyD =1; // Изменить направление вниз}} else if (MonkeyD ==1) {// Вниз // Увеличить счетчик и результаты теста MonkeyY =MonkeyY + 3; если (MonkeyY ==185) {myGLCD.fillRect (MonkeyX + 3, MonkeyY-3, MonkeyX + 38, MonkeyY); // Очистить траекторию перед печатью новой позиции MonkeyD =2; // Изменить направление вниз}} else if (MonkeyD ==2) {// Влево // Увеличить счетчик и результаты теста MonkeyX =MonkeyX - 3; если (MonkeyX ==12) {myGLCD.fillRect (MonkeyX + 41, MonkeyY + 1, MonkeyX + 40, MonkeyY + 38); // Очистить траекторию перед печатью новой позиции MonkeyD =3; // Изменить направление вниз}} else if (MonkeyD ==3) {// Вверх // Увеличить счетчик и результаты теста MonkeyY =MonkeyY - 3; если (MonkeyY ==14) {myGLCD.fillRect (MonkeyX, MonkeyY + 38, MonkeyX + 40, MonkeyY + 43); // Очистить графику следа перед печатью новой позиции MonkeyD =0; // Смена направления вниз}} drawCannon (CannonX, CannonY, CannonD, p); // Увеличиваем позицию и рисуем изображение // Направление пушки //// направление d ==0 =вправо, 1 =вниз, 2 =влево, 3 =вверхif (CannonD ==0) {// Вправо // Увеличиваем счетчик и тестируем результаты CannonX =CannonX + 3; if (CannonX ==270) {myGLCD.fillRect (CannonX-3, CannonY + 3, CannonX, CannonY + 36); // Очистить график перед изменением направления CannonD =1; // Изменить направление вниз}} else if (CannonD ==1) {// Вниз // Увеличить счетчик и результаты тестирования CannonY =CannonY + 3; если (CannonY ==185) {CannonD =2; // Изменить направление вниз}} else if (CannonD ==2) {// Влево // Увеличить счетчик и результаты тестирования CannonX =CannonX - 3; if (CannonX ==12) {myGLCD.fillRect (CannonX + 41, CannonY + 3, CannonX + 40, CannonY + 36); // Очистить траекторию перед печатью новой позиции CannonD =3; // Изменить направление вниз}} else if (CannonD ==3) {// Вверх // Увеличить счетчик и результаты тестирования CannonY =CannonY - 3; если (CannonY ==14) {CannonD =0; // Смена направления вниз}} drawpacman (pacmanX, pacmanY, pacmanD, p); // Увеличиваем позицию и отрисовываем изображение // pacman Direction //// direction d ==0 =right, 1 =down, 2 =left, 3 =upif (pacmanD ==0) {// Right // Увеличиваем счетчик и тестируем результаты pacmanX =pacmanX + 3; если (pacmanX ==270) {myGLCD.fillRect (pacmanX-3, pacmanY + 3, pacmanX, pacmanY + 36); // Очистить график перед изменением направления pacmanD =1; // Изменить направление вниз}} else if (pacmanD ==1) {// Вниз // Увеличить счетчик и результаты теста pacmanY =pacmanY + 3; если (pacmanY ==185) {myGLCD.fillRect (pacmanX + 3, pacmanY-3, pacmanX + 36, pacmanY); // Очистить график перед изменением позиции pacmanD =2; // Изменить направление вниз}} else if (pacmanD ==2) {// Влево // Увеличить счетчик и результаты теста pacmanX =pacmanX - 3; если (pacmanX ==12) {myGLCD.fillRect (pacmanX + 28, pacmanY, pacmanX + 31, pacmanY + 28); // Очистить траекторию перед печатью нового positi pacmanD =3; // Изменить направление вниз}} else if (pacmanD ==3) {// Вверх // Увеличить счетчик и результаты теста pacmanY =pacmanY - 3; если (pacmanY ==14) {myGLCD.fillRect (pacmanX, pacmanY + 29, pacmanX + 28, pacmanY + 28); // Очистить график перед печатью новой позиции pacmanD =0; // Смена направления вниз}} drawAlien (AlienX, AlienY, AlienD, p); // Увеличиваем позицию и рисуем изображение // Направление инопланетян //// направление d ==0 =вправо, 1 =вниз, 2 =влево, 3 =вверхif (AlienD ==0) {// Вправо // Увеличиваем счетчик и тестируем результаты AlienX =AlienX + 3; если (AlienX ==270) {myGLCD.fillRect (AlienX-3, AlienY + 3, AlienX, AlienY + 36); // Очистить график перед изменением направления AlienD =1; // Изменить направление вниз}} else if (AlienD ==1) {// Вниз // Увеличить счетчик и результаты тестирования AlienY =AlienY + 3; если (AlienY ==185) {AlienD =2; // Изменить направление вниз}} else if (AlienD ==2) {// Влево // Увеличить счетчик и результаты тестирования AlienX =AlienX - 3; если (AlienX ==12) {myGLCD.fillRect (AlienX + 41, AlienY + 3, AlienX + 40, AlienY + 36); // Очистить траекторию перед печатью новой позиции AlienD =3; // Изменить направление вниз}} else if (AlienD ==3) {// Вверх // Увеличить счетчик и результаты тестирования AlienY =AlienY - 3; если (AlienY ==14) {AlienD =0; // Смена направления вниз}} drawMario (MarioX, MarioY, MarioD, p); // Увеличиваем позицию и отрисовываем изображение // Mario Direction //// direction d ==0 =right, 1 =down, 2 =left, 3 =upif (MarioD ==0) {// Right // Увеличиваем счетчик и тестируем результаты MarioX =MarioX + 3; если (MarioX ==270) {myGLCD.fillRect (MarioX-3, MarioY + 3, MarioX, MarioY + 36); // Очистить график перед изменением направления MarioD =1; // Изменить направление вниз}} else if (MarioD ==1) {// Вниз // Увеличить счетчик и результаты теста MarioY =MarioY + 3; если (MarioY ==185) {myGLCD.fillRect (MarioX + 3, MarioY-3, MarioX + 36, MarioY); // Очистить траекторию перед печатью новой позиции MarioD =2; // Изменить направление вниз}} else if (MarioD ==2) {// Влево // Увеличить счетчик и результаты теста MarioX =MarioX - 3; если (MarioX ==12) {MarioD =3; // Изменить направление вниз}} else if (MarioD ==3) {// Вверх // Увеличить счетчик и результаты теста MarioY =MarioY - 3; если (MarioY ==14) {myGLCD.fillRect (MarioX, MarioY + 30, MarioX + 28, MarioY + 28); // Очистить графику следа перед печатью новой позиции MarioD =0; // Смена направления вниз}} delay (dly); } // ********************************************* ************************************************* *********** // =====Обновление цифровых часов // *************************** ************************************************* ****************************** void UpdateDisp () {// Очистить временную область myGLCD.setColor (0, 0, 0); myGLCD.setBackColor (0, 0, 0); // myGLCD.fillRect (60, 80, 262, 166); int h; // Значение часа в 24-часовом формате int e; // Значение минуты в формате минут int pm =0; // Пометить Detrmine, если PM или AM // Есть четыре цифры, которые нужно нарисовать независимо, чтобы обеспечить согласованное позиционирование времени int d1; // Цифра десятков часов int d2; // Единая цифра часа int d3; // Цифра десятков минут int d4; // Единая цифра минут h =hour (); // 24-часовое значение часов RT e =minute (); / * TESTh =12; e =8; * /// Вычислить числовые значения часов для timeif ((h> =10) &&(h <=12)) {/ / AM часов 10,11,12 d1 =1; // вычисляем цифру десятков часов d2 =h - 10; // вычисляем единичную цифру часа 0,1,2} else if ((h> =22) &&(h <=24)) {// PM часов 10,11,12 d1 =1; // вычисляем цифру десятков часов d2 =h - 22; // calculate Ones hour digit 0,1,2 } else if ((h <=9)&&(h>=1)) { // AM hours below ten d1 =0; // calculate Tens hour digit d2 =h; // calculate Ones hour digit 0,1,2 } else if ( (h>=13) &&(h <=21)) { // PM hours below 10 d1 =0; // calculate Tens hour digit d2 =h - 12; // calculate Ones hour digit 0,1,2 } else { // If hour is 0 d1 =1; // calculate Tens hour digit d2 =2; // calculate Ones hour digit 0,1,2 } // Calculate minute digit values for timeif ((e>=10)) { d3 =e/10; // calculate Tens minute digit 1,2,3,4,5 d4 =e - (d3*10); // calculate Ones minute digit 0,1,2 } else { // e is less than 10 d3 =0; d4 =e; } if (h>=12){ // Set // h =h-12; // Work out value pm =1; // Set PM flag} // *************************************************************************// Print each digit if it has changed to reduce screen impact/flicker// Set digit font colour to white myGLCD.setColor(255, 255, 255); myGLCD.setBackColor(0, 0, 0); myGLCD.setFont(SevenSeg_XXXL_Num); // First Digitif(((d1 !=c1)||(xsetup ==true))&&(d1 !=0)){ // Do not print zero in first digit position myGLCD.printNumI(d1,10,70); // Printing thisnumber impacts LFH walls so redraw impacted area // ---------------- Clear lines on Outside wall myGLCD.setColor(0,0,0); myGLCD.drawRoundRect(1, 238, 318, 1); }//If prevous time 12:59 or 00:59 and change in time then blank First Digitif((c1 ==1) &&(c2 ==2) &&(c3 ==5) &&(c4 ==9) &&(d2 !=c2) ){ // Clear the previouis First Digit and redraw wall myGLCD.setColor(0,0,0); myGLCD.fillRect(50, 70, 70, 165);}if((c1 ==0) &&(c2 ==0) &&(c3 ==5) &&(c4 ==9) &&(d2 !=c2) ){ // Clear the previouis First Digit and redraw wall myGLCD.setColor(0,0,0); myGLCD.fillRect(50, 70, 70, 165);} myGLCD.setColor(255, 255, 255); myGLCD.setBackColor(0, 0, 0); myGLCD.setFont(SevenSeg_XXXL_Num); // Second Digitif((d2 !=c2)||(xsetup ==true)){ myGLCD.printNumI(d2,70,70); // Print 0}// Third Digitif((d3 !=c3)||(xsetup ==true)){ myGLCD.printNumI(d3,143,70); // Was 145 }// Fourth Digitif((d4 !=c4)||(xsetup ==true)){ myGLCD.printNumI(d4,204,70); // Was 205 }if (xsetup ==true){ xsetup =false; // Reset Flag now leaving setup mode } // Print PM or AM // myGLCD.setColor(1, 73, 240); myGLCD.setBackColor(0, 0, 0); myGLCD.setFont(BigFont); if (pm ==0) { myGLCD.print("AM", 270, 147); } else { myGLCD.print("PM", 270, 147); }// ----------- Alarm Set on LHS lower pillarif (alarmstatus ==true) { // Print AS on fron screenleft hand side myGLCD.print("AS", 7, 147); } // Round dots myGLCD.setColor(255, 255, 255); myGLCD.setBackColor(0, 0, 0); myGLCD.fillCircle(137, 105, 5); myGLCD.fillCircle(137, 135, 5);//--------------------- copy exising time digits to global variables so that these can be used to test which digits change in futurec1 =d1;c2 =d2;c3 =d3;c4 =d4;}// =====initiateGame - Custom Functionvoid drawscreen() { // Setup Clock Background //Draw Background lines myGLCD.setColor(1, 73, 240);// myGLCD.setColor(229, 14, 122);// myGLCD.setColor(255, 0, 131); // ---------------- Outside wall myGLCD.drawRoundRect(0, 239, 319, 0); myGLCD.drawRoundRect(2, 237, 317, 2); myGLCD.drawBitmap (ghostX, ghostY, 28, 28, rd_ghost); // Closed Ghost myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioR3); // Closed Ghost myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey2); // Closed Ghost myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, r_o_pacman); // Closed Ghost myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien1); // Closed Ghost myGLCD.drawBitmap (CannonX, CannonY, 40, 40, Cannon); // Closed Ghost } // ********************************** // ******* Enter Setup Mode ********* // ********************************** // Use up down arrows to change time and alrm settings void clocksetup(){ int timehour =hour();int timeminute =minute();// Read Alarm Set Time from Eeprom // read a byte from the current address of the EEPROM ahour =EEPROM.read(100); alarmhour =(int)ahour; if (alarmhour>24 ) { alarmhour =0; } amin =EEPROM.read(101); alarmminute =(int)amin; if (alarmminute>60 ) { alarmminute =0; }boolean savetimealarm =false; // If save button pushed save the time and alarm // Setup Screen myGLCD.clrScr();// ---------------- Outside wall myGLCD.setColor(255, 255, 0); myGLCD.setBackColor(0, 0, 0); myGLCD.drawRoundRect(0, 239, 319, 0); myGLCD.drawRoundRect(2, 237, 317, 2); //Reset screenpressed flagscreenPressed =false;// Read in current clock time and Alarm time // Setup buttons myGLCD.setFont(BigFont); // Time Set buttons myGLCD.print("+ +", 135, 38); myGLCD.print("- -", 135, 82); myGLCD.drawRoundRect(132, 35, 152, 55); // time hour + myGLCD.drawRoundRect(180, 35, 200, 55); // time minute + myGLCD.drawRoundRect(132, 80, 152, 100); // time hour - myGLCD.drawRoundRect(180, 80, 200, 100); // time minute - // Alarm Set buttons myGLCD.print("+ +", 135, 138); myGLCD.print("- -", 135, 182); myGLCD.drawRoundRect(132, 135, 152, 155); // alarm hour + myGLCD.drawRoundRect(180, 135, 200, 155); // alarm minute + myGLCD.drawRoundRect(132, 180, 152, 200); // alarm hour - myGLCD.drawRoundRect(180, 180, 200, 200); // alarm minute - myGLCD.print("SAVE", 13, 213); myGLCD.print("EXIT", 245, 213); myGLCD.drawRoundRect(10, 210, 80, 230); myGLCD.drawRoundRect(243, 210, 310, 230); // Get your Ghost on myGLCD.drawBitmap (50, 20, 28, 28, rd_ghost); // Closed Ghost myGLCD.drawBitmap (240, 100, 28, 28, r_o_pacman); // Closed Ghost myGLCD.drawBitmap (240, 20, 40, 40, Alien1); // Closed Ghost // Begin Loop herewhile (xsetup ==true){ if (alarmstatus ==true){ // flag where false is off and true is on myGLCD.print("SET", 220, 160); } else { myGLCD.print("OFF", 220, 160); } myGLCD.drawRoundRect(218, 157, 268, 177);// Draw Sound Button myGLCD.print("TEST", 50, 110); // Triggers alarm sound myGLCD.drawRoundRect(48, 108, 116, 128); // Display Current Time myGLCD.print("Time", 40, 60); // myGLCD.printNumI(timehour, 130, 60); if(timehour>=10){ // Annoyingly if number less than 10 doesnt print on RHS and misses zero so need to compensate myGLCD.printNumI(timehour, 130, 60); // If>=10 just print minute } else { myGLCD.print("0", 130, 60); myGLCD.printNumI(timehour, 146, 60); } myGLCD.print(":", 160, 60); if(timeminute>=10){ // Annoyingly if number less than 10 doesnt print on RHS and misses zero so need to compensate myGLCD.printNumI(timeminute, 175, 60); // If>=10 just print minute } else { myGLCD.print("0", 175, 60); myGLCD.printNumI(timeminute, 193, 60); } //Display Current Alarm Setting myGLCD.print("Alarm", 40, 160); // myGLCD.printNumI(alarmhour, 130, 160); if(alarmhour>=10){ // Annoyingly if number less than 10 doesnt print on RHS and misses zero so need to compensate myGLCD.printNumI(alarmhour, 130, 160); // If>=10 just print minute } else { myGLCD.print("0", 130, 160); myGLCD.printNumI(alarmhour, 146, 160); } myGLCD.print(":", 160, 160); if(alarmminute>=10){ // Annoyingly if number less than 10 doesnt print on RHS and misses zero so need to compensate myGLCD.printNumI(alarmminute, 175, 160); // If>=10 just print minute } else { myGLCD.print("0", 175, 160); myGLCD.printNumI(alarmminute, 193, 160); } // Read input to determine if buttons pressed myTouch.read(); if (myTouch.dataAvailable()) { xT =myTouch.getX(); yT =myTouch.getY(); // Capture input command from user if ((xT>=230) &&(xT<=319) &&(yT>=200) &&(yT<=239)) { // (243, 210, 310, 230) Exit Button xsetup =false; // Exit setupmode } else if ((xT>=0) &&(xT<=90) &&(yT>=200) &&(yT<=239)) { // (243, 210, 310, 230) Save Alarm and Time Button savetimealarm =true; // Exit and save time and alarm xsetup =false; // Exit setupmode } else if ((xT>=130) &&(xT<=154) &&(yT>=32) &&(yT<=57)) { // Time Hour + (132, 35, 152, 55) timehour =timehour + 1; // Increment Hour if (timehour ==24) { // reset hour to 0 hours if 24 timehour =0; } } else if ((xT>=130) &&(xT<=154) &&(yT>=78) &&(yT<=102)) { // (132, 80, 152, 100); // time hour - timehour =timehour - 1; // Increment Hour if (timehour ==-1) { // reset hour to 23 hours if <0 timehour =23; } } else if ((xT>=178) &&(xT<=202) &&(yT>=32) &&(yT<=57)) { // Time Minute + (180, 35, 200, 55) timeminute =timeminute + 1; // Increment Hour if (timeminute ==60) { // reset minute to 0 minutes if 60 timeminute =0; } } else if ((xT>=178) &&(xT<=202) &&(yT>=78) &&(yT<=102)) { // (180, 80, 200, 100); // time minute - timeminute =timeminute - 1; // Increment Hour if (timeminute ==-1) { // reset minute to 0 minutes if 60 timeminute =59; } } else if ((xT>=130) &&(xT<=154) &&(yT>=133) &&(yT<=157)) { // (132, 135, 152, 155); // alarm hour + alarmhour =alarmhour + 1; // Increment Hour if (alarmhour ==24) { // reset hour to 0 hours if 24 alarmhour =0; } } else if ((xT>=130) &&(xT<=154) &&(yT>=178) &&(yT<=202)) { // (132, 180, 152, 200); // alarm hour - alarmhour =alarmhour - 1; // Increment Hour if (alarmhour ==-1) { // reset hour to 23 hours if <0 alarmhour =23; } } else if ((xT>=178) &&(xT<=202) &&(yT>=133) &&(yT<=157)) { // (180, 135, 200, 155); // alarm minute + alarmminute =alarmminute + 1; // Increment Hour if (alarmminute ==60) { // reset minute to 0 minutes if 60 alarmminute =0; } } else if ((xT>=178) &&(xT<=202) &&(yT>=178) &&(yT<=202)) { // (180, 180, 200, 200); // alarm minute - alarmminute =alarmminute - 1; // Increment Hour if (alarmminute ==-1) { // reset minute to 0 minutes if 60 alarmminute =59; } } else if ((xT>=216) &&(xT<=270) &&(yT>=155) &&(yT<=179)) { // (218, 157, 268, 177); // alarm set button pushed if (alarmstatus ==true) { alarmstatus =false; // Turn off Alarm } else { alarmstatus =true; // Turn on Alarm } } else if ((xT>=46) &&(xT<=118) &&(yT>=106) &&(yT<=130)) { // ((48, 108, 116, 128); // alarm test button pushed // Set off alarm by toggling D8, recorded sound triggered by LOW to HIGH transition digitalWrite(8,HIGH); // Set high digitalWrite(8,LOW); // Set low } // Should mean changes should scroll if held down delay(250); } } if ( savetimealarm ==true) { // The following codes transmits the data to the RTC Wire.beginTransmission(DS1307); Wire.write(byte(0)); Wire.write(decToBcd(0)); Wire.write(decToBcd(timeminute)); Wire.write(decToBcd(timehour)); Wire.write(decToBcd(0)); Wire.write(decToBcd(0)); Wire.write(decToBcd(0)); Wire.write(decToBcd(0)); Wire.write(byte(0)); Wire.endTransmission(); // Ends transmission of data // Write the Alarm Time to EEPROM so it can be stored when powered off //alarmhour =(int)ahour; ahour =(byte)alarmhour; amin =(byte)alarmminute; EEPROM.write(100, ahour); EEPROM.write(101, amin); // Now time and alarm data saved reset fla g savetimealarm =false;} //* Clear Screen myGLCD.setColor(0, 0, 0); myGLCD.setBackColor(0, 0, 0); myGLCD.fillRect(0,239,319,0); xsetup =true; // Set Flag now leaving setup mode in order to draw Clock Digits setSyncProvider(RTC.get); // the function to get the time from the RTC setSyncInterval(60); // sync the time every 60 seconds (1 minutes) drawscreen(); // Initiate the screen UpdateDisp(); // update value to clock } // =================Decimal to BCD converterbyte decToBcd(byte val) { return ((val/10*16) + (val%10));} /* myGLCD.drawBitmap (ghostX, ghostY, 28, 28, ghost); // Closed Ghost myGLCD.drawBitmap (MarioX, MarioY, 40, 40, Mario); // Closed Ghost myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey); // Closed Ghost myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, r_o_pacman); // Closed Ghost myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien); // Closed Ghost myGLCD.drawBitmap (CannonX, CannonY, 40, 40, Cannon); // Closed Ghost *///**********************************************************************************************************//======Draws the rd_ghost - bitmapvoid drawghost(int x, int y, int d, int p) { // Draws the ghost - bitmap // knotting direction d ==0 =right, 1 =down, 2 =left, 3 =up myGLCD.setColor(0, 0, 0); myGLCD.setBackColor(0, 0, 0); if ( d ==0){ // Right myGLCD.fillRect(x-3, y, x, y+28); // Clear trail off graphic before printing new position // draw image myGLCD.drawBitmap (ghostX, ghostY, 28, 28, rr_ghost); } else if ( d ==1){ // Down myGLCD.fillRect(x+3, y-3, x+36, y); // Clear trail off graphic before printing new position // draw image myGLCD.drawBitmap (ghostX, ghostY, 28, 28, rd_ghost); } else if ( d ==2){ // Left myGLCD.fillRect(x+28, y, x+31, y+28); // Clear trail off graphic before printing new positi // draw image myGLCD.drawBitmap (ghostX, ghostY, 28, 28, rl_ghost); // draw image } else if ( d ==3){ // Up myGLCD.fillRect(x, y+29, x+28, y+28); // Clear trail off graphic before printing new position // draw image myGLCD.drawBitmap (ghostX, ghostY, 28, 28, ru_ghost); }}//**********************************************************************************************************//======Draws the Mario - bitmapvoid drawMario(int x, int y, int d, int p) { // Draws the Mario - bitmap // Mario direction d ==0 =right, 1 =down, 2 =left, 3 =up myGLCD.setColor(0, 0, 0); myGLCD.setBackColor(0, 0, 0); if ( d ==0){ // Right myGLCD.fillRect(x-3, y+3, x, y+36); // Clear trail off graphic before printing new position // draw image if (p==0) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioR1); } else if (p==1) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioR3); } else if (p==2) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioR2); } else if (p==3) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioR3); } } else if ( d ==1){ // Down myGLCD.fillRect(x+3, y-3, x+36, y); // Clear trail off graphic before printing new position // draw image if (p==0) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioU1); } else if (p==1) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioU2); } else if (p==2) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioU1); } else if (p==3) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioU2); } } else if ( d ==2){ // Left myGLCD.fillRect(x+28, y, x+31, y+28); // Clear trail off graphic before printing new positi // draw image if (p==0) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioL1); } else if (p==1) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioL3); } else if (p==2) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioL2); } else if (p==3) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioL3); } } else if ( d ==3){ // Up myGLCD.fillRect(x, y+30, x+28, y+28); // Clear trail off graphic before printing new position // draw image if (p==0) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioU1); } else if (p==1) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioU2); } else if (p==2) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioU1); } else if (p==3) { myGLCD.drawBitmap (MarioX, MarioY, 28, 28, MarioU2); } }// myGLCD.drawBitmap (MarioX, MarioY, 40, 40, MarioR3); }//**********************************************************************************************************//======Draws the Cannon - bitmapvoid drawCannon(int x, int y, int d, int p) { // Draws the Cannon - bitmap // Cannon direction d ==0 =right, 1 =down, 2 =left, 3 =up myGLCD.setColor(0, 0, 0); myGLCD.setBackColor(0, 0, 0); if ( d ==0){ // Right myGLCD.fillRect(x-3, y+3, x, y+36); // Clear trail off graphic before printing new position // draw image } else if ( d ==1){ // Down myGLCD.fillRect(x+3, y-3, x+36, y); // Clear trail off graphic before printing new position // draw image } else if ( d ==2){ // Left myGLCD.fillRect(x+41, y+3, x+40, y+36); // Clear trail off graphic before printing new positi // draw image } else if ( d ==3){ // Up myGLCD.fillRect(x, y+41, x+40, y+40); // Clear trail off graphic before printing new position // draw image } myGLCD.drawBitmap (CannonX, CannonY, 40, 40, Cannon); }//**********************************************************************************************************//======Draws the Monkey - bitmapvoid drawMonkey(int x, int y, int d, int p) { // Draws the Monkey - bitmap // Monkey direction d ==0 =right, 1 =down, 2 =left, 3 =up myGLCD.setColor(0, 0, 0); myGLCD.setBackColor(0, 0, 0); if ( d ==0){ // Right myGLCD.fillRect(x-3, y, x, y+40); // Clear trail off graphic before printing new position // draw image if (p==0) { myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey2); } else if (p==1) { myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey2); } else if (p==2) { myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey3); }else { myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey3); } } else if ( d ==1){ // Down myGLCD.fillRect(x, y-3, x+40, y); // Clear trail off graphic before printing new position // draw image myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey3); } else if ( d ==2){ // Left myGLCD.fillRect(x+41, y, x+40, y+40); // Clear trail off graphic before printing new positi // draw image if (p==0) { myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey2); } else if (p==1) { myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey2); } else if (p==2) { myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey3); }else { myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey3); } } else if ( d ==3){ // Up myGLCD.fillRect(x, y+43, x+40, y+40); // Clear trail off graphic before printing new position // draw image myGLCD.drawBitmap (MonkeyX, MonkeyY, 40, 40, Monkey3); } }//**********************************************************************************************************//======Draws the pacman - bitmapvoid drawpacman(int x, int y, int d, int p) { // Draws the pacman - bitmap // pacman direction d ==0 =right, 1 =down, 2 =left, 3 =up myGLCD.setColor(0, 0, 0); myGLCD.setBackColor(0, 0, 0); if ( d ==0){ // Right myGLCD.fillRect(x-3, y+3, x, y+36); // Clear trail off graphic before printing new position // draw image if (p==0) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, c_pacman); } else if (p==1) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, r_m_pacman); } else if (p==2) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, r_o_pacman); }else { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, r_m_pacman); } } else if ( d ==1){ // Down myGLCD.fillRect(x+3, y-3, x+36, y); // Clear trail off graphic before printing new position // draw image if (p==0) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, c_pacman); } else if (p==1) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, d_m_pacman); } else if (p==2) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, d_o_pacman); }else { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, d_m_pacman); } } else if ( d ==2){ // Left myGLCD.fillRect(x+28, y, x+31, y+28); // Clear trail off graphic before printing new positi // draw image if (p==0) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, c_pacman); } else if (p==1) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, l_m_pacman); } else if (p==2) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, l_o_pacman); }else { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, l_m_pacman); } } else if ( d ==3){ // Up myGLCD.fillRect(x, y+29, x+28, y+28); // Clear trail off graphic before printing new position // draw image if (p==0) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, c_pacman); } else if (p==1) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, u_m_pacman); } else if (p==2) { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, u_o_pacman); }else { myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, u_m_pacman); } }// myGLCD.drawBitmap (pacmanX, pacmanY, 28, 28, r_o_pacman); }//**********************************************************************************************************//======Draws the Alien - bitmapvoid drawAlien(int x, int y, int d, int p) { // Draws the Alien - bitmap // Alien direction d ==0 =right, 1 =down, 2 =left, 3 =up myGLCD.setColor(0, 0, 0); myGLCD.setBackColor(0, 0, 0); if ( d ==0){ // Right myGLCD.fillRect(x-3, y+3, x, y+36); // Clear trail off graphic before printing new position // draw image if((p ==1)||(p ==3)){ myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien1); } else { myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien2); } } else if ( d ==1){ // Down myGLCD.fillRect(x+3, y-3, x+36, y); // Clear trail off graphic before printing new position // draw image if((p ==1)||(p ==3)){ myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien1); } else { myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien2); } } else if ( d ==2){ // Left myGLCD.fillRect(x+41, y+3, x+40, y+36); // Clear trail off graphic before printing new positi // draw image if((p ==1)||(p ==3)){ myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien1); } else { myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien2); } } else if ( d ==3){ // Up myGLCD.fillRect(x, y+41, x+40, y+40); // Clear trail off graphic before printing new position // draw image if((p ==1)||(p ==3)){ myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien1); } else { myGLCD.drawBitmap (AlienX, AlienY, 40, 40, Alien2); } } }

Изготовленные на заказ детали и корпуса

Thingiverse
https://www.thingiverse.com/thing:3017701CAD file on thingiverse.com

Схема


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

  1. Светодиодный секвенсор
  2. Часы с кукушкой
  3. Часы видения Arduino pov
  4. Генератор часов Verilog
  5. Простые часы со словами (Arduino)
  6. Портативная игровая консоль TeleBall Retro
  7. Основные часы
  8. Консоль Ingegno Retro Games
  9. Итальянские часы со словами
  10. Зеркальные часы бесконечности