This tutorial is part of: ESP32-S3 RGB LED Matrisi
ESP32-S3 RGB Matris modülü kullanılarak hem eğlence hem de pratik uygulamalar için oluşturulabilecek harika bir proje. Diğer videolara ait bağlantılar bu yazının altında yer almaktadır.
ESP32-S3 RGB LED Matris Projesi 5 - Ok her zaman yukarı
Proje 5 – Ok Her Zaman Yukarıyı Gösterir (QMI8658C Kullanarak Yön Göstergesi)
Proje 5, ESP32-S3 RGB LED Matrisin yönünü algılamak için QMI8658C hareket sensörünü kullanır ve yerçekimine göre her zaman yukarıyı gösteren bir ok görüntüler. Kartı nasıl çevirirseniz çevirin—USB tarafı yukarıda, OUSB tarafı yukarıda, “15” tarafı veya “34” tarafı—ok otomatik olarak döner ve fiziksel olarak yukarı yönü gösterir.
Bu, dahili ivmeölçeri kullanan gerçek zamanlı yön algılamanın güçlü bir gösterimidir. Bu modül için altı projenin tamamı, bu sayfada da gömülü olan tek bir YouTube videosunda gösterilmektedir. Proje 5'in tam kodu makalenin altında otomatik olarak yüklenir ve bağlı kuruluş bağlantıları kod bölümünün altında görünür.

ESP32-S3 RGB LED Matris Modülü Genel Bakış
ESP32-S3 RGB LED Matris modülü, bu projeyi mümkün kılan birkaç bileşen içerir:

- ESP32-S3 mikrodenetleyici — Wi-Fi, BLE sağlar ve LED/IMU mantığını çalıştırır.
- 8×8 RGB LED matris — oku dört yönden herhangi birinde görüntüler.
- QMI8658C ivmeölçer — eğimi, hareketi ve yönü algılar.:contentReference[oaicite:0]{index=0}
- USB-C bağlantı noktası Arduino IDE'de güç ve programlama için.
- Sıfırlama ve Boot düğmeleri taslakları yüklemek için.
- GPIO pinleri ek projeler için kartın çevresinde mevcuttur.
Ok yönü tamamen ivmeölçer okumalarıyla belirlenir. Kart döndürüldüğünde, QMI8658C yeni X/Y/Z değerlerini algılar ve taslak hangi ok deseninin (↑, ↓, ←, →) çizileceğini seçer.

Videoda Kapsanan Projeler (Zaman Damgaları)
- 00:00 – Giriş
- 02:01 – ESP32 kartlarını yükleme
- 03:32 – Kütüphaneleri yükleme
- 05:32 – Proje 1: Hareket Eden Nokta
- 11:11 – Proje 2: Metin Kaydırma
- 12:59 – Proje 3: HTTP Metni
- 16:41 – Proje 4: Eğim Noktası
- 18:55 – Proje 5: Ok Her Zaman Yukarıyı Gösterir (bu proje)
- 20:02 – Proje 6: Hedef Oyunu
Video, modülün nasıl çevrildiğine bağlı olarak okun yönünün nasıl anında değiştiğini açıkça gösterir. Bu bölümü izlemeniz şiddetle önerilir.:contentReference[oaicite:1]{index=1}

Arduino IDE'de ESP32 Kartlarını Yükleme
Daha önceki bir projeyi tamamladıysanız, kart kurulumu zaten yapılmıştır. Aksi takdirde:
Dosya > Tercihler→ ESP32 kart URL'sini ekleyinAraçlar > Kart > Kart Yöneticisi…→ “ESP32”yi yükleyinAraçlar > Kartaltında ESP32-S3 kartını seçinAraçlar > Bağlantı Noktasıaltında doğru USB COM bağlantı noktasını seçin
Gerekli Kütüphaneleri Yükleme
Proje 5 şunları kullanır:
Adafruit NeoMatrixAdafruit NeoPixelAdafruit GFXQMI8658(hareket sensörü)
Eskiz > Kütüphane Ekle > Kütüphaneleri Yönet…- Ara: NeoMatrix → Yükle
- Bağımlılıkları yükleyin: NeoPixel + GFX
- QMI8658i yazarına göre arayın ve yükleyin
Proje 5 Nasıl Çalışır
QMI8658C, X, Y ve Z eksenlerinde yerçekimini ölçer. Bu değerleri karşılaştırarak, taslak kartın hangi fiziksel tarafının yukarı baktığını belirler:
- USB tarafı yukarıda
- OUSB tarafı yukarıda (USB'nin karşısı)
- “15” tarafı yukarıda
- “34” tarafı yukarıda
Her yön, 8×8 matriste farklı bir ok desenine karşılık gelir. Eşleme, daha önceki hata ayıklama oturumlarından onaylanan yön mantığınızı izler. Kartın dönüşü sürekli okunur ve yukarı taraf değiştiğinde ok anında güncellenir.
Proje 5 – Kod Ayarları (Ok Her Zaman Yukarıyı Gösterir)
Aşağıda, yapılandırma alanından kullanıcı tarafından ayarlanabilir değerler bulunmaktadır. Tam proje kodu makalenin altında otomatik olarak görünür.
Matris Yapılandırması
// Matris yapılandırması
const int MATRIX_PIN = 14; // bu modül için sabit
const int MATRIX_WIDTH = 8;
const int MATRIX_HEIGHT = 8;
// Önerilen yön: Sol-Üst başlangıç, ilerlemeli mod
// (gerçek yapıcı aşağıda yüklenen kodun içindedir)
Bu proje, okun gerçek harekete göre doğru şekilde işaret etmesini sağlamak için NEO_MATRIX_PROGRESSIVE düzenini kullanır.
Parlaklık
uint8_t matrixBrightness = 40; // 0–255
Daha parlak ortamlar için bu değeri artırabilirsiniz. İç mekan kullanımı için 30–60 rahattır.
Ok Rengi
// Ok rengi
uint8_t arrowRed = 255;
uint8_t arrowGreen = 0;
uint8_t arrowBlue = 0;
Okun rengini değiştirmek için bu değerleri değiştirin. Örneğin:
- Yeşil ok:
(0, 255, 0) - Mavi ok:
(0, 0, 255) - Beyaz ok:
(255, 255, 255)
Hassasiyet ve Yumuşatma
Titremeyi önlemek için kod, yumuşatma ve eşik mantığı içerir. Ayarlarda şöyle bir şey bulabilirsiniz:
// Hassasiyet / yumuşatma ayarı
float tiltThreshold = 0.30f; // ok çok kolay değişiyorsa ayarlayın
- Okunuz çok kolay ters dönüyorsa → eşiği artırın.
- Ok değişmekte çok yavaşsa → eşiği azaltın.
Ok Desenleri
Kod, aşağıdakiler için ok bitmap desenleri içerir:
- ↑ yukarı
- ↓ aşağı
- ← sol
- → sağ
Bunları değiştirmeniz gerekmez, ancak farklı bir stil istiyorsanız kod içindeki şekilleri değiştirebilirsiniz.
Özet
Proje 5, ESP32-S3 RGB LED Matris ve QMI8658C ivmeölçerin, yönü algılamak ve her zaman yukarıyı gösteren bir ok görüntülemek için birlikte nasıl çalıştığını gösterir. Bu proje, Tilt Dot (Proje 4) üzerine inşa edilir ve sizi Proje 6'daki son etkileşimli oyuna hazırlar.
Tam “Ok Her Zaman Yukarı” kodu bu makalenin altında mevcuttur (otomatik yüklenir). Videonun ilgili kısmını izlemeniz, okun kart dönüşüne ne kadar anında tepki verdiğini görmek için şiddetle önerilir. Bu projeyi evde kurmak isterseniz, ESP32-S3 RGB LED Matris modülü için bağlı kuruluş bağlantıları kod bölümünün altında yer alır.
Görseller
This tutorial is part of: ESP32-S3 RGB LED Matrisi
- ESP32-S3 RGB LED Matris Projesi 1- Temel Nokta
- ESP32-S3 RGB LED Matris Projesi 2 - Kayan Metin
- ESP32-S3 RGB LED Matris Projesi 3 - Cep telefonundan metin
- ESP32-S3 RGB LED Matris Projesi 4 - Eğim noktası
- ESP32-S3 RGB LED Matris Projesi 6 - Cible oyunu
- ESP32-S3 RGB LED Matris Wi-Fi + NTP Saat Projesi -1 Temel Saat
- ESP32-S3 RGB LED Matris İnternet Saati Projesi - 2 Saat Çok Renkli Zaman ve Tarih Gösterimi
- ESP32-S3 RGB LED Matris İnternet Saati Projesi - Tarih ile 3 Gece Rengi
- ESP32-S3 RGB LED Matris İnternet Saati Projesi - 5 Gökkuşağı rengi
- ESP32-S3 RGB LED Matris İnternet Saati Projesi - 4 Rastgele renk
- 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);
}
İhtiyacın olabileceğini düşünüyor
-
Amazon
-
eBay
-
AliExpressPurchase ESP32-S3 RGB Matrix from AliExpresss.click.aliexpress.com
-
AliExpressPurchase ESP32-S3 RGB Matrix from AliExpress (2)s.click.aliexpress.com
Kaynaklar ve referanslar
-
Dahili🎨 Color picker Toolrobojax.com
Dosyalar📁
Fritzing Dosyası
-
esp32-S3-supermini-tht fritzing part
esp32-S3-supermini-tht.fzpz0.02 MB