Bu eğitim şunun parçasıdır: 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 4 - Eğim noktası
Proje 4 – Eğim Noktası (ESP32-S3 RGB LED Matrisini Eğerek Noktayı Hareket Ettirme)
Proje 4, ESP32-S3 RGB LED Matris modülüne yerleşik hareket sensörünü tanıtır. Noktayı otomatik hareket ettirmek (Proje 1 gibi) veya metin kaydırmak (Proje 2 ve 3) yerine, bu proje kartı eğerek noktanın konumunu kontrol etmenizi sağlar. Nokta, modülün arkasındaki QMI8658C ivmeölçerden alınan canlı okumalara dayalı olarak 8×8 RGB ekran üzerinde yumuşak bir şekilde hareket eder.
Bu serideki altı projenin tamamı tek bir YouTube videosunda gösterilmektedir. Aynı video bu sayfaya gömülüdür, böylece kart eğildikçe noktanın gerçek zamanlı olarak nasıl hareket ettiğini tam olarak görebilirsiniz. Bu projenin tam kodu makalenin altında otomatik olarak yüklenir ve modül için bağlı kuruluş satın alma bağlantıları kod bölümünün altında görünür.


ESP32-S3 RGB LED Matris Modülü Genel Bakış
Bu proje, aşağıdakileri içeren ESP32-S3 RGB LED Matris modülünü kullanır:

- ESP32-S3 mikrodenetleyici Wi-Fi ve Bluetooth ile
- 8×8 RGB LED matris (64 ayrı ayrı adreslenebilir LED)
- Eğim ve hareket algılama için arkada QMI8658C ivmeölçer
- Programlama ve güç için USB bağlantı noktası
- Boot / Reset düğmeleri
- Gelecekteki genişletmeler için Kullanılabilir GPIO pinleri
QMI8658C sensörü, kartın nasıl eğildiğine bağlı olarak noktanın yukarı/aşağı/sağa/sola hareket etmesini sağlayan X, Y ve Z ivme ve yönelim değerlerini okur.

Videoda Kapsanan Projeler (Zaman Damgaları)
- 00:00 – Giriş
- 02:01 – ESP32 kartlarını kurma
- 03:32 – Kütüphaneleri kurma
- 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ı (bu proje)
- 18:55 – Proje 5: Yukarı Ok
- 20:02 – Proje 6: Hedef Oyunu
Videodaki eğim gösterimini izlemeniz şiddetle önerilir, çünkü noktanın kartın yönelimine nasıl yumuşak bir şekilde tepki verdiğini görebilirsiniz.

Arduino IDE'de ESP32 Kartlarını Kurma
Daha önceki herhangi bir projeyi tamamladıysanız, kart desteği zaten kuruludur. Aksi takdirde şu adımları izleyin:
Dosya > Tercihleröğesini açın → ESP32 Boards URL'sini ekleyin.Araçlar > Kart > Kart Yöneticisi…bölümüne gidin ve ESP32'yi kurun.
li>Araçlar > Bağlantı Noktasıaltında doğru COM bağlantı noktasını seçin.
Araçlar > Kart altında ESP32-S3 kartınızı seçin.
Gerekli Kütüphaneleri Kurma
Bu proje aşağıdaki kütüphaneleri gerektirir:
Adafruit NeoMatrixAdafruit NeoPixelAdafruit GFX LibraryQMI8658(hareket sensörü)
Bunları Kütüphane Yöneticisi'nde kurun:
Eskiz > Kütüphane Ekle > Kütüphaneleri Yönet…öğesini açın.- Adafruit NeoMatrix arayın → Kur'a tıklayın.
- Adafruit GFX ve Adafruit NeoPixel otomatik kurulumuna izin verin.
- Listelenen yazarına göre QMI8658 arayın → Kur'a tıklayın.
Proje 4 Nasıl Çalışır
QMI8658C sensörü, X, Y ve Z eksenleri boyunca sürekli olarak ivme verileri sağlar. Bu proje için yalnızca X ve Y eksenlerini kullanarak şunlara karar veririz:
- Noktanın sola veya sağa ne kadar hareket edeceği (X ekseni)
- Noktanın yukarı veya aşağı ne kadar hareket edeceği (Y ekseni)
Sensör değerleri, 8×8 LED matrisi için 0 ile 7 arasında bir koordinat aralığına eşlenir. Nokta konumu saniyede birçok kez güncellenir ve modülü eğdiğinizde yumuşak kayma efekti verir.
Proje 4 – Kod Ayarları (Eğim Noktası)
Aşağıda, proje kodunun başında bulunan kullanıcı tarafından düzenlenebilir ayarlar yer almaktadır. Tam taslak makalenin altında otomatik olarak görünür.
Matris Pini ve Boyutu
// 8×8 RGB matris yapılandırması
const int MATRIX_PIN = 14; // bu kart için sabit pin
const int MATRIX_WIDTH = 8;
const int MATRIX_HEIGHT = 8;
MATRIX_PIN değerini 14 olarak bırakın. Kart üzerindeki matrise sabit olarak bağlıdır.
Parlaklık
// Genel parlaklık (0–255)
uint8_t matrixBrightness = 40;
Gerekirse artırın, ancak yakından bakarken aşırı parlaklıktan kaçının.
Nokta Rengi
// Nokta rengi (R, G, B)
uint8_t dotRed = 0;
uint8_t dotGreen = 200; // açık yeşil (varsayılan)
uint8_t dotBlue = 0;
Herhangi bir renk oluşturmak için bu değerleri değiştirin. Örnekler:
- Kırmızı:
(255, 0, 0) - Sarı:
(255, 255, 0) - Beyaz:
(255, 255, 255)
Hareket Hassasiyeti
Aşırı sıçramaları önlemek için ivmeölçer değerleri genellikle sınırlanır veya ölçeklenir. Tipik bir ayar şuna benzer:
// Eğimin hareketi ne kadar agresif etkilediği
float sensitivity = 4.0f; // daha büyük = ekranda daha hızlı hareket
Nokta çok yavaş hareket ediyorsa → değeri artırın. Nokta çok ani hareket ediyorsa → azaltın.
Güncelleme Hızı (Yenileme Oranı)
Güncellemeler arasına küçük bir gecikme ekleyerek hareketi yumuşatabilirsiniz:
// Konum güncellemeleri arasındaki gecikme (ms)
int refreshDelayMs = 20; // düşük = daha pürüzsüz ve daha hızlı tepki
10–30 ms arasındaki değerler çok duyarlı hissettirir.
Özet
Proje 4, ESP32-S3’ün dahili QMI8658C ivmeölçerini hayata geçirerek LED matrisini fiziksel hareketle kontrol etmenizi sağlar. Kartın hafif bir eğimi, noktayı aynı yönde hareket ettirir ve bu proje, daha gelişmiş “Arrow Up” ve “Target Game” projeleri için mükemmel bir basamak taşıdır.
Tilt Dot taslağının tamamı bu makalenin altında (otomatik olarak) yüklenmiştir. En iyi anlayış için videodaki eğim gösterimini izleyin; kart döndürüldükçe noktanın ne kadar pürüzsüz hareket ettiğini görebilirsiniz. ESP32-S3 RGB LED Matrix modülünü satın alma bağlantıları kod bölümünün altında yer almaktadır.
Bu eğitim şunun parçasıdır: 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 5 - Ok her zaman yukarı
- 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 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);
}
İ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