This tutorial is part of: Matrix na LED na ESP32-S3 RGB
Kyakkyawan aiki don ƙirƙirar aikace-aikace masu daɗi da amfani ta amfani da module na ESP32-S3 RGB Matrix. Hanyoyin haɗi zuwa wasu bidiyo suna ƙasa da wannan labarin.
Aikin ESP32-S3 RGB LED Matrix 4 - Digon karkata
Aikin 4 – Tilt Dot (Matsar da Dot ta hanyar Karkatar da ESP32-S3 RGB LED Matrix)
Aikin 4 yana gabatar da firikwensin motsi da ke cikin na'urar ESP32-S3 RGB LED Matrix. Maimakon matsar da dot ta atomatik (kamar Aikin 1) ko gungurawa rubutu (Ayyuka 2 da 3), wannan aikin yana ba ka damar sarrafa wurin dot ta hanyar karkatar da allo kawai. Dot yana motsawa cikin santsi a kan nunin RGB 8×8 bisa ga karatun kai tsaye daga QMI8658C accelerometer a bayan na'urar.
Dukkan ayyuka shida a cikin wannan jerin an nuna su a cikin bidiyon YouTube guda ɗaya. Bidiyon ɗaya an saka shi a wannan shafin, don haka za ka iya ganin yadda dot ke motsawa a ainihin lokaci yayin da allo ke karkata. Cikakken lambar wannan aikin ana loda shi ta atomatik a ƙasan labarin, kuma hanyoyin sayan haɗin gwiwa na na'urar suna bayyana a ƙarƙashin sashin lambar.


Bayanin ESP32-S3 RGB LED Matrix Module
Wannan aikin yana amfani da na'urar ESP32-S3 RGB LED Matrix, wadda ta ƙunshi:

- ESP32-S3 microcontroller tare da Wi-Fi da Bluetooth
- 8×8 RGB LED matrix (LED 64 da za a iya magance kowanne)
- QMI8658C accelerometer a baya don gano karkata da motsi
- USB port don shirye-shirye da wutar lantarki
- Maɓallan Boot / Reset
- GPIO pins masu amfani don faɗaɗa a nan gaba
Firikwensin QMI8658C yana karanta ƙimar X, Y, da Z na hanzari da yanayin karkata, yana ba da damar dot ya motsa sama/ƙasa/hagu/dama bisa ga yadda aka karkatar da allo.

Ayyukan da aka Nuna a Bidiyon (Lokutan)
- 00:00 – Gabatarwa
- 02:01 – Shigar da ESP32 boards
- 03:32 – Shigar da libraries
- 05:32 – Aikin 1: Moving Dot
- 11:11 – Aikin 2: Text Scroll
- 12:59 – Aikin 3: HTTP Text
- 16:41 – Aikin 4: Tilt Dot (wannan aikin)
- 18:55 – Aikin 5: Arrow Up
- 20:02 – Aikin 6: Target Game
Ana ba da shawarar sosai ka kalli nunin karkata a cikin bidiyon, domin za ka ga yadda dot ke amsawa cikin santsi ga yanayin karkatar da allo.

Shigar da ESP32 Boards a Arduino IDE
Idan ka kammala kowane aikin da ya gabata, tallafin board ya riga ya shiga. In ba haka ba, bi waɗannan matakan:
- Buɗe
File > Preferences→ Ƙara URL na ESP32 Boards. - Je zuwa
Tools > Board > Boards Manager…ka shigar da ESP32. - Zaɓi board ɗinka na ESP32-S3 a ƙarƙashin
Tools > Board. - Zaɓi madaidaicin COM port a ƙarƙashin
Tools > Port.
Shigar da Libraries Da Ake Bukata
Wannan aikin yana buƙatar waɗannan libraries:
Adafruit NeoMatrixAdafruit NeoPixelAdafruit GFX LibraryQMI8658(firikwensin motsi)
Shigar da su a cikin Library Manager:
- Buɗe
Sketch > Include Library > Manage Libraries…. - Nemo Adafruit NeoMatrix → Shigar.
- Ba da izinin shigarwa ta atomatik na Adafruit GFX da Adafruit NeoPixel.
- Nemo QMI8658 ta marubucin da aka jera → Shigar.
Yadda Aikin 4 Yake Aiki
Firikwensin QMI8658C yana ba da bayanan hanzari akai-akai tare da X, Y, da Z axes. Don wannan aikin, muna amfani da X da Y axes kawai don yanke shawara:
- Nisan da dot zai motsa hagu ko dama (X axis)
- Nisan da dot zai motsa sama ko ƙasa (Y axis)
Ana canza ƙimar firikwensin zuwa kewayon daidaitawa daga 0 zuwa 7 (don 8×8 LED matrix). Matsayin dot yana sabuntawa sau da yawa a cikin daƙiƙa, yana ba da tasirin zamewa cikin santsi yayin da kake karkatar da na'urar.
Aikin 4 – Saitunan Lamba (Tilt Dot)
A ƙasa akwai saitunan da mai amfani zai iya gyara waɗanda ke kusa da saman lambar aikin. Cikakken sketch yana bayyana a ƙasan labarin ta atomatik.
Matrix Pin da Girma
// 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;
Bar MATRIX_PIN a 14. An haɗa shi kai tsaye da matrix ɗin da ke kan allo.
Hasken Haske
// Overall brightness (0–255)
uint8_t matrixBrightness = 40;
Ƙara idan ya cancanta, amma ka guji haske mai ƙarfi sosai idan kana kallo kusa.
Launin Dot
// Dot color (R, G, B)
uint8_t dotRed = 0;
uint8_t dotGreen = 200; // light green (default)
uint8_t dotBlue = 0;
Canza waɗannan ƙimar don ƙirƙirar kowane launi. Misalai:
- Ja:
(255, 0, 0) - Rawaye:
(255, 255, 0) - Fari:
(255, 255, 255)
Hankalin Motsi
Don hana tsalle-tsalle masu ƙarfi, ana yawan danne ko rage ƙimar accelerometer. Saitin yau da kullun yana kama da:
// How aggressively tilt affects movement
float sensitivity = 4.0f; // larger = faster movement across screen
Idan dot yana motsawa a hankali sosai → ƙara ƙimar. Idan dot yana motsawa ba zato ba tsammani → rage shi.
Gudun Sabuntawa (Refresh Rate)
Kuna iya ƙara ɗan jinkiri tsakanin sabuntawa don sauƙaƙa motsi:
// Jinkiri tsakanin sabunta matsayi (ms)
int refreshDelayMs = 20; // ƙarami = saurin amsawa da santsi
Ƙimar tsakanin 10–30 ms tana jin daɗin amsawa sosai.
Taƙaitawa
Project 4 yana kawo na'urar QMI8658C accelerometer na ESP32-S3 zuwa rayuwa ta hanyar ba ku damar sarrafa LED matrix da motsin jiki. Ƙaramin karkatar da allo yana motsa ɗigon zuwa wannan hanya, yana sa wannan aikin ya zama mataki mai kyau na ci gaba ga ayyukan “Arrow Up” da “Target Game” mafi ci gaba.
Cikakken shirin Tilt Dot yana ƙarƙashin wannan labarin (ta atomatik). Don fahimta mafi kyau, kalli nunin karkatarwa a cikin bidiyon, inda za ku ga yadda ɗigon ke motsawa cikin santsi yayin da ake juya allo. Hanyoyin siyan ESP32-S3 RGB LED Matrix module an haɗa su a ƙarƙashin sashin lambar.
This tutorial is part of: Matrix na LED na ESP32-S3 RGB
- Aikin Matrix LED RGB na ESP32-S3 1- Digo na asali
- Aikin Matrix LED RGB na ESP32-S3 2 - Rubutu Mai Gudana
- Aikin Matrix LED RGB ESP32-S3 Project 3 - Rubutu daga wayar hannu
- Aikin Matrix LED RGB na ESP32-S3 Na 5 - Kibiya koyaushe tana sama
- Aikin Matrix LED RGB na ESP32-S3 6 - Wasan Cible
- Aikin ESP32-S3 RGB LED Matrix Wi-Fi + NTP Time Clock -1 Basic Clock
- Aikin ESP32-S3 RGB LED Matrix Agogon Intanet - Nunin Lokaci & Kwanan Wata masu Launi da yawa na Agogo 2
- Aikin ESP32-S3 RGB LED Matrix Agogon Intanet - Launi 3 na Dare tare da Kwanan Wata
- Aikin ESP32-S3 RGB LED Matrix Internet Clock - Launi 5 na Bakan gizo
- Aikin Agogon Matrix LED RGB ESP32-S3 na Intanet - Launi 4 Bazuwa
- 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);
}
Abin da zaka iya bukata
-
Amazon
-
eBay
-
AliExpressPurchase ESP32-S3 RGB Matrix from AliExpresss.click.aliexpress.com
-
AliExpressPurchase ESP32-S3 RGB Matrix from AliExpress (2)s.click.aliexpress.com
Albarkatun da kuma shafukan da za a duba
-
Ciki🎨 Color picker Toolrobojax.com
Fayiloli📁
Fayil Fritzing
-
esp32-S3-supermini-tht fritzing part
esp32-S3-supermini-tht.fzpz0.02 MB