Komponen · 15 mnt baca

LED Matrix MAX7219 dengan Arduino: Teks Berjalan dengan MD_Parola

Panduan MAX7219 Arduino: pengkabelan modul LED matrix 8x8 dan 4-in-1 8x32, teks berjalan dengan MD_Parola, memperbaiki teks terbalik dengan FC16_HW, plus kode jam dan ESP32.

MAX7219 adalah chip driver murah yang sanggup menjalankan 64 LED sendirian, dan merupakan cara termudah untuk memakai LED matrix dengan Arduino. Biasanya kamu akan menemukannya dalam dua bentuk: modul dengan satu dot matrix 8x8 dan modul dot matrix 4-in-1 8x32 yang berisi empat matrix berjajar. MAX7219 hanya butuh 3 kabel sinyal dari Arduino (DIN, CS, CLK); ia memindai baris ratusan kali per detik, mengatur kecerahan, dan mengingat status setiap LED sendiri. Arduino jadi bebas untuk teks berjalan, jam, papan skor, atau animasi, dan kamu bisa membuat layar sepanjang yang kamu mau dengan merangkai modul ujung ke ujung.

Di panduan ini kamu akan mempelajari cara kerja MAX7219, cara menghubungkan modulnya ke Arduino Uno, ESP32, dan Raspberry Pi Pico lewat SPI, cara merangkai beberapa modul, dan cara menampilkan teks berjalan pertamamu dengan library MD_Parola. Setelah itu kamu akan memperbaiki masalah teks terbalik atau tercermin yang menjebak kebanyakan pemula dengan memilih tipe hardware yang benar (FC16_HW), menghitung kecerahan dan konsumsi daya, menampilkan karakter beraksen dan karakter buatan sendiri, serta membuat jam dengan modul RTC dan animasi piksel demi piksel. Bagian terakhir membahas pengiriman pesan dari ponselmu dengan ESP32, kode MicroPython untuk Pico, dan solusi untuk kesalahan yang paling umum.

Modul LED dot matrix MAX7219 4-in-1 8x32
Modul dot matrix MAX7219 4-in-1: empat matrix 8x8 dengan satu chip MAX7219 di bawah masing-masing; modul ini diberi sinyal dari sisi IN dan tersambung ke modul berikutnya dari sisi OUT.

Apa itu MAX7219 dan bagaimana cara kerjanya?

Kamu tidak mungkin menyambungkan 64 LED ke pin Arduino satu per satu, jadi LED matrix memakai multiplexing. Pada matrix 8x8, LED-nya tersusun dalam kisi 8 baris dan 8 kolom. Di setiap momen, MAX7219 hanya mengaktifkan satu kelompok LED (disebut “digit” di datasheet, yang pada matrix berupa satu baris atau satu kolom), mengendalikan jalur lainnya untuk memilih LED mana dari delapan LED di kelompok itu yang menyala, lalu pindah ke kelompok berikutnya. Kedelapan kelompok dipindai sekitar 800 kali per detik; matamu tidak bisa mengikuti kecepatan itu, jadi gambarnya terlihat diam. Sementara itu, chip menyimpan pola tiap kelompok di RAM 8x8 bit miliknya, membatasi arus LED dengan satu resistor saja, dan mengatur kecerahan dalam 16 tingkat.

Arduino berkomunikasi dengan MAX7219 lewat antarmuka serial 3 kabel yang cara kerjanya mirip SPI. Setiap perintah adalah paket 16-bit: byte atas memilih register yang akan ditulis dan byte bawah membawa nilainya. Selama CS (LOAD di datasheet) LOW, bit-bit masuk dari DIN di setiap tepi naik CLK; ketika CS kembali HIGH, paket itu ditulis ke register. Idenya sama dengan shift register 74HC595, tetapi karena MAX7219 juga mengurus pemindaian dan pembatasan arus, pekerjaanmu jauh lebih sedikit. Cara kerja SPI secara umum bisa kamu baca di Apa Itu SPI?.

FiturNilai
Tegangan catu daya4,0–5,5 V (5 V dalam praktik)
AntarmukaSerial 3 kabel (DIN, CLK, CS), sampai 10 MHz
LED yang dikendalikan64 (satu matrix 8x8 atau delapan digit 7-segmen)
Laju pemindaian800 Hz tipikal (8 digit)
Arus segmenDiatur resistor RSET, maks. 40 mA (di modul biasanya 10 kΩ)
Kecerahan16 tingkat, duty cycle dari 1/32 sampai 31/32
Arus shutdownSekitar 150 µA
Ambang input HIGHMinimal 3,5 V (dengan catu daya 5 V)
Merangkai (daisy chain)Output DOUT ke input DIN chip berikutnya

MAX7219 punya 14 register yang bisa dialamati, tetapi yang kamu butuhkan untuk LED matrix ada di tabel di bawah. Library sudah mengaturnya untukmu; meski begitu, mengetahui fungsinya sangat membantu ketika kamu mencari kesalahan. Misalnya, ketika pertama kali diberi daya, chip mulai dalam mode shutdown dengan layar gelap, jadi kalau kode inisialisasi tidak berjalan, modul terlihat mati total. Saudaranya, MAX7221, punya register yang sama tetapi menambahkan pin CS yang benar-benar kompatibel dengan SPI dan driver segmen dengan slew rate terbatas yang mengurangi interferensi elektromagnetik.

AlamatRegisterFungsi
0x00No-OpMembiarkan chip ini tidak berubah selama sebuah paket dikirim ke chip lain di rantai
0x01–0x08Digit 0–7Pola LED 8-bit untuk masing-masing dari delapan baris (atau kolom)
0x09Decode ModeDekode BCD untuk digit 7-segmen; mati (0x00) untuk matrix
0x0AIntensityKecerahan, dari 0x0 sampai 0xF
0x0BScan LimitJumlah digit yang dipindai; 7 (kedelapannya) untuk matrix
0x0CShutdown0: mode shutdown, 1: operasi normal
0x0FDisplay Test1: semua LED menyala dengan kecerahan penuh

Modul tunggal 8x8 atau modul 4-in-1 8x32?

Dua modul yang paling sering kamu temui memakai rangkaian yang sama; bedanya ada pada cara LED matrix disambungkan ke MAX7219 dan bentuk board-nya. Modul tunggal di board hijau memakai MAX7219 DIP (24 pin) dan matrix 8x8 seperti 1088AS, dengan pin input (VCC, GND, DIN, CS, CLK) di satu ujung dan pin output (VCC, GND, DOUT, CS, CLK) di ujung lainnya. Pada modul 4-in-1 berwarna biru, empat chip MAX7219 SMD berada di bawah matrix dan keempat bloknya sudah dirangkai dari pabrik; board-nya biasanya bertanda FC-16. Untuk teks berjalan yang panjang, modul 4-in-1 lebih murah sekaligus lebih rapi.

Modul LED matrix MAX7219 tunggal 8x8
Modul MAX7219 tunggal 8x8: board hijau, MAX7219 DIP, dan dot matrix 8x8; biasanya tampil dengan benar memakai tipe hardware GENERIC_HW di kode.
FiturModul tunggal 8x8Modul 4-in-1 8x32 (FC-16)
Resolusi8x8 = 64 LED32x8 = 256 LED
Jumlah MAX72191 (kemasan DIP)4 (kemasan SMD)
Tipe hardware di kodeBiasanya GENERIC_HWBiasanya FC16_HW
Karakter yang terlihat sekaligus14–6 (tergantung lebar huruf)
Arus maksimum pada kecerahan penuhSekitar 330 mASekitar 1,3 A
Paling cocok untukIkon, dadu, wajah tersenyum, game kecilTeks berjalan, jam, papan skor

Pengkabelan MAX7219: Arduino Uno, ESP32, dan Pico

Modul ini punya lima pin: VCC dan GND untuk daya, DIN untuk data, CLK untuk clock, dan CS untuk chip select (load). Secara default, library MD_Parola dan MD_MAX72XX memakai SPI hardware, jadi DIN harus ke pin MOSI board-mu dan CLK ke pin SCK-nya, sedangkan CS boleh ke pin digital mana saja. Kamu bisa mengecek letak pin SPI hardware di board-mu dengan alat diagram pin. Selalu colokkan kabel ke sisi input (IN) modul, yaitu ujung yang bertanda DIN; ujung yang bertanda DOUT untuk modul berikutnya.

Pin modulArduino UnoESP32Raspberry Pi Pico
VCC5V5V (VIN)VBUS (5 V)
GNDGNDGNDGND
DIND11 (MOSI)GPIO 23 (MOSI)GP19 (SPI0 TX)
CSD10GPIO 5GP17
CLKD13 (SCK)GPIO 18 (SCK)GP18 (SPI0 SCK)
Jangan memberi daya modul MAX7219 dari pin 3,3 V; chip-nya butuh minimal 4 V. Bahkan pada 5 V, satu modul 8x8 bisa menarik lebih dari 300 mA pada kecerahan penuh, dan modul 4-in-1 sampai 1,3 A. Port USB komputer dan sekring USB Arduino dibatasi 500 mA. Jika Arduino reset atau gambarnya berkedip ketika kamu menaikkan kecerahan, beri daya modul dari adaptor 5 V eksternal (minimal 2 A untuk modul 4-in-1) dan selalu hubungkan GND adaptor ke GND Arduino.

ESP32 dan Pico punya pin 3,3 V, sedangkan datasheet MAX7219 meminta minimal 3,5 V sebagai level HIGH dengan catu daya 5 V. Jadi secara teknis sinyal 3,3 V sedikit di bawah batas. Kebanyakan modul tetap bekerja, tetapi dengan kabel panjang atau batch chip tertentu kamu bisa melihat titik acak dan gambar yang rusak. Solusi yang andal adalah buffer seperti 74HCT125, yang menerima 3,3 V sebagai HIGH dan mengeluarkan 5 V, atau konverter level logika yang cepat di jalur DIN, CLK, dan CS. Menjaga kabel sinyal tetap di bawah 20 cm juga sering menyelesaikan masalahnya.

Merangkai modul (daisy chain)

Pin DOUT MAX7219 mengeluarkan data yang masuk ke DIN 16,5 siklus clock kemudian. Jika kamu menghubungkan sisi OUT satu modul ke sisi IN modul berikutnya, DOUT masuk ke DIN chip berikutnya, sedangkan CLK dan CS dipakai bersama oleh semua chip. Dengan begitu, kabel sinyal yang keluar dari Arduino tetap hanya 3, tetapi layarnya bisa sepanjang 8, 16, atau 32 blok. Di setiap pembaruan, library mengirim paket ke sepanjang rantai, dan ketika CS naik, semuanya diperbarui pada momen yang sama. Di modul 4-in-1, sambungan ini sudah ada di board; untuk membuat layar 8 blok (64x8) dari dua modul 4-in-1, cukup hubungkan pin OUT modul pertama ke pin IN modul kedua dan atur MAX_DEVICES menjadi 8 di kodemu.

Di library, nomor blok dimulai dari modul yang paling dekat dengan input DIN dan bertambah ke kiri; untuk MD_MAX72XX, titik asalnya ada di pojok kanan atas layar. Karena itulah input DIN harus tetap berada di sisi kanan agar teksnya terbaca dengan benar. Ketika rantainya makin panjang, daya menjadi batas yang sebenarnya: suntikkan lagi 5 V dan GND ke rantai dengan kabel tebal setiap 4–8 blok, dan tambahkan kapasitor elektrolit 10 µF serta kapasitor keramik 100 nF di input catu daya setiap modul. Datasheet juga menyarankan pasangan ini, untuk meredam riak akibat pulsa arus LED.

Menginstal library: MD_MAX72XX dan MD_Parola

Dua library MAX7219 yang paling populer berasal dari pembuat yang sama (majicDesigns) dan bekerja bersama. MD_MAX72XX mengerjakan bagian tingkat rendah: menginisialisasi modul, menulis piksel dan kolom, serta mengelola font. MD_Parola dibangun di atasnya dengan teks berjalan, efek, perataan, dan zona. Library LedControl yang kamu lihat di contoh-contoh lama juga bisa dipakai, tetapi kamu harus menulis sendiri kode teks berjalannya. Kalau kamu belum pernah menginstal library, baca dulu Cara Instal Library Arduino.

  1. Di Arduino IDE, buka Library Manager (Tools > Manage Libraries) lalu cari MD_Parola.
  2. Instal library MD_Parola dari majicDesigns. Ketika ditanya soal dependensi, pilih Install all supaya MD_MAX72XX ikut terinstal.
  3. Hubungkan modul seperti pada tabel di atas, dan untuk modul 4-in-1 atur HARDWARE_TYPE menjadi FC16_HW dan MAX_DEVICES menjadi 4 di kodemu.
  4. Upload sketch-nya. Kalau teksnya terlihat terbalik, tercermin, atau berputar, jangan khawatir; kamu akan memperbaikinya dengan satu baris saja di bagian tipe hardware di bawah.

Program pertama: teks berjalan dengan MD_Parola

C++ (Arduino IDE)
1// MAX7219 4'lü modülde kayan yazı (MD_Parola) / Scrolling text on a 4-in-1 MAX7219 module (MD_Parola)
2#include <MD_Parola.h>
3#include <MD_MAX72xx.h>
4#include <SPI.h>
5
6#define HARDWARE_TYPE MD_MAX72XX::FC16_HW   // mavi PCB'li 4'lü modül / blue-PCB 4-in-1 module
7#define MAX_DEVICES 4                       // zincirdeki 8x8 blok sayısı / number of 8x8 blocks in the chain
8#define CS_PIN 10                           // DIN = D11 (MOSI), CLK = D13 (SCK)
9
10MD_Parola display = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
11
12void setup() {
13  display.begin();
14  display.setIntensity(4);                  // parlaklık 0–15 / brightness 0–15
15  display.displayClear();
16  // metin, hizalama, hız (ms/kare), bekleme (ms), giriş efekti, çıkış efekti
17  // text, alignment, speed (ms/frame), pause (ms), entry effect, exit effect
18  display.displayText("Merhaba BlueGrays!", PA_CENTER, 50, 1000, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
19}
20
21void loop() {
22  if (display.displayAnimate()) {           // efekt bittiğinde true döner / returns true when the effect ends
23    display.displayReset();                 // aynı yazıyı baştan başlat / restart the same text
24  }
25}

Baris yang paling penting adalah displayText(): fungsi ini menerima teks, perataan (PA_LEFT, PA_CENTER, PA_RIGHT), jeda antar-frame dalam milidetik, lama berhenti setelah teks diam, serta efek masuk dan keluar, dengan urutan itu. Makin kecil nilai kecepatannya, makin cepat teks bergerak; 25–60 ms menghasilkan teks berjalan yang mudah dibaca. displayAnimate() memajukan paling banyak satu frame setiap kali dipanggil lalu langsung kembali. Karena itulah fungsi ini harus dipanggil terus-menerus di loop() dan kamu sebaiknya tidak memakai delay() di bagian kode lainnya; kalau tidak, teksnya tersendat. Cara menunggu tanpa memblokir program ada di millis() vs delay().

FungsiKegunaannya
begin()Menginisialisasi modul, membangunkannya dari shutdown, dan mengosongkan layar
displayText(text, align, speed, pause, effectIn, effectOut) (teks, perataan, kecepatan, jeda, efek masuk, efek keluar)Menetapkan teks dan efek yang akan ditampilkan lalu memulai animasi
displayAnimate()Menggambar frame berikutnya; mengembalikan true ketika efek sudah selesai
displayReset()Memutar ulang teks dan efek yang sama dari awal
print("...")Menampilkan teks statis tanpa efek
setIntensity(0–15)Mengatur kecerahan semua modul
setInvert(true)Menukar LED yang menyala dan yang mati (gambar negatif)
displayShutdown(true)Memasukkan layar ke mode shutdown; false membangunkannya
begin(2) dan setZone(0, 0, 1)Membagi layar menjadi zona-zona terpisah, masing-masing dengan teks dan efeknya sendiri

Selain PA_SCROLL_LEFT, ada banyak efek masuk dan keluar: PA_PRINT (teks muncul sekaligus), PA_SCROLL_UP dan PA_SCROLL_DOWN (bergulir vertikal), PA_WIPE, PA_OPENING dan PA_CLOSING (membuka dari tengah dan menutup ke tengah), PA_FADE (memudar lewat kecerahan), PA_DISSOLVE, PA_BLINDS, PA_RANDOM, dan PA_GROW_UP. Untuk melihat semuanya, upload sketch Parola_Animation_Catalog dari File > Examples > MD_Parola; jangan lupa menyesuaikan baris HARDWARE_TYPE dan MAX_DEVICES dengan modulmu.

Memilih tipe hardware (FC16_HW) dan memperbaiki teks tercermin

Pabrikan menyambungkan matrix 8x8 ke MAX7219 dengan cara yang berbeda-beda: di sebagian board, jalur “digit” chip masuk ke baris, di board lain ke kolom, dan urutan baris atau kolomnya bisa terbalik. Library mengimbanginya dengan pengaturan HARDWARE_TYPE. Kalau kamu memilih tipe yang salah, modulnya tidak rusak, tetapi huruf di setiap blok 8x8 terlihat tercermin, terbalik, atau berputar 90 derajat. Karena kebanyakan kode lama di internet memakai PAROLA_HW atau GENERIC_HW, inilah masalah paling umum pada modul 4-in-1 biru yang dijual sekarang. Tabel di bawah menunjukkan apa yang perlu diubah untuk setiap gejala; tabel ini berdasarkan modul 4-in-1 FC-16.

Yang kamu lihatKemungkinan penyebabSolusi
Huruf tercermin kiri-kanan di setiap blokPAROLA_HW dipilih, urutan kolom terbalikPakai FC16_HW
Huruf berputar 90 derajat di setiap blokGENERIC_HW dipilih, baris dan kolom tertukarPakai FC16_HW
Huruf terbalik atas-bawah di setiap blokICSTATION_HW dipilih, urutan baris dan kolom terbalikPakai FC16_HW
Seluruh teks terbalik dan bergulir dari kiri ke kananPosisi modul terbalik, input DIN ada di kiriPutar modul 180 derajat supaya input DIN ada di kanan
Hanya sebagian blok yang benar, sisanya kosong atau acakMAX_DEVICES tidak sesuai dengan jumlah blok sebenarnyaAtur MAX_DEVICES sesuai jumlah blok
Pada modul tunggal 8x8 berwarna hijau, coba GENERIC_HW lebih dulu; pada modul 4-in-1 biru, coba FC16_HW lebih dulu. Kalau gambarnya masih salah, coba keempat tipe secara bergantian; setiap kali hanya satu baris yang berubah. Untuk mengetahui tipe modulmu dengan pasti, upload sketch MD_MAX72xx_HW_Mapper dari contoh MD_MAX72XX: sketch ini menyalakan LED satu per satu dan menunjukkan di Serial Monitor baris dan kolom mana yang tersambung ke mana.

Kecerahan dan konsumsi daya

Kecerahan bergantung pada dua hal. Yang pertama adalah resistor RSET di modul: chip mengalirkan arus sekitar 100 kali arus yang keluar dari pin ISET ke LED. Modul biasanya memakai 10 kΩ, yang berarti arus puncak sedikit di atas 40 mA untuk LED merah dan sekitar 40 mA untuk LED biru dan putih. Yang kedua adalah register Intensity yang kamu atur lewat software: nilai n dari 0 sampai 15 membuat LED menyala selama (2n+1)/32 dari setiap interval pemindaian, jadi 0 adalah kecerahan terendah (1/32) dan 15 tertinggi (31/32). Dan karena setiap baris hanya menyala seperdelapan waktu, bahkan pada kecerahan penuh satu LED rata-rata hanya sekitar 5 mA. Kamu bisa mengecek tegangan maju berdasarkan warna LED dengan alat tegangan LED.

Arus rata-rata sebuah modul bisa kamu perkirakan kasar seperti ini: I ≈ 8 mA + 5 mA × (2n+1)/32 × L. Di sini 8 mA adalah konsumsi chip itu sendiri, n adalah nilai kecerahan, dan L adalah jumlah LED yang menyala di modul tersebut (0–64); 5 mA adalah seperdelapan dari arus puncak 40 mA. Misalnya, pada kecerahan 15 dengan ke-64 LED menyala, hasilnya 8 + 5 × 0,97 × 64 ≈ 318 mA, sesuai dengan angka 330 mA di datasheet. Teks berjalan biasanya hanya menyalakan 25–35 persen LED, jadi konsumsi sebenarnya jauh lebih rendah. Tabel di bawah menunjukkan nilai tipikal untuk modul 4-in-1.

KondisiPer modulModul 4-in-1 (32x8)
Semua LED menyala, kecerahan 15≈ 320 mA≈ 1,3 A
Semua LED menyala, kecerahan 7≈ 160 mA≈ 630 mA
Teks berjalan (~30% LED), kecerahan 7≈ 55 mA≈ 210 mA
Teks berjalan (~30% LED), kecerahan 2≈ 25 mA≈ 90 mA
Mode shutdown (displayShutdown)≈ 0,15 mA≈ 0,6 mA

Untuk meredupkan layar di malam hari, kamu bisa mengatur kecerahan secara otomatis dengan sensor cahaya LDR, dan menidurkan layar dengan displayShutdown(true) ketika tidak ada orang. Jika kamu merancang papan tulisan bertenaga baterai, masukkan nilai-nilai di atas ke alat kalkulator umur baterai untuk menghitung berapa jam baterainya bertahan. Di dalam ruangan, kecerahan sekitar 2–4, bukan 15, biasanya sudah cukup; lebih nyaman di mata dan memangkas arus LED menjadi kira-kira sepertiga sampai seperenam.

Karakter beraksen dan karakter khusus (UTF-8)

Arduino IDE menyimpan kodemu dalam format UTF-8, jadi huruf seperti “é” atau “ü” di dalam teks tidak berukuran satu byte, melainkan dua. MD_Parola mencari setiap byte sebagai nomor karakter di font, sehingga huruf beraksen berubah menjadi simbol yang tidak bermakna. Font bawaan library berisi seluruh set Latin-1 (é, è, à, ñ, ç, ä, ö, ü, ß, dan lainnya), jadi yang kamu butuhkan hanya fungsi kecil yang mengubah UTF-8 menjadi kode font. Huruf di luar Latin-1, seperti huruf Turki ğ, ı, dan ş pada contoh di bawah, harus digambar piksel demi piksel lalu ditambahkan dengan addChar(). Sketch ini mengerjakan kedua langkah tersebut.

C++ (Arduino IDE)
1// MAX7219 + MD_Parola: Türkçe karakterli kayan yazı / Scrolling text with Turkish letters
2#include <MD_Parola.h>
3#include <MD_MAX72xx.h>
4#include <SPI.h>
5
6#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
7#define MAX_DEVICES 4
8#define CS_PIN 10
9
10MD_Parola display = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
11
12// Fontta olmayan 6 harf: ilk bayt genişlik, sonrakiler sütunlar (bit 0 = en üst satır)
13// 6 letters missing from the font: first byte is the width, then the columns (bit 0 = top row)
14const uint8_t trG[] = {5, 56, 69, 70, 85, 116};  // Ğ
15const uint8_t trg[] = {4, 25, 166, 166, 125};    // ğ
16const uint8_t trI[] = {3, 68, 125, 68};          // İ
17const uint8_t tri[] = {1, 124};                  // ı
18const uint8_t trS[] = {5, 70, 73, 201, 73, 49};  // Ş
19const uint8_t trs[] = {4, 88, 212, 84, 52};      // ş
20
21// UTF-8 metni fontun kodlarına çevirir / converts UTF-8 text to the font's codes
22void utf8ToFont(const char *src, char *dst, size_t size) {
23  size_t n = 0;
24  while (*src && n < size - 1) {
25    uint8_t c = *src++;
26    if (c < 0x80) { dst[n++] = c; continue; }            // ASCII aynen kalır / ASCII stays as is
27    if ((c & 0xE0) == 0xC0 && *src) {                    // 2 baytlık harf / 2-byte letter
28      uint16_t u = ((c & 0x1F) << 6) | (*src++ & 0x3F);
29      switch (u) {
30        case 0x11E: dst[n++] = (char)0x80; break;        // Ğ
31        case 0x11F: dst[n++] = (char)0x81; break;        // ğ
32        case 0x130: dst[n++] = (char)0x82; break;        // İ
33        case 0x131: dst[n++] = (char)0x83; break;        // ı
34        case 0x15E: dst[n++] = (char)0x84; break;        // Ş
35        case 0x15F: dst[n++] = (char)0x85; break;        // ş
36        default: dst[n++] = (u < 0x100) ? (char)u : '?'; // ç ö ü Ç Ö Ü ° fontta var / already in the font
37      }
38      continue;
39    }
40    while ((*src & 0xC0) == 0x80) src++;                 // desteklenmeyen karakteri atla / skip an unsupported character
41    dst[n++] = '?';
42  }
43  dst[n] = '\0';
44}
45
46char message[96];
47
48void setup() {
49  display.begin();
50  display.setIntensity(3);
51  display.addChar(0x80, trG);                // addChar begin()'den sonra / addChar after begin()
52  display.addChar(0x81, trg);
53  display.addChar(0x82, trI);
54  display.addChar(0x83, tri);
55  display.addChar(0x84, trS);
56  display.addChar(0x85, trs);
57  utf8ToFont("Günaydın İstanbul! Şehirde hava 22°C, çok güzel bir gün.", message, sizeof(message));
58  display.displayText(message, PA_LEFT, 40, 1000, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
59}
60
61void loop() {
62  if (display.displayAnimate()) display.displayReset();
63}

Di setiap array karakter buatan, byte pertama adalah lebar huruf dalam kolom dan byte-byte berikutnya adalah kolom dari kiri ke kanan; bit 0 di setiap byte adalah baris paling atas. Misalnya, huruf ı tanpa titik hanya satu kolom, dan nilai 124 (0b01111100) menyalakan baris 2 sampai 6; satu-satunya perbedaan dari huruf i biasa adalah tidak adanya titik di atas. Pada huruf kapital Ğ dan İ, badan hurufnya dibuat dua baris lebih pendek (5 baris, bukan 7) untuk memberi ruang bagi tanda aksennya. addChar() tidak menyalin datanya, hanya menyimpan alamatnya, jadi array-nya harus global dan ditambahkan setelah begin(). Kode 0x80–0x85 dipilih karena tidak pernah muncul di teks biasa. Dengan cara yang sama kamu bisa menambahkan simbol apa pun yang kamu mau, seperti tanda derajat, panah, atau hati.

Contoh jam: jam digital dengan modul RTC

Modul jam RTC DS1307
Modul RTC DS1307: berkat baterai koinnya, modul ini terus menghitung waktu meskipun Arduino mati; tersambung ke bus I2C lewat pin SDA dan SCL.

Penghitung millis() di Arduino kembali ke nol ketika daya hilang, dan karena resonator keramik di Uno, penghitungnya bisa melenceng sampai beberapa menit per hari. Untuk jam sungguhan, pakai modul jam RTC. Hubungkan modul DS1307 ke bus I2C (SDA → A4, SCL → A5, VCC → 5V, GND → GND); MAX7219 memakai pin SPI, jadi kedua modul tidak saling bentrok. Untuk kodenya, instal library RTClib dari Adafruit lewat Library Manager.

C++ (Arduino IDE)
1// MAX7219 + DS1307 RTC ile dijital saat / Digital clock with MAX7219 + DS1307 RTC
2#include <MD_Parola.h>
3#include <MD_MAX72xx.h>
4#include <SPI.h>
5#include <RTClib.h>                         // Adafruit RTClib
6
7#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
8#define MAX_DEVICES 4
9#define CS_PIN 10
10
11MD_Parola display = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
12RTC_DS1307 rtc;                             // SDA = A4, SCL = A5
13
14char timeText[8];                           // "12:34" + sonlandırıcı / + terminator
15uint8_t lastSecond = 99;
16
17void setup() {
18  display.begin();
19  display.setIntensity(2);
20  display.setTextAlignment(PA_CENTER);      // print() bu hizalamayı kullanır / print() uses this alignment
21  if (!rtc.begin()) {
22    display.print("RTC?");                  // modül bulunamadı / module not found
23    while (true) {}
24  }
25  if (!rtc.isrunning()) {
26    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));   // ilk kurulumda derleme saati / compile time on first run
27  }
28}
29
30void loop() {
31  DateTime now = rtc.now();
32  if (now.second() != lastSecond) {         // saniyede bir güncelle / update once a second
33    lastSecond = now.second();
34    // ':' ve boşluk aynı genişlikte, yazı kaymaz / ':' and space are equally wide, nothing shifts
35    sprintf(timeText, (lastSecond % 2) ? "%02d %02d" : "%02d:%02d", now.hour(), now.minute());
36    display.print(timeText);
37  }
38}

Sketch ini membaca waktu sekali per detik dan membuat tanda titik dua berkedip. Di font bawaan, titik dua (:) dan spasi punya lebar yang sama (2 kolom), jadi angkanya tidak melompat-lompat. Ketika RTC berjalan untuk pertama kali, waktunya diatur ke momen sketch dikompilasi. DS1307 bisa melenceng sekitar satu menit per bulan; untuk jam yang lebih akurat, pakai modul DS3231, ganti RTC_DS1307 dengan RTC_DS3231, dan ubah kondisi if (!rtc.isrunning()) menjadi if (rtc.lostPower()). Berkat kristalnya yang terkompensasi suhu, DS3231 hanya melenceng sekitar satu menit per tahun. Kamu juga bisa membagi layar menjadi dua zona untuk menampilkan jam di satu sisi dan suhu di sisi lainnya.

Animasi: menggambar piksel demi piksel dengan MD_MAX72XX

Untuk melangkah lebih jauh dari teks berjalan, kamu bisa memakai library MD_MAX72XX secara langsung. Library ini memperlakukan seluruh rantai sebagai satu layar piksel: modul 4-in-1 punya 32 kolom dan 8 baris. setPoint(row, column, state) menyalakan atau mematikan satu LED, setColumn() menulis kedelapan bit sebuah kolom sekaligus, dan clear() mengosongkan layar. Titik asal (0, 0) ada di pojok kanan atas; nomor kolom bertambah ke kiri dan nomor baris bertambah ke bawah. Kode di bawah menggambar bola yang memantul dari tepi-tepi layar:

C++ (Arduino IDE)
1// MD_MAX72XX ile seken top animasyonu / Bouncing ball animation with MD_MAX72XX
2#include <MD_MAX72xx.h>
3#include <SPI.h>
4
5#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
6#define MAX_DEVICES 4
7#define CS_PIN 10
8
9MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
10
11int x = 0, y = 0;                           // topun konumu (sütun, satır) / ball position (column, row)
12int dx = 1, dy = 1;                         // hareket yönü / direction of travel
13
14void setup() {
15  mx.begin();
16  mx.control(MD_MAX72XX::INTENSITY, 2);
17  mx.clear();
18}
19
20void loop() {
21  const int lastCol = mx.getColumnCount() - 1;          // 4 modülde 31 / 31 with 4 modules
22  mx.control(MD_MAX72XX::UPDATE, MD_MAX72XX::OFF);      // çizim bitene kadar gönderme / hold updates while drawing
23  mx.setPoint(y, x, false);                             // eski konumu sil / erase the old position
24  x += dx;
25  y += dy;
26  if (x <= 0 || x >= lastCol) dx = -dx;                 // kenara çarpınca dön / bounce off the edge
27  if (y <= 0 || y >= 7) dy = -dy;
28  mx.setPoint(y, x, true);                              // yeni konumu yak / light the new position
29  mx.control(MD_MAX72XX::UPDATE, MD_MAX72XX::ON);       // hepsini tek seferde gönder / send everything at once
30  delay(40);
31}

Di setiap frame, pembaruan otomatis (UPDATE) dimatikan dulu, piksel lama dihapus dan piksel baru digambar, lalu UPDATE dinyalakan lagi supaya semua perubahan dikirim ke modul sekaligus. Ini mencegah frame yang setengah jadi muncul di layar. Dengan pendekatan yang sama kamu bisa menggambar dadu, wajah tersenyum, game ular, atau bar level audio. Contoh-contoh MD_MAX72XX juga berisi animasi siap pakai seperti Pac-Man, mata robot, dan jam pasir. Ketika memakai MD_Parola, kamu bisa mengakses fungsi menggambar yang sama lewat getGraphicObject().

Pesan lewat internet dengan ESP32: teks berjalan dari ponselmu

Dengan ESP32, papan teks berjalanmu bisa jadi nirkabel. Kode di bawah terhubung ke jaringan rumahmu, pertama-tama menampilkan alamat IP-nya sendiri sebagai teks berjalan, lalu menampilkan jam yang diambil dari internet (NTP). Buka alamat IP itu di browser ponsel yang terhubung ke Wi-Fi yang sama, dan kamu akan melihat kotak teks; pesan yang kamu ketik mulai berjalan di putaran berikutnya dan tampil bergantian dengan jam. Modul tersambung ke pin VSPI seperti di tabel: CLK ke GPIO 18, DIN ke GPIO 23, dan CS ke GPIO 5. Kalau kamu baru mengenal ESP32, baca dulu Apa Itu ESP32?.

C++ (Arduino IDE)
1// ESP32: telefondan mesaj + internet saati / ESP32: message from your phone + internet time
2#include <WiFi.h>
3#include <WebServer.h>
4#include <time.h>
5#include <MD_Parola.h>
6#include <MD_MAX72xx.h>
7#include <SPI.h>
8
9#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
10#define MAX_DEVICES 4
11#define CS_PIN 5                            // VSPI: CLK = GPIO 18, DIN = GPIO 23
12
13const char* ssid = "AgAdi";                 // Wi-Fi adın / your Wi-Fi name
14const char* password = "Sifre123";          // Wi-Fi şifren / your Wi-Fi password
15
16MD_Parola display = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
17WebServer server(80);
18
19char message[128];
20char nextMessage[128];
21char clockText[8] = "--:--";
22bool newMessage = false;
23bool showClock = false;
24
25const char PAGE[] = R"rawliteral(<!DOCTYPE html><html><head><meta charset="utf-8">
26<meta name="viewport" content="width=device-width"><title>MAX7219</title></head><body>
27<h2>Kayan yazı / Scrolling text</h2>
28<form action="/"><input name="m" maxlength="100"> <button>Gönder / Send</button></form>
29</body></html>)rawliteral";
30
31void handleRoot() {
32  if (server.hasArg("m")) {                 // formdan gelen mesaj / message from the form
33    server.arg("m").toCharArray(nextMessage, sizeof(nextMessage));
34    newMessage = true;
35  }
36  server.send(200, "text/html; charset=utf-8", PAGE);
37}
38
39void setup() {
40  display.begin();
41  display.setIntensity(3);
42  display.print("WiFi..");
43  WiFi.begin(ssid, password);
44  while (WiFi.status() != WL_CONNECTED) delay(500);
45  configTime(3 * 3600, 0, "pool.ntp.org");  // Türkiye UTC+3 / Turkey is UTC+3
46  snprintf(message, sizeof(message), "IP: %s", WiFi.localIP().toString().c_str());
47  server.on("/", handleRoot);
48  server.begin();
49  display.displayText(message, PA_LEFT, 40, 0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
50}
51
52void loop() {
53  server.handleClient();
54  if (display.displayAnimate()) {           // önceki gösterim bitti / the previous show has ended
55    showClock = !showClock;
56    if (newMessage) {                       // yeni mesaj sırayı keser / a new message jumps the queue
57      strlcpy(message, nextMessage, sizeof(message));
58      newMessage = false;
59      showClock = false;
60    }
61    if (showClock) {
62      struct tm t;
63      if (getLocalTime(&t, 10)) strftime(clockText, sizeof(clockText), "%H:%M", &t);
64      display.displayText(clockText, PA_CENTER, 40, 3000, PA_SCROLL_DOWN, PA_SCROLL_UP);
65    } else {
66      display.displayText(message, PA_LEFT, 40, 0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
67    }
68  }
69}

handleRoot() tidak langsung mengirim pesan dari formulir ke layar; pesan itu diparkir dulu di nextMessage. Pesan baru disalin ketika animasi yang sedang berjalan sudah selesai (ketika displayAnimate() mengembalikan true), jadi teks yang sedang dibaca MD_Parola tidak pernah berubah di tengah jalan. Nilai 3 × 3600 di configTime() adalah zona waktu UTC+3 yang dipakai di Turki; untuk Indonesia, ganti 3 dengan 7 (WIB, UTC+7), dan untuk Inggris, ganti baris itu dengan configTzTime("GMT0BST,M3.5.0/1,M10.5.0", "pool.ntp.org"), yang juga menangani waktu musim panas. Untuk pesan beraksen, tambahkan baris addChar() dan fungsi utf8ToFont() dari atas ke sketch ini, lalu ganti baris strlcpy() dengan utf8ToFont(nextMessage, message, sizeof(message)). Untuk waktu internet dan dashboard web real-time, lihat jam NTP ESP32 dan web server ESP32 dan WebSocket.

MAX7219 dengan Raspberry Pi Pico dan MicroPython

Di Pico dengan MicroPython, cara paling praktis adalah menyalin driver open-source max7219.py (micropython-max7219) ke Pico lewat Thonny. Karena driver ini memakai modul framebuf milik MicroPython, fungsi menggambar seperti text(), pixel(), line(), dan rect() langsung siap dipakai, dan orientasinya sudah benar pada modul 4-in-1 FC-16. Beri daya modul dari VBUS (5 V) lalu hubungkan DIN ke GP19, CLK ke GP18, dan CS ke GP17. MicroPython juga memakai pin MISO milik SPI0 (GP16), jadi jangan gunakan pin itu untuk keperluan lain. Font framebuf berukuran 8x8 piksel dan hanya ASCII, jadi modul 4-in-1 menampilkan 4 huruf sekaligus dan huruf beraksen tidak ditampilkan. Untuk pengaturannya, lihat Apa Itu Raspberry Pi Pico? dan dasar-dasar MicroPython.

MicroPython
1# Pico + 4'lü MAX7219 modül: kayan yazı / Pico + 4-in-1 MAX7219 module: scrolling text
2from machine import Pin, SPI
3import time
4import max7219                        # max7219.py Pico'da olmalı / must be on the Pico
5
6# GP18 = SCK -> CLK, GP19 = MOSI -> DIN, GP17 -> CS; GP16 (MISO) boş kalır / GP16 (MISO) stays free
7spi = SPI(0, baudrate=5_000_000, polarity=0, phase=0, sck=Pin(18), mosi=Pin(19))
8display = max7219.Matrix8x8(spi, Pin(17, Pin.OUT), 4)
9display.brightness(3)                 # parlaklık 0–15 / brightness 0–15
10
11def scroll(text, delay_ms=35):
12    width = len(text) * 8             # her harf 8 piksel / each letter is 8 px wide
13    for x in range(32, -width, -1):   # sağdan girip solda kaybolur / enters right, leaves left
14        display.fill(0)
15        display.text(text, x, 0, 1)
16        display.show()
17        time.sleep_ms(delay_ms)
18
19while True:
20    scroll("BlueGrays + Pico")
21    display.fill(0)
22    display.text("Pico", 0, 0, 1)     # 4 harf tam sığar / exactly 4 letters fit
23    display.show()
24    time.sleep(1)
25    display.fill(0)
26    display.rect(0, 0, 32, 8, 1)      # ekran çerçevesi / display frame
27    display.show()
28    time.sleep_ms(500)

Ide proyek MAX7219

  • Papan pesan berjalan: buat papan pesan untuk toko, kelas, atau pintu kamar, lalu ganti pesannya dari ponselmu dengan modul Bluetooth HC-05.
  • Jam, kalender, dan suhu: tampilkan jam dan tanggal dari RTC serta suhu dan kelembapan dari sensor DHT11 secara bergantian.
  • Jam internet dan cuaca: jalankan teks waktu NTP dan suhu dari API cuaca dengan ESP32.
  • Papan skor: jalankan layar dua zona untuk pertandingan tenis meja atau basket dengan remote IR.
  • Game mini: mainkan ular, Pong, atau game menghindari rintangan di layar 32x8 dengan joystick; ide lainnya ada di proyek game Arduino.
  • Pengukur level audio: gambar hasil pembacaan sensor suara sebagai grafik batang 32 kolom.
  • Panel animasi 32x32: tumpuk empat modul 4-in-1 ke atas lalu putar animasi seperti hujan, bintang, dan kembang api.

Kesalahan umum dan cara mengatasinya

GejalaKemungkinan penyebabSolusi
Tidak ada LED yang menyalaTidak ada daya, kabel terpasang di sisi OUT modul, atau pin CS tidak sesuai dengan kodeColokkan kabel ke sisi IN yang bertanda DIN, lalu cek CS_PIN dan catu daya 5 V
Semua LED menyala penuh dan tidak pernah berubahTidak ada data yang masuk: DIN dan CLK tertukar, atau chip tertahan di mode tesHubungkan DIN ke MOSI dan CLK ke SCK, lalu matikan dan nyalakan lagi modulnya
Huruf tercermin, terbalik, atau berputar 90 derajatHARDWARE_TYPE salahCoba FC16_HW di modul 4-in-1 dan GENERIC_HW di modul tunggal
Seluruh teks terbalik dan bergulir dari kiri ke kananModul terpasang terbalik, input DIN ada di kiriPutar modul 180 derajat; input DIN harus ada di kanan
Hanya satu blok yang bekerja atau teksnya terlihat terpotongMAX_DEVICES salah atau sambungan antarmodul putusAtur MAX_DEVICES sesuai jumlah blok dan cek kabel OUT → IN
Arduino reset atau gambarnya berkedip pada kecerahan tinggiBatas USB 500 mA terlampaui dan tegangannya turunPakai adaptor eksternal 5 V 2 A, satukan ground-nya, dan turunkan kecerahan
Titik acak dan karakter rusak di ESP32Sinyal 3,3 V berada di bawah ambang HIGH 3,5 V, dan kabelnya panjangNaikkan levelnya dengan 74HCT125 dan perpendek kabelnya
Huruf beraksen muncul sebagai simbol yang tidak bermaknaByte UTF-8 langsung dikirim ke fontPakai cara utf8ToFont() dan addChar()
Teks berjalan tersendat dan patah-patahAda delay() atau tugas panjang di loop()Panggil displayAnimate() sesering mungkin dan atur jeda dengan millis()
Kalau ada yang tidak bekerja, mulailah dari tes paling sederhana: sisakan hanya display.begin() dan display.print("8888") di kode. Jika tidak ada LED yang menyala, masalahnya ada di pengkabelan atau catu daya; pakai multimeter untuk mengecek apakah ada 4,5–5 V di antara pin VCC dan GND modul. Jika LED menyala tetapi angkanya kacau, masalahnya ada di tipe hardware; jika hanya blok pertama yang bekerja, periksa MAX_DEVICES atau sambungan antarmodul.

MAX7219 adalah salah satu cara termurah untuk mendapatkan layar yang mencolok hanya dengan beberapa kabel: chip-nya mengurus pemindaian, pembatasan arus, dan kecerahan, jadi kamu bisa fokus pada apa yang mau ditampilkan. Mulailah dengan menggambar ikon di satu modul 8x8, lalu lanjut ke teks berjalan, jam, dan pesan nirkabel dengan ESP32 di modul 4-in-1. Kalau kamu ingin LED berwarna yang bisa dikendalikan satu per satu, LED WS2812B NeoPixel adalah pilihan yang bagus, dan untuk proyek yang hanya menampilkan angka, pakai display 7-segmen. Di aplikasi BlueGrays kamu akan menemukan proyek MAX7219 seperti jam dan kalender dot matrix, stasiun cuaca, animasi 32x8, dan teks berjalan, langkah demi langkah lengkap dengan skema rangkaian dan kodenya.

Pertanyaan umum

Kenapa teks di modul MAX7219-ku terlihat terbalik atau tercermin?

Pabrikan menyambungkan matrix 8x8 ke MAX7219 dengan cara yang berbeda-beda, dan library mengimbanginya dengan pengaturan HARDWARE_TYPE. Kebanyakan modul 4-in-1 biru yang dijual sekarang tampil dengan benar memakai FC16_HW, dan modul tunggal hijau memakai GENERIC_HW. Kalau gambarnya masih salah, coba juga PAROLA_HW dan ICSTATION_HW; hanya satu baris kode yang berubah.

Berapa banyak modul MAX7219 yang bisa dirangkai (daisy chain)?

Chip-nya sendiri tidak punya batas, dan karena MD_MAX72XX menyimpan jumlah modul dalam satu byte, software-nya mengizinkan sampai 255. Dalam praktik, batasnya ditentukan oleh daya dan kualitas sinyal: suntikkan lagi 5 V dan GND ke rantai setiap 4–8 blok, jaga kabel tetap pendek, dan tambahkan kapasitor 10 µF dan 100 nF di setiap modul. Makin panjang rantainya, makin lama setiap pembaruan dan makin banyak RAM yang dipakai.

Apakah MAX7219 bisa bekerja dengan ESP32 di 3,3 V?

MAX7219 butuh catu daya minimal 4 V, jadi beri daya modul dari pin 5V (VIN) ESP32. Datasheet meminta 3,5 V sebagai level HIGH dengan catu daya 5 V; sinyal 3,3 V dari ESP32 tetap bekerja di kebanyakan modul, tetapi berada di bawah batas itu. Untuk operasi yang andal, pasang level shifter seperti 74HCT125 di jalur DIN, CLK, dan CS.

Berapa arus yang ditarik LED matrix MAX7219?

Satu modul 8x8 dengan semua LED menyala pada kecerahan penuh menarik sekitar 330 mA, dan modul 4-in-1 8x32 sampai 1,3 A. Pada teks berjalan, hanya sebagian LED yang menyala dan kecerahan biasanya dijaga antara 2 dan 7, jadi modul 4-in-1 biasanya menarik sekitar 100–250 mA. Dalam mode shutdown, setiap chip hanya memakai sekitar 150 µA.

Bagaimana cara menampilkan karakter beraksen atau karakter khusus di MAX7219?

Font bawaan MD_Parola berisi karakter Latin-1 seperti é, ñ, ä, ö, ü, dan ß, tetapi Arduino IDE menyimpannya sebagai dua byte UTF-8. Ubah teksnya menjadi kode font dengan fungsi kecil sebelum ditampilkan. Karakter di luar Latin-1 bisa kamu gambar sendiri lalu ditambahkan dengan addChar().

Apakah MAX7219 bisa mengendalikan display 7-segmen?

Bisa. MAX7219 sebenarnya dirancang untuk display 7-segmen common cathode sampai 8 digit, dan punya mode BCD yang mendekode angka sendiri. Kamu bisa dengan mudah memakai modul display MAX7219 8 digit siap pakai dengan fungsi setDigit() dari library LedControl. Display common anode tidak bisa dihubungkan langsung ke chip ini.

Lihat semua proyek
Jam dan Kalender Dot Matrix (MAX7219, DS1307)
#84Menengah
Premium

Jam dan Kalender Dot Matrix (MAX7219, DS1307)

Papan bercahaya untuk meja atau dinding yang menampilkan waktu dan tanggal dengan teks berjalan. Layar LED 8x32 menampilkan jam berangka besar dengan dua titik yang berkedip setiap detik; di awal seti

5.0(37)
59
Jam, Kalender, dan Stasiun Cuaca Dot Matrix (MAX7219, DS1307)
#85Menengah
Premium

Jam, Kalender, dan Stasiun Cuaca Dot Matrix (MAX7219, DS1307)

Papan teks berjalan untuk meja atau dinding yang menampilkan waktu, tanggal, dan cuaca ruangan secara bergantian. Di layar LED 8x32, kamu pertama melihat suhu dalam Celsius dan Fahrenheit, lalu kelemb

5.0(50)
66
Animasi LED dan Teks Matrix 4x 32x8
#90Menengah
Premium

Animasi LED dan Teks Matrix 4x 32x8

Tumpuk empat modul LED matrix panjang dan kamu mendapat layar persegi dengan lebih dari seribu titik cahaya. Pertama, huruf-huruf berjatuhan dari atas seperti hujan di film, lalu tirai terbuka dan dua

4.6(40)
66
LED Matrix 4x 32x8 - Paket 6 Animasi
#91Menengah
Premium

LED Matrix 4x 32x8 - Paket 6 Animasi

Empat panel LED 32x8 yang ditumpuk membentuk layar persegi tempat enam animasi diputar bergiliran: hujan digital yang berjatuhan, spiral yang membesar, sel-sel yang lahir dan mati dengan sendirinya, c

4.5(35)
48
Ular Piksel Matrix 8x8
#88Mahir
Premium

Ular Piksel Matrix 8x8

Buat sendiri dan mainkan game ular klasik. Di matrix lampu 8x8 yang berwarna-warni, kamu mengarahkan ular hijau dengan joystick dan memakan apel merah; di setiap apel ular bertambah panjang, sedikit l

4.7(39)
57
Jam Real-Time dari Internet lewat NTP ESP32
#128Mahir
Premium

Jam Real-Time dari Internet lewat NTP ESP32

ESP32 tersambung ke Wi-Fi dan mengambil waktu nyata dengan presisi milidetik dari server NTP (Network Time Protocol). Berkat fungsi configTzTime(), zona waktu Turki (TRT, UTC+3) otomatis diterapkan, dan pergantian DST di negara yang memakai waktu musim panas otomatis diatur dengan string POSIX TZ. Waktunya ditampilkan di Serial Monitor sekaligus di LCD I2C opsional. configTzTime() memulai layanan SNTP; sinkronisasi ulang berkala terjadi selama koneksi tersedia.

4.5(13)
21
Jam Digital dengan ESP32 dan RTC DS1307 (I2C + LCD)
#120Menengah
Premium

Jam Digital dengan ESP32 dan RTC DS1307 (I2C + LCD)

Di proyek ini, kita menampilkan waktu dan tanggal di layar LCD I2C 16x2 memakai modul jam real-time (RTC) DS1307. DS1307 adalah RTC berbaterai cadangan yang tetap menjaga waktu meskipun ESP32 dimatikan. Kedua modul berbagi bus I2C yang sama (SDA/SCL), sehingga kita belajar mengendalikan beberapa perangkat hanya dengan dua kabel sinyal. Lewat proyek ini kamu mendapat pengetahuan praktis tentang protokol komunikasi I2C, cara kerja modul RTC, dan tampilan data dinamis di LCD.

4.6(26)
40
Jam Digital dengan Layar 7 Segmen 4 Digit
#48Menengah
Premium

Jam Digital dengan Layar 7 Segmen 4 Digit

Jam digital empat digit yang menyala, mirip jam di oven dapur. Modul jam DS1302 menjaga waktu, dan setiap detik Arduino membaca jam dan menit lalu menampilkannya di layar empat digit, dengan titik kec

4.8(56)
73