Этот учебник является частью: ESP32-S3 RGB LED матрица
Замечательный проект для создания развлекательных и практических приложений с использованием модуля RGB-матрицы ESP32-S3. Ссылки на другие видеоролики находятся ниже этой статьи.
Проект RGB LED матрицы ESP32-S3 4 - Наклоненная точка
Проект 4 - Наклонная точка (Перемещение точки путем наклона матрицы RGB LED ESP32-S3)
Проект 4 представляет собой датчик движения, встроенный в модуль RGB LED Matrix на базе ESP32-S3. Вместо того чтобы автоматически перемещать точку (как в Проекте 1) или прокручивать текст (Проекты 2 и 3), этот проект позволяет вам контролировать положение точки, просто наклоняя плату. Точка плавно перемещается по 8×8 RGB дисплею на основе данных в реальном времени от акселерометра QMI8658C, расположенного на обратной стороне модуля.
Все шесть проектов в этой серии продемонстрированы в одном видео на YouTube. То же видео встроено на этой странице, так что вы можете увидеть, как точка движется в реальном времени по мере наклона доски. Полный код для этого проекта автоматически загружается ниже статьи, а партнерские ссылки для модуля появляются под разделом кода.


Обзор модуля RGB LED матрицы ESP32-S3
Этот проект использует модуль RGB LED матрицы ESP32-S3, который включает в себя:

- Микроконтроллер ESP32-S3с Wi-Fi и Bluetooth
- 8×8 RGB светодиодная матрица(64 индивидуально настраиваемых светодиодов)
- QMI8658C акселерометрна задней стороне для наклона и обнаружения движения
- USB-портдля программирования и питания
- Кнопки загрузки / сброса
- Используемые контакты GPIOдля будущего расширения
Датчик QMI8658C считываетX,Y, иZзначения ускорения и ориентации, позволяющие точке перемещаться вверх/вниз/влево/вправо в зависимости от наклона доски.:contentReference[oaicite:0]{index=0}

Проекты, включенные в видео (временные метки)
- 00:00- Введение
- 02:01- Установка плат ESP32
- 03:32- Установка библиотек
- 05:32- Проект 1: Движущаяся Точка
- 11:11- Проект 2: Прокрутка текста
- 12:59- Проект 3: HTTP Текст
- 16:41-Проект 4: Tilt Dot (этот проект)
- 18:55Проект 5: Стрелка вверх
- 20:02- Проект 6: Игра-цель
Рекомендуется посмотреть демонстрацию наклона в видео, так как вы можете увидеть, как точка плавно реагирует на ориентацию доски.:contentReference[oaicite:1]{index=1}

Установка плат ESP32 в Arduino IDE
Если вы завершили любой предыдущий проект, поддержка платы уже установлена. В противном случае выполните следующие шаги:
- Открыть
File > Preferences→ Добавить URL плат ESP32. - Идти к
Tools > Board > Boards Manager…и установитьESP32. - Выберите вашу плату ESP32-S3 в разделе
Tools > Board. - Выберите правильный COM-порт под
Tools > Port.
Установка необходимых библиотек
Этот проект требует следующие библиотеки:
Adafruit NeoMatrixAdafruit NeoPixelAdafruit GFX LibraryQMI8658(датчик движения)
Установите их в Диспетчере библиотек:
- Открыть
Sketch > Include Library > Manage Libraries…. - Поиск заAdafruit NeoMatrix→ Установить.
- Разрешить автоматическую установкуAdafruit GFXиAdafruit NeoPixel.
- Поиск заQMI8658по указанному автору → Установить.:contentReference[oaicite:2]{index=2}
Как работает Проект 4
Датчик QMI8658C непрерывно предоставляет данные о ускорении вдоль осей X, Y и Z. Для этого проекта мы используем только оси X и Y для принятия решений:
- Насколько далеко переместить точку влево или вправо (по оси X)
- Насколько далеко нужно переместить точку вверх или вниз (ось Y)
Значения сенсоров отображаются в диапазоне координат от 0 до 7 (для матрицы LED 8×8). Положение точки обновляется много раз в секунду, создавая плавный эффект скольжения при наклоне модуля.:contentReference[oaicite:3]{index=3}
Проект 4 - Настройки кода (Tilt Dot)
Ниже находятся настраиваемые пользователем параметры, расположенные в верхней части кода проекта. Полная схема появляется под статьей автоматически.
Матрица Пин и размер
// 8×8 RGB matrix configuration
const int MATRIX_PIN = 14; // fixed pin for this board
const int MATRIX_WIDTH = 8;
const int MATRIX_HEIGHT = 8;
УйтиMATRIX_PINв14Он жестко интегрирован с бортовой матрицей.
Яркость
// Overall brightness (0–255)
uint8_t matrixBrightness = 40;
Увеличьте, если необходимо, но избегайте экстремальной яркости при просмотре вблизи.
Цвет точки
// Dot color (R, G, B)
uint8_t dotRed = 0;
uint8_t dotGreen = 200; // light green (default)
uint8_t dotBlue = 0;
Измените эти значения, чтобы создать любой цвет. Примеры:
- Красный:
(255, 0, 0) - Желтый:
(255, 255, 0) - Белый:
(255, 255, 255)
Чувствительность к движению
Чтобы предотвратить резкие скачки, значения акселерометра обычно ограничиваются или масштабируются. Типичная настройка выглядит следующим образом:
// How aggressively tilt affects movement
float sensitivity = 4.0f; // larger = faster movement across screen
Если точка движется слишком медленно → увеличьте значение. Если точка движется слишком резко → уменьшите его.
Скорость обновления (Частота обновления)
Вы можете добавить небольшую задержку между обновлениями, чтобы сгладить движение:
// Delay between position updates (ms)
int refreshDelayMs = 20; // lower = smoother and faster response
Значения от 10 до 30 мс ощущаются как очень отзывчивые.
Резюме
Проект 4 активирует встроенный акселерометр QMI8658C ESP32-S3, позволяя вам управлять светодиодной матрицей с помощью физических движений. Небольшой наклон платы перемещает точку в том же направлении, что делает этот проект отличной отправной точкой для более сложных проектов "Стрела вверх" и "Целевая игра".
Полная схема Tilt Dot загружена ниже этой статьи (автоматически). Для лучшего понимания посмотрите демонстрацию наклона в видео, где вы можете увидеть, как плавно движется точка при повороте платы. Ссылки на покупку модуля RGB LED Matrices ESP32-S3 включены в разделе кода.
Этот учебник является частью: ESP32-S3 RGB LED матрица
- Проект матрицы RGB LED ESP32-S3 1 - Основной штрих
- Проект RGB LED матрицы ESP32-S3 2 - Прокручиваемый текст
- Проект RGB LED матрицы ESP32-S3 3 - Текст с мобильного телефона
- Проект матрицы RGB LED на ESP32-S3 5 - Стрелка всегда вверх
- Проект матрицы RGB LED ESP32-S3 6 - Игра цель
- ESP32-S3 RGB LED матрица Wi-Fi + NTP проект часы - 1 базовые часы
- ESP32-S3 RGB светодиодная матрица Интернет-часы - 2-часовой многоцветный дисплей времени и даты
- Проект интернет-часов на матрице RGB LED ESP32-S3 - 3 ночных цвета с датой
- Проект интернет-часов на матрице RGB LED ESP32-S3 - 5 радуга цветов
- Проект интернет-часы с матрицей RGB LED на ESP32-S3 - 4 случайных цвета
- Тест матрицы RGB LED ESP32-S3 для настройки RGB, GRB
/*
* Проект 4: Tilt Dot - RGB LED матрица ESP32-S3 (Waveshare)
*
* Этот скетч считывает наклон с ИМУ QMI8658C и плавно перемещает точку на матрице RGB LED 8×8 в зависимости от ориентации платы.
*
* ▶️ Видеоурок:
* https://youtu.be/JKLuYrRcLMI
*
* 📚⬇️ Ресурсы и страница кода:
* https://robojax.com/RJT829
*
* QMI8658_RGB_2
*/
#include <Arduino.h>
#include <math.h>
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#include <QMI8658.h> // Лахав Гахали
// -------- НАСТРОЙКА СВЕТОДИОДНОЙ МАТРИЦЫ --------
#define MATRIX_PIN 14
#define MATRIX_WIDTH 8
#define MATRIX_HEIGHT 8
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(
MATRIX_WIDTH, MATRIX_HEIGHT, MATRIX_PIN,
NEO_MATRIX_TOP + NEO_MATRIX_LEFT +
NEO_MATRIX_ROWS + NEO_MATRIX_PROGRESSIVE,
NEO_RGB + NEO_KHZ800
);
// -------- УСТАНОВКА IMU QMI8658 --------
QMI8658 imu;
QMI8658_Data imuData;
// -------- НАСТРОЙКИ ПОЛЬЗОВАТЕЛЯ --------
// истина -> точка на противоположной стороне: USB↔OUSB, 34↔15
// ложно -> точка на той же стороне, что и ВВЕРХ
bool useOppositeMapping = false;
// Цвет точки (0-255 каждая)
uint8_t dotRed = 0;
uint8_t dotGreen = 100;
uint8_t dotBlue = 0;
// Боковые стороны
enum Side {
SIDE_CENTER = 0,
SIDE_USB,
SIDE_OUSB,
SIDE_15,
SIDE_34
};
// Положение точки (в пиксельных координатах, но сохраняется как дробное число для облегчения)
float dotPosX = 3.0f; // начать в центре
float dotPosY = 3.0f;
// Фактор сглаживания: меньшее значение = более медленное движение (0.1 очень медленно, 0.5 быстрее)
const float dotSmooth = 0.25f;
bool isFlat = false;
const char* sideName(Side s) {
switch (s) {
case SIDE_CENTER: return "CENTER";
case SIDE_USB: return "USB";
case SIDE_OUSB: return "OUSB";
case SIDE_15: return "15";
case SIDE_34: return "34";
default: return "?";
}
}
// Определите, какая сторона находится ВВЕРХУ, используя откалиброванные оси:
// +X = USB, -X = OUSB, +Y = 34, -Y = 15
Side detectSideUp(float ax_g, float ay_g, float az_g) {
// Обнаружение плоских объектов
const float flatThreshXY = 0.15f;
const float flatThreshZ = 0.15f;
if (fabs(ax_g) < flatThreshXY &&
fabs(ay_g) < flatThreshXY &&
fabs(az_g - 1.0f) < flatThreshZ) {
isFlat = true;
return SIDE_CENTER;
}
isFlat = false;
// Пороговые значения для определения "эта ось действительно наклонена"
const float tiltThreshY = 0.5f;
const float tiltThreshX = 0.5f;
// 1) Предпочитайте ось Y для 15 / 34, если она явно наклонена.
if (fabs(ay_g) >= tiltThreshY) {
if (ay_g > 0) {
return SIDE_15; // +Y = 34 вверх
} else {
return SIDE_34; // -У = 15 вверх
}
}
// 2) В противном случае проверьте ось X на наличие USB / OUSB
if (fabs(ax_g) >= tiltThreshX) {
if (ax_g > 0) {
return SIDE_USB; // +X = USB вверх
} else {
return SIDE_OUSB; // -X = OUSB вверх
}
}
// 3) Если ничего не сильно наклонено, просто назовите это ЦЕНТРОМ
return SIDE_CENTER;
}
// Карта от стороны UP до места, куда должно попасть точка.
Side dotSideFromUpSide(Side upSide) {
switch (upSide) {
case SIDE_USB:
return useOppositeMapping ? SIDE_OUSB : SIDE_USB;
case SIDE_OUSB:
return useOppositeMapping ? SIDE_USB : SIDE_OUSB;
case SIDE_34:
return useOppositeMapping ? SIDE_15 : SIDE_34;
case SIDE_15:
return useOppositeMapping ? SIDE_34 : SIDE_15;
case SIDE_CENTER:
default:
return SIDE_CENTER;
}
}
// Преобразуйте координаты точки в матричные координаты.
void getDotPixel(Side dotSide, int &px, int &py) {
// Матрица (0,0) = верхний левый угол
// верхний центр: (3,0) → USB
// центр внизу: (3,7) → OUSB
// левый центр: (0,3) → 15
// правый центр: (7,3) → 34
// центр: (3,3)
switch (dotSide) {
case SIDE_USB: px = 3; py = 0; break;
case SIDE_OUSB: px = 3; py = 7; break;
case SIDE_15: px = 0; py = 3; break;
case SIDE_34: px = 7; py = 3; break;
case SIDE_CENTER:
default: px = 3; py = 3; break;
}
}
void setup() {
Serial.begin(115200);
delay(500);
matrix.begin();
matrix.setBrightness(20);
matrix.fillScreen(0);
matrix.show();
// IMU: SDA=11, SCL=12 для ESP32-S3-Matrix
if (!imu.begin(11, 12)) {
Serial.println("Failed to initialize QMI8658!");
while (1) { delay(1000); }
}
imu.setAccelUnit_mg(true);
imu.setGyroUnit_dps(true);
imu.setDisplayPrecision(4);
Serial.print("QMI8658 initialized. useOppositeMapping = ");
Serial.println(useOppositeMapping ? "TRUE" : "FALSE");
}
void loop() {
if (!imu.readSensorData(imuData)) {
return;
}
float ax_g = imuData.accelX / 1000.0f;
float ay_g = imuData.accelY / 1000.0f;
float az_g = imuData.accelZ / 1000.0f;
Side upSide = detectSideUp(ax_g, ay_g, az_g);
Side dotSide = dotSideFromUpSide(upSide);
int targetX, targetY;
getDotPixel(dotSide, targetX, targetY);
// --- Плавное движение к цели ---
dotPosX += (targetX - dotPosX) * dotSmooth;
dotPosY += (targetY - dotPosY) * dotSmooth;
// Преобразовать в целые пиксельные координаты
int px = (int)round(dotPosX);
int py = (int)round(dotPosY);
// Зажим на всякий случай
if (px < 0) px = 0;
if (px > 7) px = 7;
if (py < 0) py = 0;
if (py > 7) py = 7;
// --- Нарисовать точку ---
matrix.fillScreen(0);
uint16_t color = matrix.Color(dotRed, dotGreen, dotBlue);
matrix.drawPixel(px, py, color);
matrix.show();
// Отладка
Serial.print("AX="); Serial.print(ax_g, 3);
Serial.print(" AY="); Serial.print(ay_g, 3);
Serial.print(" AZ="); Serial.print(az_g, 3);
Serial.print(" | UP="); Serial.print(sideName(upSide));
Serial.print(" | DOT="); Serial.print(sideName(dotSide));
Serial.print(" | px="); Serial.print(px);
Serial.print(" py="); Serial.println(py);
delay(80);
}
Вещи, которые могут вам понадобиться
-
Амазонка
-
eBay
-
АлиЭкспрессКупить ESP32-S3 RGB-матрицу на AliExpresss.click.aliexpress.com
-
АлиЭкспрессПриобретите ESP32-S3 RGB Matrix на AliExpress (2)s.click.aliexpress.com
Ресурсы и ссылки
-
Внутренний🎨 Инструмент выбора цветаrobojax.com
Файлы📁
Файл Fritzing
-
esp32-S3-supermini-tht часть фритзинга
esp32-S3-supermini-tht.fzpz0.02 MB