This tutorial is part of: Matrix LED ESP32-S3 RGB
Iṣẹ́ àkànṣe láti ṣẹ̀dá fún àwọn ohun èlò ìgbádùn àti ìwúlò nípa lílo module ESP32-S3 RGB Matrix. Àwọn ìjápọ̀ sí àwọn fídíò mìíràn wà ní ìsàlẹ̀ àpilẹ̀kọ yìí.
Iṣẹ́ ESP32-S3 RGB LED Matrix Project 4 - Tilt dot
Ise 4 – Tilt Dot (Gbe Aami Nipasẹ Titẹ ESP32-S3 RGB LED Matrix)
Ise 4 ṣe afihan sensori išipopada ti o wa ninu modulu ESP32-S3 RGB LED Matrix. Dipo gbigbe aami laifọwọyi (bii Ise 1) tabi lilọ ọrọ (Awọn Ise 2 ati 3), ise yii jẹ ki o ṣakoso ipo aami nirọrun nipa titẹ bọọdi naa. Aami naa n gbe laisiyonu kọja ifihan RGB 8×8 da lori awọn kika laaye lati QMI8658C accelerometer ti o wa ni ẹhin modulu naa.
Gbogbo awọn ise mẹfa ni jara yii ni a ṣe afihan ninu fidio YouTube kan. Fidio kanna ni a fi sinu oju-iwe yii, nitorinaa o le rii gangan bi aami ṣe n gbe ni akoko gidi bi bọọdi ṣe n tẹ. Koodu pipe fun ise yii ni a kojọpọ laifọwọyi ni isalẹ nkan naa, ati awọn ọna asopọ rira alabaṣepọ fun modulu naa han labẹ apakan koodu.


ESP32-S3 RGB LED Matrix Module Akopọ
Ise yii lo modulu ESP32-S3 RGB LED Matrix, eyiti o pẹlu:

- ESP32-S3 microcontroller pẹlu Wi-Fi ati Bluetooth
- 8×8 RGB LED matrix (64 LED ti o ni adirẹsi kọọkan)
- QMI8658C accelerometer ni ẹhin fun wiwa titẹ ati išipopada
- Ibufẹ USB fun siseto ati agbara
- Awọn bọtini Boot / Reset
- Awọn pinni GPIO ti o wulo fun imugboroosi iwaju
Sensori QMI8658C ka awọn iye isare X, Y, ati Z ati awọn iye iṣalaye, gbigba aami laaye lati gbe soke/isalẹ/osì/ọtun da lori bi a ṣe tẹ bọọdi naa.:contentReference[oaicite:0]{index=0}

Awọn Ise Ti A Bo ninu Fidio (Awọn Akoko)
- 00:00 – Ifihan
- 02:01 – Fifi sori ẹrọ awọn bọọdi ESP32
- 03:32 – Fifi sori ẹrọ awọn ile-ikawe
- 05:32 – Ise 1: Aami Gbigbe
- 11:11 – Ise 2: Yiyi Ọrọ
- 12:59 – Ise 3: Ọrọ HTTP
- 16:41 – Ise 4: Tilt Dot (ise yii)
- 18:55 – Ise 5: Ọfa Soke
- 20:02 – Ise 6: Ere Ibi-afẹde
Wiwo ifihan titẹ ninu fidio naa jẹ iṣeduro pupọ, nitori o le rii bi aami ṣe n dahun laisiyonu si iṣalaye bọọdi naa.:contentReference[oaicite:1]{index=1}

Fifi sori ẹrọ Awọn Bọọdi ESP32 ni Arduino IDE
Ti o ba ti pari ise eyikeyi ti tẹlẹ, atilẹyin bọọdi ti wa ni fifi sori ẹrọ tẹlẹ. Bibẹẹkọ, tẹle awọn igbesẹ wọnyi:
- Ṣii
File > Preferences→ Fi URL Awọn Bọọdi ESP32 kun. - Lọ si
Tools > Board > Boards Manager…ki o fi ESP32 sori ẹrọ. - Yan bọọdi ESP32-S3 rẹ labẹ
Tools > Board. - Yan ibudo COM ti o tọ labẹ
Tools > Port.
Fifi sori ẹrọ Awọn Ile-ikawe Ti a Beere
Ise yii nilo awọn ile-ikawe wọnyi:
Adafruit NeoMatrixAdafruit NeoPixelAdafruit GFX LibraryQMI8658(sensori išipopada)
Fi wọn sori ẹrọ ninu Oluṣakoso Ile-ikawe:
- Ṣii
Sketch > Include Library > Manage Libraries…. - Wa Adafruit NeoMatrix → Fi sori ẹrọ.
- Gba fifi sori ẹrọ laifọwọyi ti Adafruit GFX ati Adafruit NeoPixel.
- Wa QMI8658 nipasẹ onkọwe ti a ṣe akojọ rẹ → Fi sori ẹrọ.:contentReference[oaicite:2]{index=2}
Bi Ise 4 Ṣe Nṣiṣẹ
Sensori QMI8658C n pese data isare nigbagbogbo pẹlú awọn ipo X, Y, ati Z. Fun ise yii, a lo awọn ipo X ati Y nikan lati pinnu:
- Bi o ṣe jinna lati gbe aami osì tabi ọtun (ipo X)
- Bi o ṣe jinna lati gbe aami soke tabi isalẹ (ipo Y)
Awọn iye sensori ni a ya aworan sinu iwọn ipoidojuko lati 0 si 7 (fun 8×8 LED matrix). Ipo aami n ṣe imudojuiwọn ni ọpọlọpọ igba ni iṣẹju-aaya, fifun ipa sisun didan bi o ṣe n tẹ modulu naa.:contentReference[oaicite:3]{index=3}
Ise 4 – Awọn Eto Koodu (Tilt Dot)
Ni isalẹ ni awọn eto ti olumulo le ṣatunkọ ti o wa nitosi oke koodu ise naa. Apẹrẹ kikun han ni isalẹ nkan naa laifọwọyi.
Pinni Matrix ati Iwọn
// 8×8 RGB matrix iṣeto
const int MATRIX_PIN = 14; // pinni ti o wa titi fun bọọdi yii
const int MATRIX_WIDTH = 8;
const int MATRIX_HEIGHT = 8;
Fi MATRIX_PIN silẹ ni 14. O ti sopọ mọ matrix ti o wa lori bọọdi naa.
Imọlẹ
// Imọlẹ lapapọ (0–255)
uint8_t matrixBrightness = 40;
Pọ si ti o ba nilo, ṣugbọn yago fun imọlẹ pupọ nigbati o n wo ni isunmọtosi.
Awo Aami
// Awo aami (R, G, B)
uint8_t dotRed = 0;
uint8_t dotGreen = 200; // alawọ ewe imọlẹ (aṣayẹwo)
uint8_t dotBlue = 0;
Yi awọn iye wọnyi pada lati ṣẹda eyikeyi awo. Awọn apẹẹrẹ:
- Pupa:
(255, 0, 0) - Ofeefee:
(255, 255, 0) - Funfun:
(255, 255, 255)
Ifamọ Išipopada
Lati ṣe idiwọ awọn fo ti o pọju, awọn iye accelerometer ni a maa n fi si opin tabi ṣe iwọn. Eto aṣoju kan dabi:
// Bawo ni titẹ ṣe n kan išipopada ni agbara
float sensitivity = 4.0f; // tobi = išipopada yiyara kọja iboju
Ti aami ba n gbe laiyara ju → pọ iye naa. Ti aami ba n gbe lojiji ju → dinku rẹ.
Iyara Imudojuiwọn (Oṣuwọn Isọdọtun)
O le wa lati fi idaduro kekere kun laarin awọn imudojuiwọn lati mu išipopada dara:
// Idaduro laarin awọn imudojuiwọn ipo (ms)
int refreshDelayMs = 20; // kere = didan ati idahun yiyara
Awọn iye laarin 10–30 ms yoo ni imọran idahun pupọ.
Akopọ
Ise agbese 4 mu QMI8658C accelerometer ti ESP32-S3 ṣiṣẹ laaye nipa jẹ ki o ṣakoso LED matrix pẹlu išipopada ti ara. Titẹ kekere ti bọọdi naa yoo gbe aami naa ni itọsọna kanna, ti o jẹ ki ise agbese yii jẹ igbesẹ pipe fun awọn ise agbese to gbooro sii bii “Arrow Up” ati “Target Game”.
Kikọ Tilt Dot ni kikun ti wa ni ikojọpọ labẹ nkan yii (laifọwọyi). Fun oye to dara julọ, wo ifihan tilt ninu fidio, nibiti o le rii bi aami naa ṣe n gbe didan nigba ti bọọdi naa ba yipada. Awọn ọna asopọ lati ra ESP32-S3 RGB LED Matrix module wa labẹ apakan koodu naa.
This tutorial is part of: Matrix LED ESP32-S3 RGB
- Iṣẹ́ ESP32-S3 RGB LED Matrix 1- Àmì-ojú ìpilẹ̀ṣẹ̀
- Iṣẹ́ ESP32-S3 RGB LED Matrix Project 2 - Ọ̀rọ̀ Tí Ń Rìn
- Iṣẹ́ ESP32-S3 RGB LED Matrix Project 3 - Ọ̀rọ̀ láti fóónù alágbèéká
- Iṣẹ́ ESP32-S3 RGB LED Matrix Project 5 - Ọfà tí ó máa ń tọ́ka sí òkè nígbà gbogbo
- Iṣẹ́ ESP32-S3 RGB LED Matrix Project 6 - Ere Cible
- Iṣẹ́ Aago ESP32-S3 RGB LED Matrix Wi-Fi + NTP - 1 Aago Ìpìlẹ̀
- Iṣẹ́ Aago Internet Matrix LED RGB ESP32-S3 - Àfihàn Aago àti Ọjọ́ ní Àwọ̀ púpọ̀ 2
- Iṣẹ́ Aago Internet Matrix LED RGB ESP32-S3 - Àwọ̀ Alẹ́ 3 pẹ̀lú Ọjọ́
- Iṣẹ́ Aago Internet Matrix LED RGB ESP32-S3 - Àwọ̀ Òṣùwọ̀n 5
- Iṣẹ́ Aago Nẹ́tíwọọkì ESP32-S3 RGB LED Matrix - Àwọ̀ àìròtẹ́lẹ̀ mẹ́rin
- ESP32-S3 RGB LED Matrix test for RGB, GRB setting
/*
Project 4: Tilt Dot – ESP32-S3 RGB LED Matrix (Waveshare)
This sketch reads tilt from the QMI8658C IMU and smoothly moves a dot
on the 8×8 RGB LED matrix based on board orientation.
▶️ Video Tutorial:
https://youtu.be/JKLuYrRcLMI
📚⬇️ Resources & Code Page:
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> // by Lahav Gahali
// -------- LED MATRIX SETUP --------
#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
);
// -------- QMI8658 IMU SETUP --------
QMI8658 imu;
QMI8658_Data imuData;
// -------- USER SETTINGS --------
// true -> dot on opposite side: USB↔OUSB, 34↔15
// false -> dot on same side as UP
bool useOppositeMapping = false;
// Dot color (0–255 each)
uint8_t dotRed = 0;
uint8_t dotGreen = 100;
uint8_t dotBlue = 0;
// Board sides
enum Side {
SIDE_CENTER = 0,
SIDE_USB,
SIDE_OUSB,
SIDE_15,
SIDE_34
};
// Smooth dot position (in pixel coordinates, but kept as float for easing)
float dotPosX = 3.0f; // start at center
float dotPosY = 3.0f;
// Smoothing factor: smaller = slower movement (0.1 very slow, 0.5 faster)
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 "?";
}
}
// Detect which side is UP using calibrated axes:
// +X = USB, -X = OUSB, +Y = 34, -Y = 15
Side detectSideUp(float ax_g, float ay_g, float az_g) {
// Flat detection
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;
// Thresholds to say "this axis is really tilted"
const float tiltThreshY = 0.5f;
const float tiltThreshX = 0.5f;
// 1) Prefer Y axis for 15 / 34 if it's clearly tilted
if (fabs(ay_g) >= tiltThreshY) {
if (ay_g > 0) {
return SIDE_15; // +Y = 34 up
} else {
return SIDE_34; // -Y = 15 up
}
}
// 2) Otherwise, check X axis for USB / OUSB
if (fabs(ax_g) >= tiltThreshX) {
if (ax_g > 0) {
return SIDE_USB; // +X = USB up
} else {
return SIDE_OUSB; // -X = OUSB up
}
}
// 3) If nothing is strongly tilted, just call it CENTER
return SIDE_CENTER;
}
// Map from UP side to where the dot should go
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;
}
}
// Convert dot side to matrix coordinates
void getDotPixel(Side dotSide, int &px, int &py) {
// Matrix (0,0) = top-left
// top center: (3,0) → USB
// bottom center: (3,7) → OUSB
// left center: (0,3) → 15
// right center: (7,3) → 34
// center: (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 for 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);
// --- Smooth movement toward target ---
dotPosX += (targetX - dotPosX) * dotSmooth;
dotPosY += (targetY - dotPosY) * dotSmooth;
// Convert to integer pixel coordinates
int px = (int)round(dotPosX);
int py = (int)round(dotPosY);
// Clamp just in case
if (px < 0) px = 0;
if (px > 7) px = 7;
if (py < 0) py = 0;
if (py > 7) py = 7;
// --- Draw dot ---
matrix.fillScreen(0);
uint16_t color = matrix.Color(dotRed, dotGreen, dotBlue);
matrix.drawPixel(px, py, color);
matrix.show();
// Debug
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);
}
Ohun ti o le nilo
-
Amazon
-
eBay
-
AliExpressPurchase ESP32-S3 RGB Matrix from AliExpresss.click.aliexpress.com
-
AliExpressPurchase ESP32-S3 RGB Matrix from AliExpress (2)s.click.aliexpress.com
Orisun & itọkasi
-
Ináàbò🎨 Color picker Toolrobojax.com
Fáìlìs📁
Fayile Fritzing
-
esp32-S3-supermini-tht fritzing part
esp32-S3-supermini-tht.fzpz0.02 MB