Mafunzo haya ni sehemu ya: Matrix ya LED ya ESP32-S3 RGB
Mradi mzuri wa kuunda kwa ajili ya matumizi ya kufurahisha na ya vitendo kwa kutumia moduli ya ESP32-S3 RGB Matrix. Viungo vya video zingine viko chini ya makala haya.
Mradi wa ESP32-S3 RGB LED Matrix 4 - Nukta ya kuinamia
Mradi wa 4 – Nukta ya Kuinamia (Sogeza Nukta kwa Kuinamia ESP32-S3 RGB LED Matrix)
Mradi wa 4 unatambulisha kihisi cha mwendo kilichojengwa ndani ya moduli ya ESP32-S3 RGB LED Matrix. Badala ya kusogeza nukta kiotomatiki (kama Mradi wa 1) au kusogeza maandishi (Miradi ya 2 na 3), mradi huu unakuruhusu kudhibiti nafasi ya nukta kwa kuinamia bodi tu. Nukta husogea vizuri kwenye onyesho la 8×8 RGB kulingana na usomaji wa moja kwa moja kutoka kwa kipima mwendo cha QMI8658C kilicho nyuma ya moduli.
Miradi yote sita katika mfululizo huu inaonyeshwa katika video moja ya YouTube. Video hiyo hiyo imepachikwa kwenye ukurasa huu, ili uweze kuona jinsi nukta inavyosogea kwa wakati halisi bodi inapoinamia. Msimbo kamili wa mradi huu umepakiwa kiotomatiki chini ya makala, na viungo vya ununuzi vya moduli vinaonekana chini ya sehemu ya msimbo.


Muhtasari wa Moduli ya ESP32-S3 RGB LED Matrix
Mradi huu unatumia moduli ya ESP32-S3 RGB LED Matrix, ambayo inajumuisha:

- Kidhibiti kidogo cha ESP32-S3 chenye Wi-Fi na Bluetooth
- Matrix ya 8×8 RGB LED (LED 64 zinazoweza kushughulikiwa kibinafsi)
- Kipima mwendo cha QMI8658C nyuma kwa ajili ya kutambua kuinamia na mwendo
- Bandari ya USB kwa ajili ya kupanga na nishati
- Vitufe vya Boot / Reset
- Pini za GPIO zinazotumika kwa upanuzi wa baadaye
Kihisi cha QMI8658C kinasoma thamani za kuongeza kasi na mwelekeo za X, Y, na Z, kuruhusu nukta kusogea juu/chini/kushoto/kulia kulingana na jinsi bodi inavyoinamishwa.

Miradi Inayoshughulikiwa kwenye Video (Nyakati)
- 00:00 – Utangulizi
- 02:01 – Kusakinisha bodi za ESP32
- 03:32 – Kusakinisha maktaba
- 05:32 – Mradi wa 1: Nukta Inayosogea
- 11:11 – Mradi wa 2: Kusogeza Maandishi
- 12:59 – Mradi wa 3: Maandishi ya HTTP
- 16:41 – Mradi wa 4: Nukta ya Kuinamia (mradi huu)
- 18:55 – Mradi wa 5: Mshale Juu
- 20:02 – Mradi wa 6: Mchezo wa Shabaha
Kutazama onyesho la kuinamia kwenye video kunapendekezwa sana, kwani unaweza kuona jinsi nukta inavyojibu vizuri mwelekeo wa bodi.

Kusakinisha Bodi za ESP32 kwenye Arduino IDE
Ikiwa umekamilisha mradi wowote wa awali, usaidizi wa bodi tayari umesakinishwa. Vinginevyo, fuata hatua hizi:
- Fungua
File > Preferences→ Ongeza URL ya Bodi za ESP32. - Nenda kwenye
Tools > Board > Boards Manager…na usakinishe ESP32. - Chagua bodi yako ya ESP32-S3 chini ya
Tools > Board. - Chagua bandari sahihi ya COM chini ya
Tools > Port.
Kusakinisha Maktaba Zinazohitajika
Mradi huu unahitaji maktaba zifuatazo:
Adafruit NeoMatrixAdafruit NeoPixelAdafruit GFX LibraryQMI8658(kihisi cha mwendo)
Sakinisha kwenye Kidhibiti cha Maktaba:
- Fungua
Sketch > Include Library > Manage Libraries…. - Tafuta Adafruit NeoMatrix → Sakinisha.
- Ruhusu usakinishaji wa kiotomatiki wa Adafruit GFX na Adafruit NeoPixel.
- Tafuta QMI8658 kwa mwandishi wake aliyeorodheshwa → Sakinisha.
Jinsi Mradi wa 4 Unavyofanya Kazi
Kihisi cha QMI8658C kinaendelea kutoa data ya kuongeza kasi kwenye shoka za X, Y, na Z. Kwa mradi huu, tunatumia tu shoka za X na Y kuamua:
- Nukta isogee mbali kiasi gani kushoto au kulia (mhimili wa X)
- Nukta isogee juu au chini kiasi gani (mhimili wa Y)
Thamani za kihisi zinapangwa katika anuwai ya kuratibu kutoka 0 hadi 7 (kwa matrix ya 8×8 LED). Nafasi ya nukta inasasishwa mara nyingi kwa sekunde, ikitoa athari laini ya kuteleza unapoinamia moduli.
Mradi wa 4 – Mipangilio ya Msimbo (Nukta ya Kuinamia)
Hapo chini ni mipangilio inayoweza kuhaririwa na mtumiaji inayopatikana karibu na juu ya msimbo wa mradi. Msimbo kamili unaonekana chini ya makala kiotomatiki.
Pini na Ukubwa wa Matrix
// Usanidi wa matrix ya 8×8 RGB
const int MATRIX_PIN = 14; // pini isiyobadilika kwa bodi hii
const int MATRIX_WIDTH = 8;
const int MATRIX_HEIGHT = 8;
Acha MATRIX_PIN iwe 14. Imeunganishwa moja kwa moja kwenye matrix ya bodi.
Mwangaza
// Mwangaza wa jumla (0–255)
uint8_t matrixBrightness = 40;
Ongeza ikihitajika, lakini epuka mwangaza mkali kupita kiasi unapotazama karibu.
Rangi ya Nukta
// Rangi ya nukta (R, G, B)
uint8_t dotRed = 0;
uint8_t dotGreen = 200; // kijani kibichi (cha kawaida)
uint8_t dotBlue = 0;
Badilisha thamani hizi kuunda rangi yoyote. Mifano:
- Nyekundu:
(255, 0, 0) - Njano:
(255, 255, 0) - Nyeupe:
(255, 255, 255)
Usikivu wa Mwendo
Ili kuzuia miruko mikubwa, thamani za kipima mwendo kwa kawaida hupunguzwa au kupimwa. Mpangilio wa kawaida unaonekana kama:
// Jinsi kuinamia kunavyoathiri harakati kwa ukali
float sensitivity = 4.0f; // kubwa = harakati ya haraka kwenye skrini
Ikiwa nukta inasogea polepole sana → ongeza thamani. Ikiwa nukta inasogea kwa ghafla sana → ipunguze.
Kasi ya Usasishaji (Kiwango cha Kuonyesha Upya)
Unaweza kuongeza muda mfupi wa kuchelewa kati ya masasisho ili kulainisha mwendo:
// Kuchelewa kati ya masasisho ya nafasi (ms)
int refreshDelayMs = 20; // chini = majibu laini na ya haraka zaidi
Thamani kati ya 10–30 ms huhisi kuitikia vizuri sana.
Muhtasari
Mradi wa 4 unaleta kihisi cha QMI8658C kilichojengewa ndani cha ESP32-S3 kuwa hai kwa kukuwezesha kudhibiti matrix ya LED kwa mwendo wa kimwili. Mwelekeo mdogo wa bodi husogeza nukta katika mwelekeo ule ule, na kufanya mradi huu kuwa hatua nzuri ya kuelekea miradi ya juu zaidi ya “Arrow Up” na “Target Game”.
Sketch kamili ya Tilt Dot imepakiwa chini ya makala hii (kiotomatiki). Kwa uelewa bora, tazama onyesho la mwelekeo kwenye video, ambapo unaweza kuona jinsi nukta inavyosogea laini wakati bodi inapozungushwa. Viungo vya kununua moduli ya ESP32-S3 RGB LED Matrix vimejumuishwa chini ya sehemu ya msimbo.
Mafunzo haya ni sehemu ya: Matrix ya LED ya ESP32-S3 RGB
- Mradi wa Matrix ya LED ya RGB ya ESP32-S3 1- Nukta ya Msingi
- Mradi wa Matrix ya LED ya RGB ya ESP32-S3 2 - Maandishi Yanayotembea
- Mradi wa ESP32-S3 RGB LED Matrix 3 - Maandishi kutoka kwa simu ya mkononi
- Mradi wa Matrix ya LED ya RGB ya ESP32-S3 5 - Mshale daima juu
- Mchezo wa Cible wa Mradi wa Matrix ya LED ya RGB ya ESP32-S3 6
- Mradi wa Saa ya Matrix ya LED ya RGB ya ESP32-S3 Wi-Fi + NTP -1 Saa ya Msingi
- Mradi wa Saa ya Mtandao ya Matrix ya LED ya RGB ya ESP32-S3 - Saa 2 za rangi nyingi za Kuonyesha Muda na Tarehe
- Mradi wa Saa ya Mtandao ya Matrix ya LED ya RGB ya ESP32-S3 - Rangi 3 za Usiku na Tarehe
- Mradi wa Saa ya Mtandao ya Matrix ya LED ya RGB ya ESP32-S3 - Rangi 5 za Upinde wa mvua
- Mradi wa Saa ya Mtandao ya Matrix ya LED ya RGB ya ESP32-S3 - Rangi 4 za Nasibu
- 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);
}
Tänker att du kanske behöver
-
Amazon
-
eBay
-
AliExpressPurchase ESP32-S3 RGB matrix from AliExpresss.click.aliexpress.com
-
AliExpressPurchase ESP32-S3 RGB matrix from AliExpress (2)s.click.aliexpress.com
Resurser och referenser
-
Interna🎨 Color picker Toolrobojax.com
Filer📁
Fritzing-fil
-
esp32-S3-supermini-tht fritzing part
esp32-S3-supermini-tht.fzpz0.02 MB