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

ЖК-анимация и игры

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

Arduino UNO
× 1
Буквенно-цифровой ЖК-дисплей, 16 x 2
× 1

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

IDE Arduino

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

В этом проекте основное внимание уделяется основам анимации с использованием Arduino и ЖК-дисплея 16 на 2. Однако этот проект также может быть расширен до ЖК-дисплеев других размеров.

Сначала мы начнем с подключения ЖК-дисплея к Arduino, а затем с простой печати сообщения на ЖК-дисплее. Затем мы перейдем к анимации.

Подключение ЖК-дисплея

Это схема, схематически показанная выше.

PIN-код ЖК-дисплея

1:VSS:к положительной шине макета (подключите 5 В Arduino также к положительной шине)

2:VDD:к отрицательной шине макета (сюда же подключите GND Arduino)

3:VO (контраст):к стеклоочистителю потенциометра (прикрепите боковые клеммы потенциометра к положительной и отрицательной шинам)

4:RS (выбор регистра):к контакту 12 Arduino

5:R / W (чтение-запись):на отрицательную шину

6:E (включить):к контакту 11 Arduino

15:A (анод):к положительной шине с сопротивлением 220 Ом

16:K (катод):к отрицательной шине

Прямо сейчас мы не будем прикреплять PIN-код.

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

Если ЖК-дисплей не загорается, проверьте пайку, проводку (перепроверьте), и если он все еще не загорается, весьма вероятно, что ваш ЖК-дисплей поврежден, поэтому вам необходимо его заменить.

Если ваш ЖК-дисплей работает, Браво! вы закончили первую часть этого руководства.

После этого подключите выводы данных:

11:D4 (вывод данных 4):к выводу 4 Arduino

12:D5:к контакту 5 Arduino

13:D6:к контакту 6 Arduino

14:D7:к выводу 7 Arduino

После этого загрузите образец кода

  #include  LiquidCrystal lcd (12,11,4,5,6,7); // rs, e, d4, d5, d6, d7 соответственно, избегайте setup () {lcd.begin (16,2); lcd.setCursor (0,1); lcd.print ("Рабочий");} void loop () {}  

После загрузки, если вы видите случайные символы или вообще ничего не видите, проверьте контраст (поверните ручку потенциометра вверх и вниз), проверьте пайку контактов (контакты данных НЕ должны быть соединены друг с другом даже немного) и, наконец, ваша схема и линия 2 в образец кода (убедитесь, что номера выводов, предоставленные для LiquidCrystal, совпадают с номерами контактов в вашей схеме.

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

Если вы видите сообщение «Работает», значит, вы успешно подключили свой ЖК-дисплей и завершили вторую часть этого руководства. Оставьте схему как есть, мы больше не будем с ней связываться, все, что нам нужно сделать сейчас, будет в программном обеспечении.

Объяснение кода в части 2

LiquidCrystallcd (12,11,4,5,6,7);

В этой строке объявляется объект lcd с выводами интерфейса, как указано в аргументах. Теперь весь ваш интерфейс lcd будет осуществляться через этот объект lcd. (Обратите внимание, что вы можете называть его как хотите, но сохраняйте это имя повсюду).

lcd.begin (16,2);

В этой строке объявляется, что наш ЖК-экран имеет размеры 16 столбцов и 2 строки. Обратите внимание, что ваш ЖК-экран может быть не 16 на 2, соответственно измените числа.

lcd.setCursor (0,1);

Эта строка установит курсор в первый столбец и во вторую строку (поскольку счет в C ++ начинается с 0, а не с 1!). Обратите внимание, что вы не видите курсор, но он всегда там, он фиксирует место, в котором появится следующий символ.

lcd.print ("Добро пожаловать");

В этой строке будет напечатано сообщение "Добро пожаловать" в том месте, куда указывает курсор, то есть 0 столбцов 1 строка.

Прокрутка текста

Что ж, мы распечатали сообщение на экране, но сидеть и смотреть на это сообщение не очень привлекательно, к тому же это не служит никакой цели. Таким образом, в этом разделе мы напечатаем сообщение, которое будет прокручиваться справа налево, как на досках объявлений. Только функции setup () и loop () будут отличаться, поэтому я показываю только эти функции, все остальное остается прежним.

  void setup () {lcd.begin (16,2);} void loop () {int n; char message [] ="прокручиваемый текст!"; n =15; char * ptr =message; в то время как (п! =- 14) {lcd.clear (); lcd.setCursor (n, 1); если (п <0) {ptr ++; } lcd.print (ptr); n -; задержка (250);}}  

Обратите внимание, что для понимания этого кода вам необходимо достаточно хорошее знание указателей в C и C ++, поскольку язык Arduino на самом деле представляет собой лишь слегка обработанный AVR-C ++.

В функции цикла мы определяем ваше сообщение как постоянную строку.

lcd.clear () используется для очистки экрана при каждой итерации.

Затем мы устанавливаем указатель ptr для хранения адреса сообщения. Это значение указателя будет увеличиваться, чтобы соответствовать сообщению в ЖК-окне даже после того, как символы выскользнули из поля зрения слева. Мы делаем это для левого конца, а не для правого, поскольку библиотека LiquidCrystal может обрабатывать это для правого конца (прокрутка текста), но не может обрабатывать отрицательные адреса столбцов, как это требуется для нашей программы.

Затем у нас есть цикл while, который будет отображать сообщение в разных местах слева направо, создавая иллюзию движения текста. Обратите внимание, что delay () в конце предназначен для того, чтобы мы могли прочитать текст, и он не двигается справа налево с нечитаемой скоростью. Если анимация кажется слишком медленной или слишком быстрой, вы можете изменить значение задержки.

Пользовательские символы

При любом использовании функции lcd.print () мы не можем отобразить, скажем, динозавра на ЖК-экране. Однако мы можем сделать это, используя функцию библиотеки LiquidCrystal под названием Custom Characters.

Для этого мы определяем байт данных, который содержит единицы для всех включенных пикселей и нули для всех выключенных пикселей, например:

  byte dino [] ={B01110, B01110, B01100, B01111, B11101, B01010, B01010, B01010}  

Это пользовательский персонаж, который будет отображать динозавра на ЖК-экране. Здесь вы можете создавать своих персонажей:https://maxpromer.github.io/LCD-Character-Creator/

После этого нам нужно их отобразить. Однако эти символы не могут быть отображены с помощью обычного метода lcd.print; нам нужно использовать это:

  void setup () {lcd.createChar (0, dino); lcd.begin (16,2); lcd.setCursor (0,1); lcd.write (byte (0));}  

С помощью этого кода мы создаем настраиваемый адресный символ из ранее определенного байта dino []. Адрес нашего пользовательского персонажа задается методом lcd.createChar (), который определяет символ 0 как dino []. Затем мы будем называть этот символ байтом (0), который возвращает адрес нашего пользовательского символа, и, наконец, распечатать его на экране с помощью метода lcd.Write ().

Стрельба из стрел

Эта программа, наконец, научит вас анимировать с помощью ЖК-экранов, прочтите внимательно.

  #include  LiquidCrystal lcd (12,11,4,5,6,7); байтовая стрелка [] ={B00001, B00011, B00111, B01111, B00111, B00011, B00001, B00000 } byte arrowbody [] ={B00000, B00000, B00000, B11111, B11111, B00000, B00000, B00000} byteB00011, B00111, B01111, B11111, B11111, B01111, B00111, B00011} voidlcd.createheadChar (0, lc, createChar (1, arrowbody); lcd.createChar (2, arrowtail); lcd.begin (16,2);} voidint while (n! =- 1) {lcd.clear (); lcd.setCursor (0,1); lcd.write (byte (0)); lcd.write (byte (1)); lcd.write (byte (2)); n -; задержка (50);}}  

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

Вот и все! Вы закончили свою первую анимацию с Arduino и ЖК-дисплеями! Поиграйте с кодом и объедините его с кнопками, чтобы превратить это в полноценную игру!

ЖК-игра

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

Цель этой игры

Прежде чем мы начнем игру, нам нужно выяснить цель игрового процесса.

В этой игре цель следующая:

Есть герой, человек в строке 1 (обратите внимание, что первая строка - это строка 0) (обычно), в которую будет выпущена серия стрел. Если в героя попали, игра окончена. Герой будет избегать стрелок, перейдя в строку 0, которой мы собираемся управлять с помощью кнопки. (нажатие кнопки =строка 0, а не =строка 1). Оценка увеличивается за цикл и отображается в правом углу.

На самом деле это расширение анимации более ранних стрелок, поэтому я собираюсь включить только те части, которые были изменены.

  byte man [] ={B01110, B01110, B00100, B01110, B10101, B00100, B01010, B10001}; void setup () {// устанавливает количество столбцов и строк ЖК-дисплея:lcd.createChar ( 0, стрелка); lcd.createChar (1, стрелка); lcd.createChar (2, стрелка); lcd.createChar (3, мужчина); lcd.begin (16, 2); attachInterrupt (0, кнопка, ИЗМЕНИТЬ); randomSeed (analogRead (A0)); // Выводим сообщение на ЖК-дисплей. //lcd.print("hello, world! ");} int n; void loop () {// установить курсор в столбец 0, строка 1 // (примечание:строка 1 - вторая строка, так как счет начинается с 0)://lcd.setCursor(0, 1); // выводим количество секунд с момента сброса://lcd.print (millis () / 1000); n =15; int rnd; rnd =случайный (15,25); в то время как (п! =- 1) {lcd.clear (); задержка (10); drawman (); lcd.setCursor (n, 1); if (n ==1) {если (level ==1) {stopgame (); Продолжать; }} lcd.write (байт (0)); lcd.write (байт (1)); lcd.write (байт (2)); lcd.setCursor (10,0); lcd.print (оценка); задержка (100-я); п--; оценка ++; если (уровень ==0) оценка--; }} void drawman () {lcd.setCursor (1, уровень); lcd.write (byte (3));} void buttonin () {если (digitalRead (2) ==LOW) {level =0; } else {level =1; }} void stopgame () {lcd.clear (); lcd.setCursor (0,0); lcd.print («Игра окончена»); lcd.setCursor (10,0); lcd.print (оценка); level =1; оценка =0; n =15; задержка (3000); return;}  

Не весь этот код посвящен ЖК-дисплею, но ВСЕ важно для разработчиков игр.

Начнем с определения символа man [], которое будет хранить байт для символа человека (нашего героя). Затем у нас есть функция настройки, в которой изменились только две строки. Обе линии представляют только часть обширной группы, к которой они относятся, а именно прерывания и случайные числа. Оба являются очень полезными удобствами, дополнительную информацию о которых вы можете найти на веб-сайте arduino.cc.

Сначала у нас есть функция attachInterrupt. Обратите внимание, что определение, которое я собираюсь дать, не очень исчерпывающее, но необходимо краткое, чтобы понять, что здесь происходит.

Прерывания - это функции, которые могут быть вызваны при возникновении события. НЕ ВАЖНО, ГДЕ ИСПОЛНЕНИЕ происходит. Это важный факт, полезный для реализации функций ввода в реальном времени. Здесь мы используем его, чтобы убедиться, что независимо от того, в какой момент выполнения будет нажата кнопка, мы предпримем соответствующее действие (по крайней мере, программа будет).

Синтаксис для attachInterrupt:

attachInterrupt (pin_number-2, function_to_call_without_parenthesis, condition_for_calling);

CHANGE - это значение #define, используемое для обозначения того, что при любом изменении состояния на входе pin_number будет вызываться присоединенная функция.

Тогда у нас есть случайное число. Одно выдающееся качество, которым обладают физические процессоры, такие как Arduino, чего нет у обычных процессоров, заключается в том, что случайное число, генерируемое Arduino, действительно случайный как аналоговый шум, присутствующий на выводе A0 если контакт A0 является плавающим (т. е. не подключен) случайным образом, как предсказывает квантовая физика (более или менее).

randomSeed используется для установки начального числа для случайного процесса. random () - это функция с параметрами MIN, MAX или MAX только для получения следующего случайного числа в последовательности.

Затем у нас есть функция прерывания buttonin (), которая проверяет, нажата ли кнопка (LOW) или не нажата (HIGH), и соответственно изменяет уровень (строку) нашего героя.

Вот и все, у нас есть полноценная игра !!

Код

  • код для анимации
  • код для игры
код для анимации Arduino
 // включаем код библиотеки:#include  // инициализируем библиотеку путем связывания любого необходимого вывода интерфейса LCD // с номером вывода Arduino, к которому он подключен const int rs =12, en =11, d4 =4, d5 =5, d6 =6, d7 =7; ЖК-дисплей LiquidCrystal (rs, en, d4, d5, d6, d7); байтовая стрелка [] ={B00001, B00011, B00111, B01111, B00111, B00011, B00001 , B00000}; байтовая стрелка [] ={B00000, B00000, B00000, B11111, B11111, B00000, B00000, B00000}; байтовая стрелка [] ={B00011, B00111, B11111, B11111, B11111, B00111, B00011, B00000}; byte man [] ={B01110, B01110, B00100, B01110, B10101, B00100, B01010, B10001}; void setup () {// настраиваем количество столбцов и строк ЖК-дисплея:lcd.createChar (0, стрелка); lcd.createChar (1, стрелка); lcd.createChar (2, стрелка); lcd.createChar (3, мужчина); lcd.begin (16, 2); // Выводим сообщение на ЖК-дисплей. //lcd.print("hello, world! ");} void loop () {// установить курсор в столбец 0, строка 1 // (примечание:строка 1 - вторая строка, поскольку счет начинается с 0)://lcd.setCursor(0, 1); // выводим количество секунд с момента сброса://lcd.print (millis () / 1000); int n; n =15; в то время как (п! =- 1) {lcd.clear (); задержка (10); lcd.setCursor (0,0); lcd.print ("Дебаншу Дас"); / * lcd.setCursor (1,1); lcd.write (байт (3)); lcd.setCursor (n, 1); lcd.write (байт (0)); lcd.write (байт (1)); lcd.write (byte (2)); * / задержка (65); п--; }} 
код для игры Arduino
 // включаем код библиотеки:#include  // инициализируем библиотеку путем связывания любого необходимого вывода интерфейса LCD // с номером вывода Arduino, к которому он подключен const int rs =12, en =11, d4 =4, d5 =5, d6 =6, d7 =7; LiquidCrystal lcd (rs, en, d4, d5, d6, d7); int level =1; int score =0; байтовая стрелка [] ={B00001, B00011 , B00111, B01111, B00111, B00011, B00001, B00000}; байтовая стрелка [] ={B00000, B00000, B00000, B11111, B11111, B00000, B00000, B00000}; байтовая стрелка [] ={B00011, B00111, B1111111, B11 , B11111, B00111, B00011, B00000}; byte man [] ={B01110, B01110, B00100, B01110, B10101, B00100, B01010, B10001}; void setup () {// настраиваем количество столбцов и строк на ЖК-дисплее:lcd.createChar (0, стрелка); lcd.createChar (1, стрелка); lcd.createChar (2, стрелка); lcd.createChar (3, мужчина); lcd.begin (16, 2); attachInterrupt (0, кнопка, ИЗМЕНИТЬ); randomSeed (analogRead (A0)); // Выводим сообщение на ЖК-дисплей. //lcd.print("hello, world! ");} int n; void loop () {// установить курсор в столбец 0, строка 1 // (примечание:строка 1 - вторая строка, так как счет начинается с 0)://lcd.setCursor(0, 1); // выводим количество секунд с момента сброса://lcd.print (millis () / 1000); n =15; int rnd; rnd =случайный (15,25); в то время как (п! =- 1) {lcd.clear (); задержка (10); drawman (); lcd.setCursor (n, 1); if (n ==1) {если (level ==1) {stopgame (); Продолжать; }} lcd.write (байт (0)); lcd.write (байт (1)); lcd.write (байт (2)); lcd.setCursor (10,0); lcd.print (оценка); задержка (100-я); п--; оценка ++; если (уровень ==0) оценка--; }} void drawman () {lcd.setCursor (1, уровень); lcd.write (byte (3));} void buttonin () {если (digitalRead (2) ==LOW) {level =0; } else {level =1; }} void stopgame () {lcd.clear (); lcd.setCursor (0,0); lcd.print («Игра окончена»); lcd.setCursor (10,0); lcd.print (оценка); level =1; оценка =0; n =15; задержка (3000); return;} 

Схема


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

  1. Датчик Arduino - типы и приложения
  2. Портативная игровая консоль | Клон Arduboy
  3. Вольтметр своими руками с использованием Arduino и смартфона
  4. Регистратор данных температуры и влажности
  5. Связь Python3 и Arduino
  6. Клеточные автоматы на основе Arduino и OLED
  7. FM-радио с использованием Arduino и RDA8057M
  8. Метеостанция Arduino
  9. ЖК-видеоигра Arduino
  10. Датчик температуры и влажности MKR1000