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

Урок Arduino: TFT LCD сенсорный экран — пошаговое руководство

В этом уроке по сенсорному экрану Arduino мы научимся использовать TFT LCD сенсорный экран с Arduino. Вы можете посмотреть следующее видео или прочитать письменный урок ниже.

Обзор

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

Урок Arduino: TFT LCD сенсорный экран — пошаговое руководство

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

Урок Arduino: TFT LCD сенсорный экран — пошаговое руководство

Третий пример — игра. На самом деле это реплика популярной игры Flappy Bird для смартфонов. Мы можем играть, используя кнопку или даже сам сенсорный экран.

Урок Arduino: TFT LCD сенсорный экран — пошаговое руководство

Теперь мы пройдемся по каждому из этих примеров и пошагово объясним коды, стоящие за ними.

Необходимые компоненты для этого сенсорного экрана Arduino

В качестве примера я использую 3.2" TFT сенсорный экран в комбинации с шилем TFT LCD Arduino Mega. Нам нужен шилд, потому что TFT сенсорный экран работает на 3.3В, а выводы Arduino Mega выдают 5В. Для первого примера у меня есть ультразвуковой датчик HC-SR04, для второго — RGB-светодиод с тремя резисторами, а для игрового примера — кнопка. Также мне пришлось сделать собственный pin header, припаяв pin headers и согнув один из них, чтобы вставить их между платой Arduino и TFT шилем.

Вы можете приобрести эти компоненты на любом из сайтов ниже:

  • 3.2″ TFT сенсорный дисплей………………..
  • TFT дисплей Mega Shield………………
  • Плата Arduino ……………………………
  • Ультразвуковой модуль HC-SR04………..
Урок Arduino: TFT LCD сенсорный экран — пошаговое руководство

Вот схема подключения. Мы будем использовать вывод GND, цифровые выводы с 8 по 13, а также вывод номер 14. Поскольку выводы 5V уже используются TFT экраном, я буду использовать вывод номер 13 как VCC, установив его в высокое состояние сразу в разделе setup кода.

Урок Arduino: TFT LCD сенсорный экран — пошаговое руководство

Код Arduino для сенсорного экрана

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

Я буду использовать библиотеки UTFT и URTouch, созданные Henning Karlsen. Здесь я хочу выразить ему благодарность за невероятную работу. Библиотеки позволяют очень легко использовать TFT экраны, и они работают со многими различными размерами TFT экранов, шилдами и контроллерами. Вы можете скачать эти библиотеки с его сайта RinkyDinkElectronics.com, а также найти много демо-примеров и подробную документацию о том, как их использовать.

После подключения библиотек нам нужно создать объекты UTFT и URTouch. Параметры этих объектов зависят от модели TFT экрана и шилда, и эти детали также можно найти в документации библиотек.

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

#include <UTFT.h>
#include <URTouch.h>
//==== Создание объектов
UTFT myGLCD(SSD1289,38,39,40,41); // Параметры должны быть адаптированы к вашей модели дисплея/шилда
URTouch myTouch( 6, 5, 4, 3, 2);
//==== Определение переменных
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t SevenSegNumFont[];
extern unsigned int bird01[0x41A];
int x, y;
char currentPage, selectedUnit;
// Ультразвуковой датчик
const int VCC = 13;
const int trigPin = 11;
const int echoPin = 12;
long duration;
int distanceInch, distanceCm;
// RGB светодиоды
const int redLed = 10;
const int greenLed = 9;
const int blueLed = 8;
int xR=38; int xG=38; int xB=38;
// Floppy Bird
int xP = 319; int yP = 100; int yB = 30;
int fallRateInt = 0; float fallRate =0; int score=0;
const int button = 14; int buttonState = 0;

void setup() {
  // Начальная настройка
  myGLCD.InitLCD();
  myGLCD.clrScr();
  myTouch.InitTouch();
  myTouch.setPrecision(PREC_MEDIUM);
  // Определение режимов пинов
  pinMode(VCC, OUTPUT); // VCC
  pinMode(trigPin, OUTPUT); // trigPin как выход
  pinMode(echoPin, INPUT); // echoPin как вход
  pinMode(redLed, OUTPUT);
  pinMode(greenLed, OUTPUT);
  pinMode(blueLed, OUTPUT);
  pinMode(button, INPUT);
  digitalWrite(VCC, HIGH); // +5V - Пин 13 как VCC
  drawHomeScreen(); // Рисует главный экран
  currentPage = '0'; // Указывает, что мы на главном экране
  selectedUnit = '0'; // Указывает выбранную единицу для первого примера, см или дюймы
}Язык кода: Arduino (arduino)

Теперь я объясню, как сделать главный экран программы. С помощью функции setBackColor() нам нужно установить цвет фона текста, в нашем случае черный. Затем мы устанавливаем цвет в белый, большой шрифт и с помощью функции print() выводим строку "Arduino TFT Tutorial" по центру экрана и на 10 пикселей ниже по оси Y. Далее мы устанавливаем цвет в красный и рисуем красную линию под текстом. После этого мы снова устанавливаем белый цвет и выводим две другие строки: "by HowToMechatronics.com" с использованием маленького шрифта и "Select Example" с использованием большого шрифта.

Далее идет кнопка датчика расстояния. Сначала мы устанавливаем цвет, а затем с помощью функции fillRoundRect() рисуем закрашенный скругленный прямоугольник. Затем мы снова устанавливаем белый цвет и с помощью функции drawRoundRect() рисуем другой скругленный прямоугольник поверх предыдущего, но без заливки, так что общий вид кнопки выглядит как с рамкой. Над кнопкой мы выводим текст с использованием большого шрифта и того же цвета фона, что и заливка кнопки. Та же процедура применяется для двух других кнопок.

// drawHomeScreen - Пользовательская функция
void drawHomeScreen() {
  // Заголовок
  myGLCD.setBackColor(0,0,0); // Устанавливает цвет фона области текста в черный
  myGLCD.setColor(255, 255, 255); // Устанавливает белый цвет
  myGLCD.setFont(BigFont); // Устанавливает большой шрифт
  myGLCD.print("Arduino TFT Tutorial", CENTER, 10); // Выводит строку на экран
  myGLCD.setColor(255, 0, 0); // Устанавливает красный цвет
  myGLCD.drawLine(0,32,319,32); // Рисует красную линию
  myGLCD.setColor(255, 255, 255); // Устанавливает белый цвет
  myGLCD.setFont(SmallFont); // Устанавливает маленький шрифт
  myGLCD.print("by HowToMechatronics.com", CENTER, 41); // Выводит строку
  myGLCD.setFont(BigFont);
  myGLCD.print("Select Example", CENTER, 64);
  // Кнопка - Датчик расстояния
  myGLCD.setColor(16, 167, 103); // Устанавливает зеленый цвет
  myGLCD.fillRoundRect (35, 90, 285, 130); // Рисует закрашенный скругленный прямоугольник
  myGLCD.setColor(255, 255, 255); // Устанавливает белый цвет
  myGLCD.drawRoundRect (35, 90, 285, 130); // Рисует скругленный прямоугольник без заливки
  myGLCD.setFont(BigFont); // Устанавливает большой шрифт
  myGLCD.setBackColor(16, 167, 103); // Устанавливает цвет фона текста в зеленый, как кнопка
  myGLCD.print("DISTANCE SENSOR", CENTER, 102); // Выводит строку
  // Кнопка - Управление RGB LED
  myGLCD.setColor(16, 167, 103);
  myGLCD.fillRoundRect (35, 140, 285, 180);
  myGLCD.setColor(255, 255, 255);
  myGLCD.drawRoundRect (35, 140, 285, 180);
  myGLCD.setFont(BigFont);
  myGLCD.setBackColor(16, 167, 103);
  myGLCD.print("RGB LED CONTROL", CENTER, 152);
  // Кнопка - Birduino
  myGLCD.setColor(16, 167, 103);
  myGLCD.fillRoundRect (35, 190, 285, 230);
  myGLCD.setColor(255, 255, 255);
  myGLCD.drawRoundRect (35, 190, 285, 230);
  myGLCD.setFont(BigFont);
  myGLCD.setBackColor(16, 167, 103);
  myGLCD.print("BIRDUINO GAME", CENTER, 202);
}Язык кода: Arduino (arduino)

Теперь нам нужно сделать кнопки функциональными, чтобы при нажатии они перенаправляли к соответствующему примеру. В разделе setup мы установили символ '0' в переменную currentPage, который будет указывать, что мы на главном экране. Так что если это верно, и если мы нажимаем на экран, это условие if станет истинным, и с помощью этих строк мы получим координаты X и Y, где было нажатие на экране. Если это область, покрывающая первую кнопку, мы вызовем пользовательскую функцию drawDistanceSensor(), которая активирует пример с датчиком расстояния. Также мы установим символ '1' в переменную currentPage, который будет указывать, что мы на первом примере. Пользовательская функция drawFrame() используется для подсветки кнопки при нажатии. Та же процедура применяется для двух других кнопок.

//========== Раздел loop ========
void loop() {
  // Главный экран
  if (currentPage == '0') {
    if (myTouch.dataAvailable()) {
      myTouch.read();
      x=myTouch.getX(); // Координата X, где был нажат экран
      y=myTouch.getY(); // Координата Y, где был нажат экран
      // Если нажата кнопка датчика расстояния
      if ((x>=35) && (x<=285) && (y>=90) && (y<=130)) {
        drawFrame(35, 90, 285, 130); // Пользовательская функция - подсвечивает кнопку при нажатии
        currentPage = '1'; // Указывает, что мы на первом примере
        myGLCD.clrScr(); // Очищает экран
        drawDistanceSensor(); // Вызывается только один раз, потому что в следующей итерации цикла это условие if будет ложным
      }
      // Если нажата кнопка управления RGB LED
      if ((x>=35) && (x<=285) && (y>=140) && (y<=180)) {
        drawFrame(35, 140, 285, 180);
        currentPage = '2';
        myGLCD.clrScr();
        drawLedControl();
      }
      // Если нажата кнопка игры Birduino
      if ((x>=35) && (x<=285) && (y>=190) && (y<=230)) {
        drawFrame(35, 190, 285, 230);
        currentPage = '3';
        myGLCD.clrScr();
        myGLCD.setColor(114, 198, 206);
        myGLCD.fillRect(0,0,319,239);
        drawGround();
        drawPilars(xP,yP);
        drawBird(30);
        delay(1000);
      }
    }
  }
  // Пример датчика расстояния
  if (currentPage == '1') {
    getDistance(); // Получает расстояние от датчика и эта функция вызывается повторно, пока мы на первом примере
    if (myTouch.dataAvailable()) {
      myTouch.read();
      x=myTouch.getX();
      y=myTouch.getY();
      // Если нажата кнопка сантиметров
      if ((x>=10) && (x<=135) &&(y>=90) && (y<=163)) {
        selectedUnit = '0';
      }
      // Если нажата кнопка дюймов
      if ((x>=10) && (x<=135) &&(y>=173) && (y<=201)) {
        selectedUnit = '1';
      }
      // Если нажата кнопка Назад
      if ((x>=10) && (x<=60) &&(y>=10) && (y<=36)) {
        drawFrame(10, 10, 60, 36);
        currentPage = '0'; // Указывает, что мы на главном экране
        myGLCD.clrScr();
        drawHomeScreen(); // Рисует главный экран
      }
    }
  }
  // Управление RGB LED
  if (currentPage == '2') {
    setLedColor();
    if (myTouch.dataAvailable()) {
      myTouch.read();
      x=myTouch.getX();
      y=myTouch.getY();
      // Кнопка Назад
      if ((x>=10) && (x<=60) &&(y>=10) && (y<=36)) {
        drawFrame(10, 10, 60, 36);
        currentPage = '0';
        myGLCD.clrScr();
        drawHomeScreen();
        // Выключает светодиод
        analogWrite(redLed, 0);
        analogWrite(greenLed, 0);
        analogWrite(blueLed, 0);
      }
    }
  }
  //==== Этот раздел кода для игрового примера объясняется в следующем уроке
  // Игра Birduino
  if (currentPage == '3') {
    //delay(1);
    xP=xP-3;
    drawPilars(xP, yP);
    yB+=fallRateInt;
    fallRate=fallRate+0.4;
    fallRateInt= int(fallRate);
    if (yB>=220) { yB=220; }
    if(yB>=180 || yB<=0){ restartGame(); }
    if((xP<=85) && (xP>=30) && (yB<=yP-2)){ restartGame(); }
    if((xP<=85) && (xP>=30) && (yB>=yP+60)){ restartGame(); }
    drawBird(yB);
    if (xP<=-51){ xP=319; yP = rand() % 100+20; score++; }
    if (myTouch.dataAvailable()) {
      myTouch.read();
      x=myTouch.getX(); y=myTouch.getY();
      if ((x>=0) && (x<=319) &&(y>=50) && (y<=239)) { fallRate=-5; }
    }
    buttonState = digitalRead(button);
    if (buttonState == HIGH) { fallRate=-5; }
  }
  if (myTouch.dataAvailable()) {
    myTouch.read();
    x=myTouch.getX(); y=myTouch.getY();
    if ((x>=10) && (x<=60) &&(y>=10) && (y<=36)) {
      drawFrame(10, 10, 60, 36);
      currentPage = '0';
      myGLCD.clrScr();
      drawHomeScreen();
      analogWrite(redLed, 0);
      analogWrite(greenLed, 0);
      analogWrite(blueLed, 0);
    }
  }
}Язык кода: Arduino (arduino)

Итак, пользовательская функция drawDistanceSensor() должна вызываться только один раз при нажатии кнопки, чтобы нарисовать всю графику этого примера аналогично тому, как мы описали для главного экрана. Однако пользовательская функция getDistance() должна вызываться повторно, чтобы выводить последние результаты расстояния, измеренного датчиком.

Вот эта функция, которая использует ультразвуковой датчик для вычисления расстояния и вывода значений шрифтом SevenSegNum зеленым цветом, либо в сантиметрах, либо в дюймах. Если вам нужны более подробные сведения о том, как работает ультразвуковой датчик, вы можете проверить мой конкретный урок для этого. В разделе loop мы видим, что происходит при нажатии кнопок выбора единиц измерения, а также кнопки Назад.

//===== getDistance() - Пользовательская функция
void getDistance() {
  // Очищает trigPin
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  // Устанавливает trigPin в HIGH на 10 микросекунд
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  // Считывает echoPin, возвращает время распространения звуковой волны в микросекундах
  duration = pulseIn(echoPin, HIGH);
  // Вычисление расстояния
  distanceCm= duration*0.034/2;
  distanceInch= distanceCm/2.53;
  // Вывод расстояния в сантиметрах
  if (selectedUnit == '0' && distanceCm <=400) {
    myGLCD.setFont(SevenSegNumFont);
    myGLCD.setColor(0, 255, 0);
    myGLCD.setBackColor(0, 0, 0);
    myGLCD.printNumI(distanceCm,130, 145, 3,'0');
    myGLCD.setFont(BigFont);
    myGLCD.print("cm ", 235, 178);
  }
  // Вывод расстояния в дюймах
  if (selectedUnit == '1' && distanceCm <=160) {
    myGLCD.setFont(SevenSegNumFont);
    myGLCD.setColor(0, 255, 0);
    myGLCD.setBackColor(0, 0, 0);
    myGLCD.printNumI(distanceInch,130, 145, 3,'0');
    myGLCD.setFont(BigFont);
    myGLCD.print("inch", 235, 178);
  }
  delay(10);
}Язык кода: Arduino (arduino)

Хорошо, дальше идет пример управления RGB LED. Если нажать вторую кнопку, пользовательская функция drawLedControl() будет вызвана только один раз для отрисовки графики этого примера, а пользовательская функция setLedColor() будет вызываться повторно. В этой функции мы используем сенсорный экран для установки значений 3 ползунков от 0 до 255. С помощью операторов if мы ограничиваем область каждого ползунка и получаем значение X ползунка. Значения координаты X каждого ползунка находятся в диапазоне от 38 до 310 пикселей, и нам нужно отобразить эти значения в диапазон от 0 до 255, который будет использоваться как PWM-сигнал для включения светодиода. Если вам нужны более подробные сведения о том, как работает RGB-светодиод с Arduino, вы можете проверить мой конкретный урок для этого. Остальной код в этой пользовательской функции предназначен для рисования ползунков. В разделе loop у нас есть только кнопка Назад, которая также выключает светодиод при нажатии.

//============= setLedColor() - Пользовательская функция
void setLedColor() {
  if (myTouch.dataAvailable()) {
    myTouch.read();
    x=myTouch.getX(); y=myTouch.getY();
    // Область красного ползунка
    if( (y>=130) && (y<=156)) {
      xR=x; // Сохраняет значение X, где был нажат экран, в переменную xR
      if (xR<=38) { xR=38; } // Ограничивает область ползунка выше 38 пикселей
      if (xR>=303){ xR=303; } // Ограничивает область ползунка ниже 310 пикселей
    }
    // Область зеленого ползунка
    if( (y>=170) && (y<=196)) {
      xG=x;
      if (xG<=38) { xG=38; }
      if (xG>=303){ xG=303; }
    }
    // Область синего ползунка
    if( (y>=210) && (y<=236)) {
      xB=x;
      if (xB<=38) { xB=38; }
      if (xB>=303){ xB=303; }
    }
  }
  // Отображает значения оси X от 38 к 0 и 310 к 255, потому что нам нужны значения от 0 до 255 для включения светодиода
  int xRC = map(xR,38,310,0,255);
  int xGC = map(xG,38,310,0,255);
  int xBC = map(xB,38,310,0,255);
  // Отправляет PWM-сигнал на выводы светодиода
  analogWrite(redLed, xRC);
  analogWrite(greenLed, xGC);
  analogWrite(blueLed, xBC);
  // Рисует прямоугольник с последней комбинацией цветов
  myGLCD.setColor(xRC, xGC, xBC);
  myGLCD.fillRoundRect(175, 87, 310, 119);
  // Рисует ползунки
  myGLCD.setColor(255, 255, 255);
  myGLCD.fillRect(xR,139,(xR+4),147); // Ползунок
  myGLCD.setColor(xRC, 0, 0);
  myGLCD.fillRect(31, 139, (xR-1), 147);
  myGLCD.setColor(0, 0, 0);
  myGLCD.fillRect((xR+5), 139, 309, 147);
  myGLCD.setColor(255, 255, 255);
  myGLCD.fillRect(xG,179,(xG+4),187);
  myGLCD.setColor(0, xGC, 0);
  myGLCD.fillRect(31, 179, (xG-1), 187);
  myGLCD.setColor(0, 0, 0);
  myGLCD.fillRect((xG+5), 179, 309, 187);
  myGLCD.setColor(255, 255, 255);
  myGLCD.fillRect(xB,219,(xB+4),227);
  myGLCD.setColor(0, 0, xBC);
  myGLCD.fillRect(31, 219, (xB-1), 227);
  myGLCD.setColor(0, 0, 0);
  myGLCD.fillRect((xB+5), 219, 309, 227);
}Язык кода: Arduino (arduino)

Далее идет пример игры на Arduino, но я оставлю его для следующего урока, чтобы мы могли лучше его понять, так как он немного сложнее.

Полный исходный код программы

Чтобы код работал и компилировался, вам придется включить дополнительный файл ".c" в тот же каталог, что и скетч Arduino. Этот файл нужен для третьего игрового примера и представляет собой битмап птицы. Для получения более подробной информации о том, как работает эта часть кода, вы можете проверить мой конкретный урок. Здесь вы можете скачать этот файл:

Урок Arduino: TFT LCD сенсорный экран — пошаговое руководство

Файлы урока Arduino TFT

1 файл(ов) 6.07 KB Скачать

Вот полный исходный код программы:

/* Arduino TFT Tutorial
 * Program made by Dejan Nedelkovski,
 * www.HowToMechatronics.com
 */
/* This program uses the UTFT and URTouch libraries
 * made by Henning Karlsen.
 * You can find and download them at:
 * www.RinkyDinkElectronics.com
 */
#include <UTFT.h>
#include <URTouch.h>
//==== Создание объектов
UTFT myGLCD(SSD1289,38,39,40,41); // Параметры должны быть адаптированы к вашей модели дисплея/шилда
URTouch myTouch( 6, 5, 4, 3, 2);
//==== Определение переменных
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t SevenSegNumFont[];
extern unsigned int bird01[0x41A];
int x, y;
char currentPage, selectedUnit;
// Ультразвуковой датчик
const int VCC = 13;
const int trigPin = 11;
const int echoPin = 12;
long duration;
int distanceInch, distanceCm;
// RGB светодиоды
const int redLed = 10;
const int greenLed = 9;
const int blueLed = 8;
int xR=38; int xG=38; int xB=38;
// Floppy Bird
int xP = 319; int yP = 100; int yB = 30;
int fallRateInt = 0; float fallRate =0; int score=0;
const int button = 14; int buttonState = 0;

void setup() {
  // Начальная настройка
  myGLCD.InitLCD();
  myGLCD.clrScr();
  myTouch.InitTouch();
  myTouch.setPrecision(PREC_MEDIUM);
  // Определение режимов пинов
  pinMode(VCC, OUTPUT); // VCC
  pinMode(trigPin, OUTPUT); // trigPin как выход
  pinMode(echoPin, INPUT); // echoPin как вход
  pinMode(redLed, OUTPUT);
  pinMode(greenLed, OUTPUT);
  pinMode(blueLed, OUTPUT);
  pinMode(button, INPUT);
  digitalWrite(VCC, HIGH); // +5V - Пин 13 как VCC
  drawHomeScreen(); // Рисует главный экран
  currentPage = '0'; // Указывает, что мы на главном экране
  selectedUnit = '0'; // Указывает выбранную единицу для первого примера, см или дюймы
}

void loop() {
  // Главный экран
  if (currentPage == '0') {
    if (myTouch.dataAvailable()) {
      myTouch.read();
      x=myTouch.getX(); // Координата X, где был нажат экран
      y=myTouch.getY(); // Координата Y, где был нажат экран
      // Если нажата кнопка датчика расстояния
      if ((x>=35) && (x<=285) && (y>=90) && (y<=130)) {
        drawFrame(35, 90, 285, 130); // Пользовательская функция - подсвечивает кнопку при нажатии
        currentPage = '1'; // Указывает, что мы на первом примере
        myGLCD.clrScr(); // Очищает экран
        drawDistanceSensor(); // Вызывается только один раз
      }
      // Если нажата кнопка управления RGB LED
      if ((x>=35) && (x<=285) && (y>=140) && (y<=180)) {
        drawFrame(35, 140, 285, 180);
        currentPage = '2';
        myGLCD.clrScr();
        drawLedControl();
      }
      // Если нажата кнопка игры Birduino
      if ((x>=35) && (x<=285) && (y>=190) && (y<=230)) {
        drawFrame(35, 190, 285, 230);
        currentPage = '3';
        myGLCD.clrScr();
        myGLCD.setColor(114, 198, 206);
        myGLCD.fillRect(0,0,319,239);
        drawGround();
        drawPilars(xP,yP);
        drawBird(30);
        delay(1000);
      }
    }
  }
  // Пример датчика расстояния
  if (currentPage == '1') {
    getDistance(); // Получает расстояние от датчика
    if (myTouch.dataAvailable()) {
      myTouch.read();
      x=myTouch.getX(); y=myTouch.getY();
      // Если нажата кнопка сантиметров
      if ((x>=10) && (x<=135) &&(y>=90) && (y<=163)) { selectedUnit = '0'; }
      // Если нажата кнопка дюймов
      if ((x>=10) && (x<=135) &&(y>=173) && (y<=201)) { selectedUnit = '1'; }
      // Если нажата кнопка Назад
      if ((x>=10) && (x<=60) &&(y>=10) && (y<=36)) {
        drawFrame(10, 10, 60, 36);
        currentPage = '0'; myGLCD.clrScr(); drawHomeScreen();
      }
    }
  }
  // Управление RGB LED
  if (currentPage == '2') {
    setLedColor();
    if (myTouch.dataAvailable()) {
      myTouch.read(); x=myTouch.getX(); y=myTouch.getY();
      // Кнопка Назад
      if ((x>=10) && (x<=60) &&(y>=10) && (y<=36)) {
        drawFrame(10, 10, 60, 36);
        currentPage = '0'; myGLCD.clrScr(); drawHomeScreen();
        analogWrite(redLed, 0); analogWrite(greenLed, 0); analogWrite(blueLed, 0);
      }
    }
  }
  //==== Этот раздел кода для игрового примера объясняется в следующем уроке
  // Игра Birduino
  if (currentPage == '3') {
    //delay(1);
    xP=xP-3; drawPilars(xP, yP);
    yB+=fallRateInt; fallRate=fallRate+0.4; fallRateInt= int(fallRate);
    if (yB>=220) { yB=220; }
    if(yB>=180 || yB<=0){ restartGame(); }
    if((xP<=85) && (xP>=30) && (yB<=yP-2)){ restartGame(); }
    if((xP<=85) && (xP>=30) && (yB>=yP+60)){ restartGame(); }
    drawBird(yB);
    if (xP<=-51){ xP=319; yP = rand() % 100+20; score++; }
    if (myTouch.dataAvailable()) {
      myTouch.read(); x=myTouch.getX(); y=myTouch.getY();
      if ((x>=0) && (x<=319) &&(y>=50) && (y<=239)) { fallRate=-5; }
    }
    buttonState = digitalRead(button);
    if (buttonState == HIGH) { fallRate=-5; }
  }
  if (myTouch.dataAvailable()) {
    myTouch.read(); x=myTouch.getX(); y=myTouch.getY();
    if ((x>=10) && (x<=60) &&(y>=10) && (y<=36)) {
      drawFrame(10, 10, 60, 36);
      currentPage = '0'; myGLCD.clrScr(); drawHomeScreen();
      analogWrite(redLed, 0); analogWrite(greenLed, 0); analogWrite(blueLed, 0);
    }
  }
}

// ====== Пользовательские функции ======
// drawHomeScreen - Пользовательская функция
void drawHomeScreen() {
  // Заголовок
  myGLCD.setBackColor(0,0,0); myGLCD.setColor(255, 255, 255); myGLCD.setFont(BigFont);
  myGLCD.print("Arduino TFT Tutorial", CENTER, 10);
  myGLCD.setColor(255, 0, 0); myGLCD.drawLine(0,32,319,32);
  myGLCD.setColor(255, 255, 255); myGLCD.setFont(SmallFont);
  myGLCD.print("by HowToMechatronics.com", CENTER, 41);
  myGLCD.setFont(BigFont); myGLCD.print("Select Example", CENTER, 64);
  // Кнопка - Датчик расстояния
  myGLCD.setColor(16, 167, 103); myGLCD.fillRoundRect (35, 90, 285, 130);
  myGLCD.setColor(255, 255, 255); myGLCD.drawRoundRect (35, 90, 285, 130);
  myGLCD.setFont(BigFont); myGLCD.setBackColor(16, 167, 103);
  myGLCD.print("DISTANCE SENSOR", CENTER, 102);
  // Кнопка - Управление RGB LED
  myGLCD.setColor(16, 167, 103); myGLCD.fillRoundRect (35, 140, 285, 180);
  myGLCD.setColor(255, 255, 255); myGLCD.drawRoundRect (35, 140, 285, 180);
  myGLCD.setFont(BigFont); myGLCD.setBackColor(16, 167, 103);
  myGLCD.print("RGB LED CONTROL", CENTER, 152);
  // Кнопка - Birduino
  myGLCD.setColor(16, 167, 103); myGLCD.fillRoundRect (35, 190, 285, 230);
  myGLCD.setColor(255, 255, 255); myGLCD.drawRoundRect (35, 190, 285, 230);
  myGLCD.setFont(BigFont); myGLCD.setBackColor(16, 167, 103);
  myGLCD.print("BIRDUINO GAME", CENTER, 202);
}

// Подсвечивает кнопку при нажатии
void drawFrame(int x1, int y1, int x2, int y2) {
  myGLCD.setColor(255, 0, 0); myGLCD.drawRoundRect (x1, y1, x2, y2);
  while (myTouch.dataAvailable()) myTouch.read();
  myGLCD.setColor(255, 255, 255); myGLCD.drawRoundRect (x1, y1, x2, y2);
}

//====================================================
void drawDistanceSensor() {
  myGLCD.setColor(100, 155, 203); myGLCD.fillRoundRect (10, 10, 60, 36);
  myGLCD.setColor(255, 255, 255); myGLCD.drawRoundRect (10, 10, 60, 36);
  myGLCD.setFont(BigFont); myGLCD.setBackColor(100, 155, 203); myGLCD.print("<-", 18, 15);
  myGLCD.setBackColor(0, 0, 0); myGLCD.setFont(SmallFont);
  myGLCD.print("Back to Main Menu", 70, 18);
  myGLCD.setFont(BigFont); myGLCD.print("Ultrasonic Sensor", CENTER, 50);
  myGLCD.print("HC-SR04", CENTER, 76);
  myGLCD.setColor(255, 0, 0); myGLCD.drawLine(0,100,319,100);
  myGLCD.setBackColor(0, 0, 0); myGLCD.setColor(255, 255, 255); myGLCD.setFont(SmallFont);
  myGLCD.print("Select Unit", 10, 114); myGLCD.setFont(BigFont);
  myGLCD.print("Distance:", 130, 120);
  myGLCD.setColor(223, 77, 55); myGLCD.fillRoundRect (10, 135, 90, 163);
  myGLCD.setColor(225, 255, 255); myGLCD.drawRoundRect (10, 135, 90, 163);
  myGLCD.setBackColor(223, 77, 55); myGLCD.setColor(255, 255, 255); myGLCD.print("cm", 33, 140);
  myGLCD.setColor(223, 77, 55); myGLCD.fillRoundRect (10, 173, 90, 201);
  myGLCD.setColor(255, 255, 255); myGLCD.drawRoundRect (10, 173, 90, 201);
  myGLCD.setBackColor(223, 77, 55); myGLCD.setColor(255, 255, 255); myGLCD.print("inch", 17, 180);
  myGLCD.setBackColor(0, 0, 0); myGLCD.setFont(SmallFont);
  myGLCD.print("Source code at: HowToMechatronics.com", CENTER, 220);
}

//====================================================
//===== getDistance - Пользовательская функция
void getDistance() {
  digitalWrite(trigPin, LOW); delayMicroseconds(2);
  digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distanceCm= duration*0.034/2; distanceInch= distanceCm/2.53;
  if (selectedUnit == '0' && distanceCm <=400) {
    myGLCD.setFont(SevenSegNumFont); myGLCD.setColor(0, 255, 0); myGLCD.setBackColor(0, 0, 0);
    myGLCD.printNumI(distanceCm,130, 145, 3,'0'); myGLCD.setFont(BigFont); myGLCD.print("cm ", 235, 178);
  }
  if (selectedUnit == '1' && distanceCm <=160) {
    myGLCD.setFont(SevenSegNumFont); myGLCD.setColor(0, 255, 0); myGLCD.setBackColor(0, 0, 0);
    myGLCD.printNumI(distanceInch,130, 145, 3,'0'); myGLCD.setFont(BigFont); myGLCD.print("inch", 235, 178);
  }
  delay(10);
}

//====================================================
void drawLedControl() {
  myGLCD.setColor(100, 155, 203); myGLCD.fillRoundRect (10, 10, 60, 36);
  myGLCD.setColor(255, 255, 255); myGLCD.drawRoundRect (10, 10, 60, 36);
  myGLCD.setFont(BigFont); myGLCD.setBackColor(100, 155, 203); myGLCD.print("<-", 18, 15);
  myGLCD.setBackColor(0, 0, 0); myGLCD.setFont(SmallFont); myGLCD.print("Back to Main Menu", 70, 18);
  myGLCD.setFont(BigFont); myGLCD.print("RGB LED Control", CENTER, 50);
  myGLCD.print("LED Color:", 10, 95); myGLCD.print("R", 10, 135); myGLCD.print("G", 10, 175); myGLCD.print("B", 10, 215);
  myGLCD.setColor(255, 0, 0); myGLCD.drawLine(0,75,319,75);
  myGLCD.setColor(255, 255, 255); myGLCD.drawRect(30, 138, 310, 148); // R - Ползунок
  myGLCD.drawRect(30, 178, 310, 188); myGLCD.drawRect(30, 218, 310, 228);
}

//====================================================
//============= setLedColor() - Пользовательская функция
void setLedColor() {
  if (myTouch.dataAvailable()) {
    myTouch.read(); x=myTouch.getX(); y=myTouch.getY();
    if( (y>=130) && (y<=156)) { xR=x; if (xR<=38) xR=38; if (xR>=303) xR=303; }
    if( (y>=170) && (y<=196)) { xG=x; if (xG<=38) xG=38; if (xG>=303) xG=303; }
    if( (y>=210) && (y<=236)) { xB=x; if (xB<=38) xB=38; if (xB>=303) xB=303; }
  }
  int xRC = map(xR,38,310,0,255); int xGC = map(xG,38,310,0,255); int xBC = map(xB,38,310,0,255);
  analogWrite(redLed, xRC); analogWrite(greenLed, xGC); analogWrite(blueLed, xBC);
  myGLCD.setColor(xRC, xGC, xBC); myGLCD.fillRoundRect(175, 87, 310, 119);
  myGLCD.setColor(255, 255, 255); myGLCD.fillRect(xR,139,(xR+4),147);
  myGLCD.setColor(xRC, 0, 0); myGLCD.fillRect(31, 139, (xR-1), 147);
  myGLCD.setColor(0, 0, 0); myGLCD.fillRect((xR+5), 139, 309, 147);
  myGLCD.setColor(255, 255, 255); myGLCD.fillRect(xG,179,(xG+4),187);
  myGLCD.setColor(0, xGC, 0); myGLCD.fillRect(31, 179, (xG-1), 187);
  myGLCD.setColor(0, 0, 0); myGLCD.fillRect((xG+5), 179, 309, 187);
  myGLCD.setColor(255, 255, 255); myGLCD.fillRect(xB,219,(xB+4),227);
  myGLCD.setColor(0, 0, xBC); myGLCD.fillRect(31, 219, (xB-1), 227);
  myGLCD.setColor(0, 0, 0); myGLCD.fillRect((xB+5), 219, 309, 227);
}

//====================================================
void drawGround() {
  myGLCD.setColor(221,216,148); myGLCD.fillRect(0, 215, 319, 239);
  myGLCD.setColor(47,175,68); myGLCD.fillRect(0, 205, 319, 214);
  myGLCD.setColor(0, 0, 0); myGLCD.setBackColor(221, 216, 148); myGLCD.setFont(BigFont);
  myGLCD.print("Score:",5,220); myGLCD.setFont(SmallFont); myGLCD.print("HowToMechatronics.com", 140, 220);
}

void drawPilars(int x, int y) {
  if (x>=270){
    myGLCD.setColor(0, 200, 20); myGLCD.fillRect(318, 0, x, y-1);
    myGLCD.setColor(0, 0, 0); myGLCD.drawRect(319, 0, x-1, y);
    myGLCD.setColor(0, 200, 20); myGLCD.fillRect(318, y+81, x, 203);
    myGLCD.setColor(0, 0, 0); myGLCD.drawRect(319, y+80, x-1, 204);
  } else if( x<=268) {
    myGLCD.setColor(114, 198, 206); myGLCD.fillRect(x+51, 0, x+53, y);
    myGLCD.setColor(0, 200, 20); myGLCD.fillRect(x+49, 1, x+1, y-1);
    myGLCD.setColor(0, 0, 0); myGLCD.drawRect(x+50, 0, x, y);
    myGLCD.setColor(114, 198, 206); myGLCD.fillRect(x-1, 0, x-3, y);
    myGLCD.setColor(114, 198, 206); myGLCD.fillRect(x+51, y+80, x+53, 204);
    myGLCD.setColor(0, 200, 20); myGLCD.fillRect(x+49, y+81, x+1, 203);
    myGLCD.setColor(0, 0, 0); myGLCD.drawRect(x+50, y+80, x, 204);
    myGLCD.setColor(114, 198, 206); myGLCD.fillRect(x-1, y+80, x-3, 204);
  }
  myGLCD.setColor(0, 0, 0); myGLCD.setBackColor(221, 216, 148); myGLCD.setFont(BigFont);
  myGLCD.printNumI(score, 100, 220);
}

//====================================================
void drawBird(int y) {
  if(y<=219) {
    myGLCD.drawBitmap (50, y, 35, 30, bird01);
    myGLCD.setColor(114, 198, 206);
    myGLCD.fillRoundRect(50,y,85,y-6); myGLCD.fillRoundRect(50,y+30,85,y+36);
  } else if(y>=200) {
    myGLCD.drawBitmap (50, 200, 35, 30, bird01);
    myGLCD.setColor(114, 198, 206);
    myGLCD.fillRoundRect(50,200,85,200-6); myGLCD.fillRoundRect(50,200+30,85,200+36);
  }
}

void gameOver() {
  myGLCD.clrScr(); myGLCD.setColor(255, 255, 255); myGLCD.setBackColor(0, 0, 0); myGLCD.setFont(BigFont);
  myGLCD.print("GAME OVER", CENTER, 40); myGLCD.print("Score:", 100, 80); myGLCD.printNumI(score,200, 80);
  myGLCD.print("Restarting...", CENTER, 120); myGLCD.setFont(SevenSegNumFont); myGLCD.printNumI(2,CENTER, 150); delay(1000);
  myGLCD.printNumI(1,CENTER, 150); delay(1000);
  myGLCD.setColor(114, 198, 206); myGLCD.fillRect(0,0,319,239); drawBird(30); drawGround(); delay(1000);
}

//====================================================
void restartGame() { delay(1000); gameOver(); xP=319; yB=30; fallRate=0; score=0; }
Язык кода: Arduino (arduino)

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

  1. Создание надежного RFID-замка на Arduino — пошаговое руководство
  2. Создание портативного ёмкостного сенсорного пианино на Arduino: пошаговое руководство
  3. Создание анимации и игр на LCD 16×2 с Arduino UNO
  4. Вывод изображений на 1.17-дюймовый TFT LCD с Arduino UNO
  5. Вывод BMP‑изображений с SD‑карты на TFT LCD Shield 2.4″ для Arduino
  6. Решение проблем с сенсорным экраном TFT LCD Shield 2.4″ для Arduino
  7. Надежная погодная станция на Arduino с датчиками DHT
  8. Проект датчика отпечатков пальцев на Arduino Nano – Пошаговое руководство
  9. DIY-проект Arduino LCD: сборка с резисторами, кнопкой и дисплеем 16x2
  10. Урок Arduino для начинающих 01: Начало работы с первым проектом