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 5 - Ọfà tí ó máa ń tọ́ka sí òkè nígbà gbogbo
Ise 5 – Ọfà Nígbà Gbogbo Ní Òkè (Àmì Ìtọ́sọ́nà Nípa Lílo QMI8658C)
Ise 5 lo ẹ̀rọ ìmọ̀-ìrìn QMI8658C láti mọ ìtọ́sọ́nà ESP32-S3 RGB LED Matrix àti láti máa fi ọfà hàn nígbà gbogbo tí ó ń tọ́ka sí òkè ní ìbámu pẹ̀lú agbára òòfà. Bí o ṣe yí bọ́ọ̀dì náà kí ó wù ó—USB sí òkè, OUSB sí òkè, ẹ̀gbẹ́ “15”, tàbí ẹ̀gbẹ́ “34”—ọfà náà yóò yí ara rẹ̀ tóká sí ìtọ́sọ́nà òkè nípa ti ara.
Èyí jẹ́ àṣefihàn agbára ìmọ̀-ìrìn ní àkókò gidi nípa lílo accelerometer tí ó wà nínú ẹ̀rọ náà. Gbogbo àwọn ise mẹ́fà fún module yìí ni a fi hàn nínú fídíò YouTube kan, tí a tún fi sínú ojú-ewé yìí. Kódì pátápátá fún Ise 5 yóò gbé ara rẹ̀ sílẹ̀ lásán ní ìsàlẹ̀ àpilẹ̀kọ, àti àwọn ọ̀rọ̀-ìjápọ̀ (affiliate links) yóò hàn ní ìsàlẹ̀ abala kódì.

Àkópọ̀ ESP32-S3 RGB LED Matrix Module
ESP32-S3 RGB LED Matrix module ní ọ̀pọ̀lọpọ̀ ẹ̀yà tí ó jẹ́ kí ise yìí ṣeéṣe:

- ESP32-S3 microcontroller — ń pèsè Wi-Fi, BLE, àti ń ṣiṣẹ́ lórí LED/IMU logic.
- 8×8 RGB LED matrix — ń fi ọfà hàn ní ọ̀kan nínú àwọn ìtọ́sọ́nà mẹ́rin.
- QMI8658C accelerometer — ń mọ ìtẹ̀sí, ìrìn, àti ìtọ́sọ́nà.:contentReference[oaicite:0]{index=0}
- USB-C port fún agbára àti programming ní Arduino IDE.
- Reset àti Boot buttons fún gbígbé àwọn sketches sílẹ̀.
- GPIO pins tí ó wà ní àyíká bọ́ọ̀dì fún àwọn ise àfikún.
Ìtọ́sọ́nà ọfà jẹ́ dídáyọ̀ pátápátá láti inú àwọn ìwọ̀n accelerometer. Nígbà tí a bá yí bọ́ọ̀dì náà, QMI8658C yóò mọ àwọn iye X/Y/Z tuntun, àti sketch yóò yan ètò ọfà wo (↑, ↓, ←, →) tí ó yẹ láti yà.

Àwọn Ise Tí A Bò Nínú Fídíò (Àwọn Àsìkò)
- 00:00 – Ìfihàn
- 02:01 – Fífi ESP32 boards sílẹ̀
- 03:32 – Fífi àwọn libraries sílẹ̀
- 05:32 – Ise 1: Ọ̀rọ̀ Tí ń Rìn
- 11:11 – Ise 2: Ìyíwọ̀n Ọ̀rọ̀
- 12:59 – Ise 3: HTTP Ọ̀rọ̀
- 16:41 – Ise 4: Ọ̀rọ̀ Tí ń Tẹ̀sí
- 18:55 – Ise 5: Ọfà Nígbà Gbogbo Ní Òkè (ise yìí)
- 20:02 – Ise 6: Eré Ìfọkànsí
Fídíò náà fi hàn kedere bí ọfà ṣe ń yí ìtọ́sọ́nà rẹ̀ padà lójúkan náà nígbà tí a bá yí module náà. A gba ọ níyànjú gan-an láti wo abala yìí.:contentReference[oaicite:1]{index=1}

Fífi ESP32 Boards sílẹ̀ ní Arduino IDE
Bí o bá ti parí ise tí ó ṣáájú, ìtòlẹ́sẹ̀ẹ́ bọ́ọ̀dì ti wà tán. Bí kò bá rí bẹ́ẹ̀:
File > Preferences→ Fi ESP32 board URL kún unTools > Board > Boards Manager…→ Fi “ESP32” sílẹ̀- Yan ESP32-S3 board lábé
Tools > Board - Yan USB COM port tí ó tọ̀nà lábé
Tools > Port
Fífi Àwọn Libraries Tí A Nílò sílẹ̀
Ise 5 ń lo:
Adafruit NeoMatrixAdafruit NeoPixelAdafruit GFXQMI8658(ẹ̀rọ ìmọ̀-ìrìn)
Sketch > Include Library > Manage Libraries…- Wá: NeoMatrix → Fi sílẹ̀
- Fi àwọn ohun tí ó gbélé: NeoPixel + GFX
- Wá kí o sì fi QMI8658 sílẹ̀ nípa onkọ̀wé rẹ̀
Bí Ise 5 Ṣe ń Ṣiṣẹ́
QMI8658C ń wọn agbára òòfà lórí X, Y, àti Z axes. Nípa fífi àwọn iye wọ̀nyí wéra, sketch yóò pinnu èyí nínú àwọn ẹ̀gbẹ́ ara bọ́ọ̀dì tí ó ń kọjú sí òkè:
- USB sí òkè
- OUSB sí òkè (ìdàkejì USB)
- Ẹ̀gbẹ́ “15” sí òkè
- Ẹ̀gbẹ́ “34” sí òkè
Ìtọ́sọ́nà kọ̀ọ̀kan ní ìbámu pẹ̀lú ètò ọfà tí ó yàtọ̀ lórí 8×8 matrix. Ìyàwòrán náà tẹ̀lé ìmọ̀ ìtọ́sọ́nà rẹ tí a fìdí rẹ̀ múlẹ̀ láti àwọn ìgbà ìwádìí tí ó ṣáájú. A ń ka ìyípo bọ́ọ̀dì náà nígbà gbogbo, àti ọfà yóò yí ara rẹ̀ padà ní kíá ní kété tí ẹ̀gbẹ́ òkè bá yí padà.
Ise 5 – Àwọn Ètò Kódì (Ọfà Nígbà Gbogbo Ní Òkè)
Ní ìsàlẹ̀ ni àwọn iye tí olùṣàmúlò lè yí padà láti agbègbè ìtòlẹ́sẹ̀ẹ́. Kódì ise pátápátá yóò hàn lásán ní ìsàlẹ̀ àpilẹ̀kọ.
Ìtòlẹ́sẹ̀ẹ́ Matrix
// Ìtòlẹ́sẹ̀ẹ́ Matrix
const int MATRIX_PIN = 14; // ti o wa titi fún module yìí
const int MATRIX_WIDTH = 8;
const int MATRIX_HEIGHT = 8;
// Ìtọ́sọ́nà tí a gbà níyànjú: Top-Left origin, progressive mode
// (constructor gangan wà nínú kódì tí a gbé sílẹ̀ ní ìsàlẹ̀)
Ise yìí ń lo NEO_MATRIX_PROGRESSIVE layout láti rí i dájú pé ọfà ń tọ́ka sí ìtọ́sọ́nà tí ó tọ̀nà ní ìbámu pẹ̀lú ìrìn gangan.
Ìmọ́lẹ̀
uint8_t matrixBrightness = 40; // 0–255
O lè gbé iye yìí sókè fún àwọn ibi tí ó mọ́lẹ̀. Fún lílò ní inú ilé, 30–60 ni ó tù ú.
Àwọ̀ Ọfà
// Àwọ̀ ọfà
uint8_t arrowRed = 255;
uint8_t arrowGreen = 0;
uint8_t arrowBlue = 0;
Yí àwọn iye wọ̀nyí padà láti yí àwọ̀ ọfà náà. Fún àpẹẹrẹ:
- Ọfà aláwọ̀ ewé:
(0, 255, 0) - Ọfà aláwọ̀ búlúù:
(0, 0, 255) - Ọfà aláwọ̀ funfun:
(255, 255, 255)
Ìmọ̀-ìrìn àti Ìmúrẹ́rẹ́
Láti yẹra fún jitter, kódì náà ní ìmúrẹ́rẹ́ àti threshold logic. Nínú àwọn ètò, o lè rí nǹkan bí:
// Ìtúnṣe ìmọ̀-ìrìn / ìmúrẹ́rẹ́
float tiltThreshold = 0.30f; // túnṣe bí ọfà bá yí padà jù- Bí ọ̀fà rẹ yí kíákíá ju → gbé ìpele ìwọ̀n sókè.
- Bí ọ̀fà kò bá yíra tó → dín ìpele ìwọ̀n kù.
Àwọn Àpẹẹrẹ Ọ̀fà
Àwòrán náà ní àwọn àpẹẹrẹ bitmap ọ̀fà fún:
- ↑ òkè
- ↓ ìsàlẹ̀
- ← òsì
- → ọ̀tún
O kò ní láti yí wọ̀n padà, ṣùgbọ́n o lè yí àwọn ìrísí inú kóòdù padà bí o bá fẹ́ ọ̀nà tó yàtọ̀.
Àkópọ̀
Ìṣe 5 fi hàn bí ESP32-S3 RGB LED Matrix àti QMI8658C accelerometer ṣe ṣiṣẹ́ papọ̀ láti mọ ìṣàkóso àti láti fi ọ̀fà hàn tí ó máa tọ́ka sí òkè nígbà gbogbo. Ìṣe yìí kọ́ lórí Tilt Dot (Ìṣe 4) ó sì mú ọ ní múrà fún eré ìbánidọ́rẹ̀wọ̀ tó kẹ́yìn ní Ìṣe 6.
Àwòrán kíkún “Arrow Always Up” wà ní ìsàlẹ̀ àpilẹ̀kọ yìí (tí a ti gbé sílẹ̀ fúnrarẹ̀). Ó dára láti wo apá tó bá mu nínú fídíò náà láti rí bí ọ̀fà ṣe ń fèsì lójúkan sí yíyí pátákó náà. Bí o bá fẹ́ kọ́ ìṣe yìí nílé, àwọn ọ̀nà asopọ̀ fún ESP32-S3 RGB LED Matrix module wà ní ìsàlẹ̀ apá kóòdù náà.
Aworan
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 4 - Tilt dot
- 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 5: Arrow Always Up – 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/RJT833
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 -> arrow points to opposite side
// USB↔OUSB, 34↔15
// false -> arrow points to the same side that is UP
bool useOppositeMapping = false;
// Arrow color (0–255 each)
uint8_t dotRed = 0;
uint8_t dotGreen = 150;
uint8_t dotBlue = 0;
// Board sides
enum Side {
SIDE_CENTER = 0,
SIDE_USB,
SIDE_OUSB,
SIDE_15,
SIDE_34
};
// Direction for arrow drawing
enum ArrowDir {
ARROW_CENTER,
ARROW_UP,
ARROW_DOWN,
ARROW_LEFT,
ARROW_RIGHT
};
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 "?";
}
}
// -------- ARROW DRAWING (YOUR CODE, UNCHANGED) --------
// Draw a simple arrow on 8x8 matrix pointing in the given direction
void drawArrow(ArrowDir dir, uint16_t color) {
matrix.fillScreen(0);
switch (dir) {
case ARROW_UP:
// Tip
matrix.drawPixel(3, 0, color);
matrix.drawPixel(4, 0, color);
// Second row
matrix.drawPixel(2, 1, color);
matrix.drawPixel(3, 1, color);
matrix.drawPixel(4, 1, color);
matrix.drawPixel(5, 1, color);
// Shaft
matrix.drawLine(3, 2, 3, 6, color);
matrix.drawLine(4, 2, 4, 6, color);
break;
case ARROW_DOWN:
// Tip
matrix.drawPixel(3, 7, color);
matrix.drawPixel(4, 7, color);
// Row above tip
matrix.drawPixel(2, 6, color);
matrix.drawPixel(3, 6, color);
matrix.drawPixel(4, 6, color);
matrix.drawPixel(5, 6, color);
// Shaft
matrix.drawLine(3, 1, 3, 5, color);
matrix.drawLine(4, 1, 4, 5, color);
break;
case ARROW_LEFT:
// Tip
matrix.drawPixel(0, 3, color);
matrix.drawPixel(0, 4, color);
// Column after tip
matrix.drawPixel(1, 2, color);
matrix.drawPixel(1, 3, color);
matrix.drawPixel(1, 4, color);
matrix.drawPixel(1, 5, color);
// Shaft
matrix.drawLine(2, 3, 6, 3, color);
matrix.drawLine(2, 4, 6, 4, color);
break;
case ARROW_RIGHT:
// Tip
matrix.drawPixel(7, 3, color);
matrix.drawPixel(7, 4, color);
// Column before tip
matrix.drawPixel(6, 2, color);
matrix.drawPixel(6, 3, color);
matrix.drawPixel(6, 4, color);
matrix.drawPixel(6, 5, color);
// Shaft
matrix.drawLine(1, 3, 5, 3, color);
matrix.drawLine(1, 4, 5, 4, color);
break;
case ARROW_CENTER:
default:
// Simple plus in the center
matrix.drawLine(3, 3, 4, 3, color);
matrix.drawLine(3, 4, 4, 4, color);
matrix.drawLine(3, 3, 3, 4, color);
matrix.drawLine(4, 3, 4, 4, color);
break;
}
matrix.show();
}
// -------- IMU → SIDE DETECTION --------
// We calibrated earlier:
// +X = USB, -X = OUSB
// +Y = 15, -Y = 34 (after your correction)
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;
// Prefer Y axis for 15 / 34
if (fabs(ay_g) >= tiltThreshY) {
if (ay_g > 0) {
return SIDE_34; // +Y = 34 up
} else {
return SIDE_15; // -Y = 15 up
}
}
// Otherwise, use 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
}
}
// Not clearly tilted → treat as center
return SIDE_CENTER;
}
// Map from UP side to where the arrow should point
Side arrowSideFromUpSide(Side upSide) {
if (!useOppositeMapping) {
// Arrow shows the side that is UP
return upSide;
}
// Arrow shows the opposite side
switch (upSide) {
case SIDE_USB: return SIDE_OUSB;
case SIDE_OUSB: return SIDE_USB;
case SIDE_15: return SIDE_34;
case SIDE_34: return SIDE_15;
case SIDE_CENTER:
default: return SIDE_CENTER;
}
}
// Convert SIDE to ArrowDir
ArrowDir arrowDirFromSide(Side s) {
switch (s) {
case SIDE_USB: return ARROW_UP;
case SIDE_OUSB: return ARROW_DOWN;
case SIDE_15: return ARROW_LEFT;
case SIDE_34: return ARROW_RIGHT;
case SIDE_CENTER:
default: return ARROW_CENTER;
}
}
// ---------------- SETUP & LOOP ----------------
void setup() {
Serial.begin(115200);
delay(500);
matrix.begin();
matrix.setBrightness(20);
matrix.fillScreen(0);
matrix.show();
// IMU: SDA=11, SCL=12 on 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 arrowSide = arrowSideFromUpSide(upSide);
ArrowDir dir = arrowDirFromSide(arrowSide);
uint16_t color = matrix.Color(dotRed, dotGreen, dotBlue);
drawArrow(dir, color);
// 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(" | ARROW="); Serial.println(sideName(arrowSide));
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