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 Matrix LED RGB na ESP32-S3 Na 5 - Kibiya koyaushe tana sama
Aikin 5 – Kibiya Koyaushe Tana Nuni zuwa Sama (Alamar Jagora ta amfani da QMI8658C)
Aikin 5 yana amfani da na'urar motsi ta QMI8658C don gano yanayin ESP32-S3 RGB LED Matrix kuma koyaushe yana nuna kibiya mai nuni zuwa sama dangane da nauyi. Ko ta yaya ka juya allon—gefen USB sama, gefen OUSB sama, gefen “15”, ko gefen “34”—kibiyar tana juya kai tsaye kuma tana nuni zuwa alkiblar sama ta zahiri.
Wannan nunin ƙarfi ne na gano yanayin lokaci-lokaci ta amfani da accelerometer na cikin allo. Dukkan ayyuka shida na wannan module ana nuna su a cikin bidiyon YouTube guda ɗaya, wanda kuma aka saka a wannan shafin. Cikakken lambar Aikin 5 yana ɗauka ta atomatik a ƙasan labarin, kuma hanyoyin haɗin affiliate suna bayyana a ƙarƙashin sashin lambar.

Bayanin ESP32-S3 RGB LED Matrix Module
ESP32-S3 RGB LED Matrix module ya ƙunshi abubuwa da yawa waɗanda ke sa wannan aikin yiwuwa:

- ESP32-S3 microcontroller — yana ba da Wi-Fi, BLE, kuma yana gudanar da dabaru na LED/IMU.
- 8×8 RGB LED matrix — yana nuna kibiya a kowane ɗayan hanyoyi huɗu.
- QMI8658C accelerometer — yana gano karkata, motsi, da yanayin.:contentReference[oaicite:0]{index=0}
- USB-C port don wutar lantarki da shirye-shirye a cikin Arduino IDE.
- Reset da Boot buttons don ɗora sketches.
- GPIO pins da ke kewaye da allon don ƙarin ayyuka.
Alkiblar kibiya ana ƙayyade ta gaba ɗaya daga karatun accelerometer. Lokacin da aka juya allon, QMI8658C yana jin sabbin ƙimar X/Y/Z, kuma sketch ɗin yana zaɓar wane tsarin kibiya (↑, ↓, ←, →) ya kamata a zana.

Ayyukan da aka Rufe a cikin Bidiyon (Lokutan Timestamps)
- 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
- 18:55 – Aikin 5: Kibiya Koyaushe Tana Nuni zuwa Sama (wannan aikin)
- 20:02 – Aikin 6: Target Game
Bidiyon yana nuna a sarari yadda kibiya ke canza alkibla nan take dangane da yadda aka juya module ɗin. Ana ba da shawarar ƙwarai da kallon wannan ɓangaren.:contentReference[oaicite:1]{index=1}

Shigar da ESP32 Boards a cikin Arduino IDE
Idan ka kammala kowane aikin da ya gabata, saitin board ɗin ya riga ya yi. In ba haka ba:
File > Preferences→ Ƙara URL na ESP32 boardTools > Board > Boards Manager…→ Shigar da “ESP32”- Zaɓi ESP32-S3 board a ƙarƙashin
Tools > Board - Zaɓi daidai USB COM port a ƙarƙashin
Tools > Port
Shigar da Required Libraries
Aikin 5 yana amfani da:
Adafruit NeoMatrixAdafruit NeoPixelAdafruit GFXQMI8658(na'urar motsi)
Sketch > Include Library > Manage Libraries…- Bincika: NeoMatrix → Shigar
- Shigar da abubuwan dogaro: NeoPixel + GFX
- Bincika kuma shigar da QMI8658 ta marubucinsa
Yadda Aikin 5 Yake Aiki
QMI8658C yana auna nauyi akan X, Y, da Z axes. Ta hanyar kwatanta waɗannan ƙimar, sketch ɗin yana ƙayyade wane gefen jiki na allon ke fuskantar sama:
- Gefen USB sama
- Gefen OUSB sama (kishiyar USB)
- Gefen “15” sama
- Gefen “34” sama
Kowane yanayi yana dacewa da tsarin kibiya daban-daban akan 8×8 matrix. Taswirar tana bin dabaru na yanayin da ka tabbatar daga zaman gyara kuskure na baya. Ana karanta jujjuyawar allon a kai a kai, kuma kibiya tana sabuntawa da zarar gefen sama ya canza.
Aikin 5 – Saitunan Lamba (Kibiya Koyaushe Tana Nuni zuwa Sama)
A ƙasa akwai ƙimar da mai amfani zai iya daidaita daga yankin tsari. Cikakken lambar aikin yana bayyana ta atomatik a ƙasan labarin.
Tsarin Matrix
// Tsarin Matrix
const int MATRIX_PIN = 14; // an kafe shi ga wannan module
const int MATRIX_WIDTH = 8;
const int MATRIX_HEIGHT = 8;
// Shawarar yanayi: Top-Left origin, progressive mode
// (ainihin constructor yana cikin lambar da aka ɗora a ƙasa)
Wannan aikin yana amfani da tsarin NEO_MATRIX_PROGRESSIVE don tabbatar da cewa kibiya tana nuni daidai dangane da motsi na ainihi.
Hasken Haske
uint8_t matrixBrightness = 40; // 0–255
Kana iya ɗaga wannan ƙimar don yanayi mai haske. Don amfani a cikin gida, 30–60 yana da kyau.
Launi na Kibiya
// Launi na kibiya
uint8_t arrowRed = 255;
uint8_t arrowGreen = 0;
uint8_t arrowBlue = 0;
Canza waɗannan ƙimar don gyara launin kibiya. Misali:
- Kibiya kore:
(0, 255, 0) - Kibiya shuɗi:
(0, 0, 255) - Kibiya fari:
(255, 255, 255)
Sensitivity da Smoothing
Don guje wa jijjiga, lambar ta haɗa da dabaru na smoothing da threshold. A cikin saitunan kana iya samun wani abu kamar:
// Daidaita sensitivity / smoothing
float tiltThreshold = 0.30f; // daidaita idan kibiya ta canza da sauƙi
- Idan kibiyar ka ta juyo cikin sauƙi → ƙara maƙogwaron.
- Idan kibiyar ta yi jinkirin canzawa → rage maƙogwaron.
Tsarin Kibiyoyi
Zanen ya haɗa da tsarin bitmap na kibiyoyi don:
- ↑ sama
- ↓ ƙasa
- ← hagu
- → dama
Ba ka buƙatar canza waɗannan, amma za ka iya canza siffofin a cikin lambar idan kana son salo daban.
Taƙaitawa
Aikin na 5 yana nuna yadda ESP32-S3 RGB LED Matrix da QMI8658C accelerometer ke aiki tare don gano yanayin karkata da nuna kibiya wadda koyaushe tana nuna sama. Wannan aikin ya ginu a kan Tilt Dot (Aiki na 4) kuma yana shirya ka don wasan mu'amala na ƙarshe a Aiki na 6.
Cikakken zanen “Arrow Always Up” yana samuwa a ƙarƙashin wannan labarin (an ɗora shi kai tsaye). Ana ba da shawarar sosai ka kalli ɓangaren bidiyon da ya dace don ganin yadda kibiyar ke amsa juyowar allo nan take. Idan kana son gina wannan aikin a gida, hanyoyin haɗin affiliate don ESP32-S3 RGB LED Matrix module suna bayyana a ƙarƙashin sashin lambar.
Hotuna
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 ESP32-S3 RGB LED Matrix 4 - Digon karkata
- 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 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);
}
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