Назад

Демонстрация TFT-дисплея ILI9341: графика и анимация мяча на Arduino

Введение

Цветные TFT-дисплеи — отличный способ добавить насыщенную визуальную обратную связь в ваши проекты на Arduino. В этом руководстве мы будем управлять TFT-дисплеем 240x320 на базе ILI9341 с помощью библиотек Adafruit ILI9341 и Adafruit GFX. Вы узнаете, как подключить дисплей, установить необходимые библиотеки и написать код, который рисует статические элементы интерфейса и анимирует прыгающий мяч. Всё это работает прямо в вашем браузере с симулятором Velxio — никакого оборудования не требуется!

Обзор схемы

Давайте начнём с изучения схемы. Она проста: Arduino Uno общается с дисплеем ILI9341 по интерфейсу SPI (Serial Peripheral Interface).

Схема подключения TFT-дисплея на холсте симулятора Velxio

Вот полный список подключений:

Пин Arduino UnoПин TFT ILI9341Цвет провода
13 (SCK)SCKОранжевый
11 (MOSI)MOSIОранжевый
10 (CS)CSСиний
9 (D/C)D/CЗелёный
8 (RST)RSTКрасный
7 (LED)LEDБелый
5VVCC(не показано, подразумевается)
GNDGND(не показано, подразумевается)

Внешние компоненты не требуются — дисплей работает с логикой 5 В (большинство модулей ILI9341 совместимы с 5 В), а пины SPI подключены напрямую.

Обзор кода

Теперь давайте разберём код. Мы будем использовать библиотеку Adafruit ILI9341 вместе с библиотекой Adafruit GFX для графических примитивов. Эти библиотеки необходимо установить через Менеджер библиотек.

Окно Менеджера библиотек с библиотеками, используемыми для TFT-дисплея

Откройте Менеджер библиотек (Tools > Manage Libraries) и найдите “Adafruit ILI9341” и “Adafruit GFX Library”. Установите обе. Библиотека SPI подключается автоматически.

Вот полный код:

// TFT ILI9341 Display Demo (240x320)
// Library: Adafruit ILI9341 + Adafruit GFX
// Connect: CS=10, DC/RS=9, RST=8, LED=7, MOSI=11(SPI), SCK=13(SPI)

#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <SPI.h>

#define TFT_CS   10
#define TFT_DC    9
#define TFT_RST   8
#define TFT_LED   7

Adafruit_ILI9341 tft(TFT_CS, TFT_DC, TFT_RST);

// Background color: blue (visible on dark simulator canvas)
#define BG_COLOR 0x001F

// Ball state
int ballX = 120, ballY = 200;
int ballDX = 3, ballDY = 2;
const int BALL_R = 10;

// Play-field boundaries
const int FX = 5, FY = 110, FW = 230, FH = 200;

void drawStaticUI() {
  tft.fillScreen(BG_COLOR);

  // Title
  tft.setTextSize(3);
  tft.setTextColor(tft.color565(255, 220, 0));
  tft.setCursor(20, 10);
  tft.print("VELXIO TFT");

  // Subtitle
  tft.setTextSize(2);
  tft.setTextColor(tft.color565(180, 180, 255));
  tft.setCursor(30, 50);
  tft.print("ILI9341 Demo");

  // Color palette bars
  tft.fillRect(10, 82, 70, 18, tft.color565(220, 50, 50));
  tft.fillRect(85, 82, 70, 18, tft.color565(50, 200, 50));
  tft.fillRect(160, 82, 70, 18, tft.color565(50, 100, 240));

  // Play-field border
  tft.drawRect(FX, FY, FW, FH, tft.color565(80, 80, 130));
}

void setup() {
  pinMode(TFT_LED, OUTPUT);
  digitalWrite(TFT_LED, HIGH);

  tft.begin();
  drawStaticUI();
}

void loop() {
  // Erase old ball
  tft.fillCircle(ballX, ballY, BALL_R, BG_COLOR);

  // Update position
  ballX += ballDX;
  ballY += ballDY;

  // Bounce off field borders
  if (ballX < FX + BALL_R + 1 || ballX > FX + FW - BALL_R - 1) ballDX = -ballDX;
  if (ballY < FY + BALL_R + 1 || ballY > FY + FH - BALL_R - 1) ballDY = -ballDY;

  // Draw ball
  tft.fillCircle(ballX, ballY, BALL_R, tft.color565(255, 140, 0));

  delay(30);
}

Ключевые моменты в коде

Ключевые концепции для студентов

  1. Связь по SPI: Дисплей использует SPI — синхронный последовательный протокол. Arduino является ведущим устройством, дисплей — ведомым. Для передачи данных нужны только три провода (SCK, MOSI, CS); D/C и RST — дополнительные линии управления.
  2. Графические примитивы: Библиотека Adafruit GFX предоставляет функции, такие как fillScreen(), fillRect(), drawRect(), fillCircle(), setCursor(), print() и setTextSize(). Они упрощают рисование фигур и текста.
  3. Двойная буферизация (концепция): Мы стираем старый мяч перед рисованием нового. Это предотвращает размазывание. В более сложных проектах можно использовать кадровый буфер.
  4. Обнаружение столкновений: Логика прыгающего мяча проверяет, находится ли центр мяча на расстоянии BALL_R пикселей от границы. Если да, направление меняется на противоположное.
  5. Глубина цвета: ILI9341 поддерживает 262K цветов (18 бит), но библиотека использует 16 бит (65K цветов) для скорости. color565() упаковывает RGB в формат 5-6-5 бит.

Частые ошибки и советы по отладке

Предлагаемые расширения

Когда базовый демонстрационный проект заработает, попробуйте эти улучшения:

Попробуйте сами!

Готовы увидеть это в действии? Откройте живой пример в Velxio и нажмите кнопку Run.

Панель инструментов редактора Velxio с кнопками компиляции и запуска

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

Панель инструментов холста Velxio над окном симуляции

Если вы хотите собрать это с нуля, используйте панель выбора компонентов, чтобы добавить Arduino Uno и дисплей ILI9341.

Панель выбора компонентов Velxio с просмотром деталей по категориям

Нажмите на ссылку ниже, чтобы открыть пример и начать экспериментировать:

Открыть демонстрацию TFT-дисплея ILI9341 на Velxio

Удачного программирования!


Поделиться:
David Montero

Автор

David Montero

Creator of Velxio, the open-source circuit and Arduino simulator.

GitHub velxio.dev

Похожие статьи


Предыдущая статья
LCD 20x4 с Arduino: Hello World в Velxio
Следующая статья
Создаем игру Simon Says на Arduino с Velxio