Panduan · 13 mnt baca

LED Berjalan Knight Rider dengan Arduino: Rangkaian, Kode, dan Pengatur Kecepatan

Buat LED berjalan Knight Rider dengan Arduino: pengkabelan 8 LED dan 220 Ω, kode dengan array dan for loop, kecepatan lewat potensiometer, millis, 74HC595, WS2812B, ESP32, dan Pico.

Rangkaian Knight Rider Arduino adalah efek LED klasik: sederet LED menyala bergantian, menyapu dari satu ujung ke ujung lain lalu kembali lagi. Namanya diambil dari lampu pemindai di bagian depan KITT, mobil yang bisa bicara dalam serial TV terkenal tahun 1980-an. Yang kamu butuhkan cuma Arduino Uno, 6 atau 8 LED, satu resistor 220 Ω untuk setiap LED, dan beberapa kabel jumper. Kalau cahayanya hanya mengalir ke satu arah lalu mulai lagi dari awal, efek itu disebut LED berjalan atau LED chaser. Keduanya proyek klasik yang biasa dibuat pemula tepat setelah lampu lalu lintas, dan merupakan cara paling seru untuk mempelajari dua alat terpenting dalam pemrograman: array dan for loop.

Di panduan ini kamu akan merakit rangkaiannya dan menulis kode LED berjalan dulu, lalu kode Knight Rider yang bolak-balik. Setelah itu kamu akan mengatur kecepatan dengan potensiometer, menambahkan efek LED yang menumpuk di satu ujung, dan menjalankan efek yang sama dengan millis() tanpa pernah memblokir kode. Di bagian terakhir kamu akan menemukan cara mengendalikan 8 LED hanya dari 3 pin dengan chip 74HC595, cara membuat Knight Rider berekor dari satu pin saja dengan LED addressable WS2812B, versi ESP32 dan Raspberry Pi Pico (MicroPython), serta solusi untuk kesalahan yang paling sering terjadi.

LED 5 mm warna merah, kuning, biru, hijau, dan putih
Untuk tampilan Knight Rider klasik, pakai 6 atau 8 LED 5 mm dengan warna yang sama (idealnya merah); kaki panjang adalah anoda (+) dan kaki pendek katoda (−).

Apa itu efek Knight Rider, dan apa bedanya dengan LED berjalan?

Di serial itu, lampu merah di bumper depan KITT menyapu ke kiri dan ke kanan tanpa henti seperti mata yang sedang memindai. Dalam elektronika, efek ini juga disebut Larson scanner, diambil dari nama produser acaranya, Glen A. Larson; mata robot Cylon di serialnya yang lain, Battlestar Galactica, bekerja dengan cara yang sama. Pada pemindai aslinya, kamu bisa melihat jejak merah yang perlahan memudar, yaitu ekor, di belakang titik yang menyala. Di rangkaian LED sederhana, setiap LED hanya menyala penuh atau mati total; untuk meniru ekor itu, kamu harus meredupkan LED secara bertahap dengan PWM. Itulah yang nanti akan kita lakukan dengan WS2812B dan ESP32. Tabel di bawah merangkum efek yang akan kamu kodekan di artikel ini dan berapa langkah yang dibutuhkan satu putaran dengan 8 LED.

EfekApa yang dilakukanSatu putaran dengan 8 LEDDi artikel ini
LED berjalanSatu cahaya mengalir dari kiri ke kanan, lalu mulai lagi8 langkahLangkah 1
Knight RiderSatu cahaya memantul di antara kedua ujung14 langkahLangkah 2 dan 3
MenumpukSetiap cahaya berlari ke tempat kosong paling kanan dan berhenti di sana36 langkahLangkah 4
Bertemu di tengahDua cahaya datang dari kedua ujung ke tengah, lalu menjauh lagi8 langkahBagian 74HC595
Knight Rider berekorLED kepala menyala paling terang, LED di belakangnya memudar14 langkahBagian WS2812B dan ESP32

Daftar komponen dan memilih resistor

KomponenJumlahCatatan
Arduino Uno (atau Nano)1ESP32 atau Raspberry Pi Pico juga bisa
LED 5 mm6–8Warna dan batch produksi yang sama supaya terangnya terlihat setara
Resistor 220 Ω6–8Satu per LED; 330 Ω di Pico
Potensiometer 10 kΩ (B10K)1Hanya untuk versi yang kecepatannya bisa diatur
Breadboard1Ukuran setengah (400 lubang) sudah cukup
Kabel jumper12–15Male ke male
74HC595 atau stick WS2812B 8 LED1Opsional: untuk bagian hemat pin dan efek ekor

LED tidak membatasi arusnya sendiri, jadi setiap LED diberi resistor seri. Nilainya kamu cari dengan hukum Ohm: R = (tegangan catu − tegangan maju LED) / arus. LED merah punya tegangan maju sekitar 2 V, jadi pada 5 V dengan 220 Ω arusnya (5 − 2) / 220 ≈ 13,6 mA. Arus itu membuat LED menyala cukup terang dan tetap di bawah 20 mA yang direkomendasikan untuk satu pin Arduino. Pada efek menumpuk, ketika kedelapan LED menyala bersamaan, total arusnya sekitar 109 mA, masih di dalam batas 200 mA Uno untuk semua pin sekaligus. Untuk mengenali resistor 220 Ω dari gelang warnanya, pakai alat kode warna resistor; untuk warna dan tegangan lain, coba kalkulator resistor LED.

Pengkabelan: 8 LED dan sebuah potensiometer

Kaki panjang (anoda) setiap LED terhubung lewat resistor ke pin digital di board, dan kaki pendek (katoda) ke GND. Di breadboard, cara paling rapi adalah menghubungkan pin GND Arduino ke jalur biru (−) breadboard, lalu membawa kaki pendek kedelapan LED ke jalur itu. Susun LED dengan jarak yang sama dari kiri ke kanan sesuai urutan pin; dengan begitu urutan di array kode sama dengan urutan fisik cahayanya. Dua kaki luar potensiometer masuk ke 5V dan GND, sedangkan kaki tengahnya (wiper) ke A0. Tabel di bawah menunjukkan pin yang dipakai semua sketch di artikel ini; kalau kamu memakai 6 LED, lewati dua baris LED terakhir dan hapus dua pin terakhir dari array di kode. Tata letak pin board-mu bisa kamu lihat di alat Pinout.

FungsiArduino UnoESP32Raspberry Pi Pico
LED 1 (paling kiri)D2GPIO 18GP8
LED 2D3GPIO 19GP9
LED 3D4GPIO 21GP10
LED 4D5GPIO 22GP11
LED 5D6GPIO 23GP12
LED 6D7GPIO 25GP13
LED 7D8GPIO 26GP14
LED 8 (paling kanan)D9GPIO 27GP15
Kaki tengah potensiometerA0GPIO 34GP26 (ADC0)
Kaki luar potensiometer5V dan GND3V3 dan GND3V3(OUT) dan AGND
Katoda LED (kaki pendek)GNDGNDGND
Resistor seri220 Ω220 Ω330 Ω
Jangan hubungkan LED ke pin D0 dan D1: kedua pin ini dipakai untuk meng-upload kode lewat USB dan untuk Serial Monitor; kalau ada LED yang terpasang, upload bisa gagal dan LED berkedip secara acak. Itulah sebabnya array dimulai dari D2. Kalau tidak ada LED yang menyala sama sekali, cek dulu apakah jalur biru breadboard benar-benar terhubung ke pin GND Arduino.
Arduino Uno
Arduino Uno
Breadboard
Breadboard
R · Ω
R · Ω
Kabel jumper
Kabel jumper

Langkah 1: kode LED berjalan dengan array dan for loop

Kamu bisa saja menulis delapan baris pinMode dan enam belas baris digitalWrite terpisah untuk delapan LED, tetapi kodenya jadi panjang dan mengubah jumlah LED menjadi pekerjaan yang merepotkan. Sebagai gantinya, nomor-nomor pin dimasukkan ke dalam sebuah array lalu ditelusuri dengan for loop. Elemen pertama array adalah LEDS[0], yaitu D2; yang terakhir LEDS[7], yaitu D9. Dengan cara ini kode yang sama tetap jalan tanpa diubah untuk 6, 8, atau 12 LED; kamu cukup mengedit array-nya. Dasar-dasar array dan loop dijelaskan lebih rinci di dasar pemrograman Arduino.

C++ (Arduino IDE)
1// Yürüyen LED: 8 LED sırayla yanar / Running light: 8 LEDs light up one after another
2const int LEDS[] = {2, 3, 4, 5, 6, 7, 8, 9};             // LED pinleri / LED pins
3const int LED_SAYISI = sizeof(LEDS) / sizeof(LEDS[0]);  // dizideki LED sayısı (8) / number of LEDs (8)
4const int BEKLE = 100;                                  // adım süresi (ms) / step time (ms)
5
6void setup() {
7  for (int i = 0; i < LED_SAYISI; i++) {
8    pinMode(LEDS[i], OUTPUT);                           // tüm LED pinleri çıkış / all LED pins as outputs
9  }
10}
11
12void loop() {
13  for (int i = 0; i < LED_SAYISI; i++) {
14    digitalWrite(LEDS[i], HIGH);                        // sıradaki LED'i yak / light the next LED
15    delay(BEKLE);
16    digitalWrite(LEDS[i], LOW);                         // söndür ve devam et / turn it off and move on
17  }
18}
BarisApa yang dilakukan
const int LEDS[] = {2, ..., 9};Array yang menyimpan pin LED berurutan dari kiri ke kanan; LEDS[0] = 2, LEDS[7] = 9
sizeof(LEDS) / sizeof(LEDS[0])Menghitung jumlah elemen: di Uno 16 byte / 2 byte = 8; nilainya ikut berubah sendiri ketika kamu menambah atau menghapus pin
for (int i = 0; i < LED_SAYISI; i++)Menghitung variabel i dari 0 sampai 7; setiap putaran mengurus satu elemen array
pinMode(LEDS[i], OUTPUT)Menjadikan kedelapan pin sebagai output dengan satu loop saja
digitalWrite, delay(BEKLE), digitalWriteMenyalakan LED, menunggu BEKLE milidetik, mematikannya, lalu pindah ke LED berikutnya

Dengan BEKLE (waktu per langkah) 100 ms, cahaya melewati kedelapan LED dalam 0,8 detik lalu langsung mulai lagi. Turunkan ke 30 ms dan alirannya jadi sangat cepat; naikkan ke 300 ms dan gerakannya terlihat lambat, seperti lampu yang menyala satu per satu. Untuk meng-upload kode, pilih board dan port di menu Tools lalu tekan Upload; kalau upload gagal, ikuti daftar periksa di kode Arduino yang gagal di-upload.

Langkah 2: kode Knight Rider (bolak-balik)

Untuk efek Knight Rider, cahaya harus berbalik arah ketika sampai di ujung kanan. Caranya dengan dua loop: loop pertama menghitung dari kiri ke kanan, loop kedua dari kanan ke kiri. Hal yang perlu diperhatikan di sini adalah LED di kedua ujung. Kalau kedua loop menghitung penuh dari 0 sampai 7 dan dari 7 sampai 0, LED paling kanan menyala sekali di akhir loop maju dan sekali lagi di awal loop mundur; cahaya diam dua kali lebih lama di ujung dan gerakannya terlihat tersendat. Karena itu loop maju berhenti di 6 dan loop mundur di 1. Hasilnya, setiap putaran tepat 14 langkah dan cahaya diam di ujung sama lamanya dengan di tengah. Tiga baris yang menyalakan dan mematikan LED juga kita pindahkan ke fungsi kecil bernama yakSondur() (“nyalakan lalu matikan”); kodenya jadi lebih pendek sekaligus lebih mudah dibaca.

C++ (Arduino IDE)
1// Karaşimşek (Knight Rider): ışık iki uç arasında gidip gelir / light bounces between the two ends
2const int LEDS[] = {2, 3, 4, 5, 6, 7, 8, 9};
3const int LED_SAYISI = sizeof(LEDS) / sizeof(LEDS[0]);
4const int BEKLE = 80;                                   // adım süresi (ms) / step time (ms)
5
6void yakSondur(int i) {
7  digitalWrite(LEDS[i], HIGH);
8  delay(BEKLE);
9  digitalWrite(LEDS[i], LOW);
10}
11
12void setup() {
13  for (int i = 0; i < LED_SAYISI; i++) pinMode(LEDS[i], OUTPUT);
14}
15
16void loop() {
17  for (int i = 0; i < LED_SAYISI - 1; i++) {           // soldan sağa: 0..6 / left to right: 0..6
18    yakSondur(i);
19  }
20  for (int i = LED_SAYISI - 1; i > 0; i--) {           // sağdan sola: 7..1 / right to left: 7..1
21    yakSondur(i);
22  }
23}
Kecepatan yang paling mirip dengan tampilan di serialnya adalah sekitar 60–120 ms per langkah. Dengan 8 LED dan 80 ms, satu putaran bolak-balik makan waktu 14 × 80 = 1,12 detik. Begitu turun ke sekitar 20 ms, matamu melihat beberapa LED seolah menyala bersamaan dan cahayanya berubah menjadi garis yang kabur.

Langkah 3: mengatur kecepatan dengan potensiometer

Daripada mengubah kode lalu meng-upload ulang setiap kali ingin kecepatan berbeda, kamu bisa memakai potensiometer. Potensiometer adalah pembagi tegangan: tegangan di kaki tengah berubah antara 0 dan 5 V tergantung posisi porosnya, dan analogRead() mengubahnya menjadi angka antara 0 dan 1023. map(deger, 0, 1023, 400, 20) mengonversi angka itu menjadi waktu langkah antara 400 dan 20 ms; karena rentangnya ditulis terbalik, makin tinggi pembacaannya, makin pendek langkahnya dan makin cepat cahayanya. Ke arah mana poros harus diputar untuk mempercepat tergantung kaki luar mana yang kamu hubungkan ke 5V; kalau terasa terbalik, tukar kedua kabel luar atau tukar 400 dan 20 di map(). Cara kerja bagian dalam potensiometer bisa kamu baca di Apa Itu Potensiometer?.

Potensiometer 10 kΩ
Potensiometer 10 kΩ: kaki luar ke 5V dan GND, kaki wiper di tengah ke A0.
C++ (Arduino IDE)
1// Hız ayarlı karaşimşek: potansiyometre adım süresini belirler / Speed-adjustable Knight Rider: the pot sets the step time
2const int LEDS[] = {2, 3, 4, 5, 6, 7, 8, 9};
3const int LED_SAYISI = sizeof(LEDS) / sizeof(LEDS[0]);
4const int POT = A0;                                     // potansiyometrenin orta bacağı / pot wiper
5
6int adimSuresi() {
7  int deger = analogRead(POT);                          // 0–1023
8  return map(deger, 0, 1023, 400, 20);                  // değer büyüdükçe hızlanır / faster as the value rises
9}
10
11void yakSondur(int i) {
12  digitalWrite(LEDS[i], HIGH);
13  delay(adimSuresi());                                  // her adımda yeniden okunur / read again on every step
14  digitalWrite(LEDS[i], LOW);
15}
16
17void setup() {
18  for (int i = 0; i < LED_SAYISI; i++) pinMode(LEDS[i], OUTPUT);
19}
20
21void loop() {
22  for (int i = 0; i < LED_SAYISI - 1; i++) yakSondur(i);   // sağa / to the right
23  for (int i = LED_SAYISI - 1; i > 0; i--) yakSondur(i);   // sola / to the left
24}

Di versi ini waktu langkah dibaca ulang untuk setiap LED, jadi kecepatannya berubah begitu kamu memutar poros. Namun, selama delay() berjalan, Arduino tidak bisa mengerjakan hal lain: walaupun kamu memutar poros di tengah langkah lambat 400 ms, kecepatan yang baru hanya berlaku mulai langkah berikutnya. Untuk efek dengan beberapa LED, itu bukan masalah, tetapi begitu kamu menambahkan tombol mode atau pembacaan sensor, kamu perlu beralih ke metode millis() dari langkah 5.

Langkah 4: efek menumpuk

Pada efek menumpuk, cahaya pertama berlari sampai ke ujung kanan dan tetap menyala di posisi paling kanan. Cahaya kedua juga berlari, tetapi kali ini berhenti satu tempat lebih ke kiri; setiap putaran, targetnya bergeser satu LED ke kiri sampai seluruh bar penuh. Di kode, ini dibuat dengan dua loop bersarang: loop luar menghitung berapa LED yang sudah menumpuk (dolu, “penuh”), dan loop dalam menghitung berapa langkah cahaya berlari di putaran ini. LED yang sudah mencapai targetnya (hedef) tidak dimatikan; baris if (i < hedef) mengurus persis hal itu. Dengan delapan LED, mengisi seluruh bar butuh 8 + 7 + 6 + ... + 1 = 36 langkah.

C++ (Arduino IDE)
1// Birikerek dolan efekt: her ışık en boş uca kadar gider ve orada kalır / Stacking effect: each light runs to the last free spot and stays
2const int LEDS[] = {2, 3, 4, 5, 6, 7, 8, 9};
3const int LED_SAYISI = sizeof(LEDS) / sizeof(LEDS[0]);
4const int BEKLE = 60;
5
6void setup() {
7  for (int i = 0; i < LED_SAYISI; i++) pinMode(LEDS[i], OUTPUT);
8}
9
10void loop() {
11  for (int dolu = 0; dolu < LED_SAYISI; dolu++) {       // dolu: sağda birikmiş LED sayısı / LEDs already stacked on the right
12    int hedef = LED_SAYISI - 1 - dolu;                  // bu turda ışığın duracağı yer / where the light stops this round
13    for (int i = 0; i <= hedef; i++) {
14      digitalWrite(LEDS[i], HIGH);
15      delay(BEKLE);
16      if (i < hedef) digitalWrite(LEDS[i], LOW);        // hedefte yanık kalır / stays lit at the target
17    }
18  }
19  delay(600);                                           // dolu çubuğu göster / show the full bar
20  for (int i = LED_SAYISI - 1; i >= 0; i--) {           // sağdan sola boşalt / empty from right to left
21    digitalWrite(LEDS[i], LOW);
22    delay(BEKLE);
23  }
24  delay(300);
25}

Di akhir sketch, bar yang penuh ditampilkan selama 0,6 detik, lalu LED padam satu per satu dari kanan ke kiri dan efeknya mulai lagi. Kalau kamu mau bar pengisi yang lebih sederhana, hapus saja loop dalamnya dan nyalakan LED berurutan tanpa pernah mematikannya; tampilan itu ideal untuk indikator pengisian daya atau bar level suara. Ingat bahwa di efek ini kedelapan LED menyala bersamaan: selama setiap LED punya resistornya sendiri, terangnya tidak akan turun.

Langkah 5: Knight Rider tanpa blocking dengan millis()

Di kode yang memakai delay(), Arduino membeku selama waktu yang ditentukan di setiap langkah; kalaupun ada yang menekan tombol di tengahnya, Arduino tidak akan tahu. Sebaliknya, millis() mengembalikan waktu dalam milidetik sejak board dinyalakan. Logikanya begini: loop berjalan terus-menerus, setiap putaran mengecek apakah sudah cukup waktu berlalu sejak langkah terakhir, kalau sudah, ia mengambil satu langkah saja lalu langsung keluar lagi. Di kode di bawah, Knight Rider dan LED bawaan board berjalan bersamaan sebagai dua tugas yang tidak saling bergantung: selagi pemindai menyapu dengan kecepatan yang diatur potensiometer, LED di D13 berkedip sekali per detik dengan iramanya sendiri. Untuk topik ini lebih lanjut, lihat Arduino millis() vs delay().

C++ (Arduino IDE)
1// millis() ile bekletmesiz karaşimşek + potansiyometre / Non-blocking Knight Rider with millis() + pot
2const int LEDS[] = {2, 3, 4, 5, 6, 7, 8, 9};
3const int LED_SAYISI = sizeof(LEDS) / sizeof(LEDS[0]);
4const int POT = A0;
5
6int konum = 0;                     // şu an yanan LED / the LED that is lit now
7int yon = 1;                       // +1 sağa, -1 sola / +1 right, -1 left
8unsigned long sonAdim = 0;         // son adımın zamanı / time of the last step
9unsigned long sonBlink = 0;        // dahili LED için / for the onboard LED
10
11void setup() {
12  for (int i = 0; i < LED_SAYISI; i++) pinMode(LEDS[i], OUTPUT);
13  pinMode(LED_BUILTIN, OUTPUT);    // Uno'da D13 / D13 on the Uno
14  digitalWrite(LEDS[konum], HIGH);
15}
16
17void loop() {
18  unsigned long simdi = millis();
19  unsigned long aralik = map(analogRead(POT), 0, 1023, 400, 20);   // adım süresi (ms) / step time (ms)
20
21  // Görev 1: karaşimşek / Task 1: Knight Rider
22  if (simdi - sonAdim >= aralik) {          // taşmaya karşı güvenli / overflow-safe
23    sonAdim = simdi;
24    digitalWrite(LEDS[konum], LOW);
25    konum += yon;
26    if (konum == LED_SAYISI - 1 || konum == 0) yon = -yon;   // uçta yön değiştir / reverse at the ends
27    digitalWrite(LEDS[konum], HIGH);
28  }
29
30  // Görev 2: dahili LED kendi temposunda yanıp söner / Task 2: the onboard LED blinks at its own pace
31  if (simdi - sonBlink >= 500) {
32    sonBlink = simdi;
33    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
34  }
35  // Buraya buton, sensör ya da seri port kodu eklenebilir / button, sensor or serial code can go here
36}

Ada dua detail yang penting di sini. Pertama, variabel waktu harus bertipe unsigned long; kalau kamu memakai int, nilainya meluap (overflow) di Uno setelah sekitar 32,7 detik dan pewaktuannya kacau: efeknya berhenti atau malah makin cepat tak terkendali. Kedua, perbandingannya dilakukan dengan pengurangan dalam bentuk simdi - sonAdim >= aralik (waktu sekarang dikurangi langkah terakhir, dibandingkan dengan interval); cara ini tetap bekerja dengan benar walaupun millis() kembali ke nol kira-kira setiap 49,7 hari. Karena posisi dan arah cahaya kita simpan di dua variabel (konum dan yon), tidak ada loop lagi: di setiap langkah posisinya naik atau turun satu, dan di ujung arahnya berganti tanda.

8 LED dari 3 pin dengan 74HC595

Delapan LED memakan delapan pin Uno; begitu kamu ingin menambahkan LCD, sensor, dan tombol ke proyekmu, pin mulai habis. Shift register 74HC595 mengendalikan delapan output-nya hanya dari tiga pin Arduino (data, clock, dan latch). Status setiap LED adalah satu bit dari sebuah byte: ekspresi 1 << i hanya membuat bit i bernilai 1, sehingga satu LED menyala. Membuat pola dengan operasi bit juga mudah: (1 << i) | (0x80 >> i) menghasilkan dua cahaya yang datang dari kedua ujung menuju tengah secara bersamaan. Dengan merangkai dua chip, kamu juga bisa membuat Knight Rider 16 LED dengan tiga pin yang sama; cara merangkai, mengendalikan dengan cepat lewat SPI, dan memakai display 7-segmen dijelaskan langkah demi langkah di artikel shift register 74HC595.

Pin 74HC595Koneksi (Arduino Uno)
DS (14)D11
SH_CP (11)D13
ST_CP (12)D10
OE (13)GND (output selalu aktif)
MR (10)5V (reset dinonaktifkan)
VCC (16) / GND (8)5V / GND, dengan kapasitor 100 nF di dekatnya
Q0 (15), Q1–Q7 (1–7)Masing-masing lewat 470 Ω ke anoda sebuah LED
Kaki tengah potensiometerA0
C++ (Arduino IDE)
1// 74HC595 ile 3 pinden 8 LED: karaşimşek ve ortada buluşma / 8 LEDs from 3 pins with a 74HC595: Knight Rider and meet-in-the-middle
2const int DATA_PIN = 11;    // DS (14)
3const int CLOCK_PIN = 13;   // SH_CP (11)
4const int LATCH_PIN = 10;   // ST_CP (12)
5const int POT = A0;
6
7void yaz595(byte desen) {
8  digitalWrite(LATCH_PIN, LOW);
9  shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, desen);   // 8 biti gönder / send the 8 bits
10  digitalWrite(LATCH_PIN, HIGH);                    // çıkışlara aktar / copy to the outputs
11}
12
13void setup() {
14  pinMode(DATA_PIN, OUTPUT);
15  pinMode(CLOCK_PIN, OUTPUT);
16  pinMode(LATCH_PIN, OUTPUT);
17  yaz595(0);                                        // açılışta hepsi sönük / all off at startup
18}
19
20void loop() {
21  int bekle = map(analogRead(POT), 0, 1023, 400, 20);
22
23  for (int i = 0; i < 7; i++) { yaz595(1 << i); delay(bekle); }   // Q0 -> Q7
24  for (int i = 7; i > 0; i--) { yaz595(1 << i); delay(bekle); }   // Q7 -> Q0
25
26  for (int i = 0; i < 4; i++) {                     // uçlardan ortaya / from the ends to the middle
27    yaz595((1 << i) | (0x80 >> i));
28    delay(bekle);
29  }
30  for (int i = 3; i >= 0; i--) {                    // ortadan uçlara / from the middle to the ends
31    yaz595((1 << i) | (0x80 >> i));
32    delay(bekle);
33  }
34}

Di output 74HC595, yang direkomendasikan adalah 470 Ω, bukan 220 Ω: total arus yang lewat pin VCC dan GND chip tidak boleh lebih dari 70 mA. Dengan 470 Ω, sekitar 6,4 mA mengalir per LED, dan walaupun kedelapan LED menyala, totalnya tetap 51 mA. Lagi pula di Knight Rider hanya satu atau dua LED yang menyala pada satu waktu, jadi LED tetap terlihat jelas.

Knight Rider berekor yang memudar dari satu pin dengan WS2812B

Versi yang paling mirip dengan pemindai KITT asli dibuat dengan LED addressable WS2812B. Setiap WS2812B punya driver sendiri di dalamnya; sepanjang apa pun strip-nya, warna dan kecerahan tiap LED kamu atur satu per satu lewat satu kabel data saja. Untuk ekornya, kita menyimpan sebuah array: di setiap langkah, kecerahan semua LED dibagi tiga, dan LED kepala diatur ke 255. LED di belakangnya memudar cepat melewati 255, 85, 28, 9, sehingga meninggalkan jejak alami di belakang cahaya. Pakai 2, bukan 3, sebagai pembagi dan ekornya jadi lebih panjang; pakai 5 dan ekornya jadi lebih pendek. Untuk beralih dari 8 ke 60 LED dengan metode yang sama, kamu cukup mengubah NUM_LEDS.

LED RGB addressable WS2812B
WS2812B: setiap LED punya driver sendiri di dalamnya; terhubung lewat DIN, 5V, dan GND, sementara DOUT diteruskan ke LED berikutnya.
C++ (Arduino IDE)
1// WS2812B ile kuyruklu karaşimşek (tek veri pini) / Knight Rider with a fading tail on WS2812B (one data pin)
2#include <Adafruit_NeoPixel.h>
3
4const int DATA_PIN = 6;      // DIN, 330 Ω üzerinden / DIN through 330 Ω
5const int NUM_LEDS = 8;      // şerit ya da çubuktaki LED sayısı / LEDs on the strip or stick
6const int POT = A0;
7
8Adafruit_NeoPixel strip(NUM_LEDS, DATA_PIN, NEO_GRB + NEO_KHZ800);
9
10uint8_t seviye[NUM_LEDS];    // her LED'in kırmızı parlaklığı / red brightness of each LED
11int konum = 0;
12int yon = 1;
13
14void setup() {
15  strip.begin();
16  strip.setBrightness(80);   // 0–255; USB için düşük tut / keep it low on USB power
17  strip.show();              // hepsini söndür / all off
18}
19
20void loop() {
21  for (int i = 0; i < NUM_LEDS; i++) seviye[i] = seviye[i] / 3;   // kuyruk söner / the tail fades
22  seviye[konum] = 255;                                            // baştaki LED tam parlak / the head is full brightness
23
24  for (int i = 0; i < NUM_LEDS; i++) {
25    strip.setPixelColor(i, strip.Color(seviye[i], 0, 0));         // yalnız kırmızı / red only
26  }
27  strip.show();
28
29  konum += yon;
30  if (konum == NUM_LEDS - 1 || konum == 0) yon = -yon;            // uçta yön değiştir / reverse at the ends
31  delay(map(analogRead(POT), 0, 1023, 150, 20));
32}
Ketika menghubungkan WS2812B, pasang resistor 330 Ω seri di jalur data dan kapasitor 1000 µF di antara 5V dan GND; kalau kamu memakai catu daya eksternal, hubungkan GND-nya ke GND Arduino. Setiap LED bisa menarik sekitar 60 mA pada warna putih penuh; stick 8 LED bisa jalan dari USB, tetapi 30 LED atau lebih butuh catu 5 V terpisah. Untuk instalasi library, urutan warna, dan perhitungan daya, lihat artikel LED Strip WS2812B NeoPixel.

Knight Rider di ESP32: ekor PWM di setiap pin

Di Uno, Knight Rider berekor sulit dibuat dengan LED biasa, karena PWM hanya tersedia di pin 3, 5, 6, 9, 10, dan 11, dan array D2–D9 kita hanya berisi empat di antaranya. Di ESP32, berkat hardware LEDC, hampir setiap pin output bisa menghasilkan PWM, dan ESP32 klasik punya 16 kanal PWM. Karena analogWrite() langsung bekerja di core Arduino ESP32 versi terbaru, logika ekor WS2812B bisa kamu terapkan ke LED biasa. Pin di tabel adalah GPIO aman yang tidak memengaruhi proses booting; potensiometer terhubung ke GPIO 34 di kanal ADC1, yang tetap terbaca andal walaupun Wi-Fi menyala, dan karena ADC ESP32 12-bit, nilainya berkisar dari 0 sampai 4095. Pin ESP32 mengeluarkan 3,3 V, jadi sekitar 6 mA mengalir lewat LED merah dengan 220 Ω; LED terlihat sedikit lebih redup dibanding di Uno. Untuk menyiapkan board-nya, lihat Apa Itu ESP32?.

C++ (Arduino IDE)
1// ESP32: her pinde PWM ile kuyruklu karaşimşek / ESP32: Knight Rider with a PWM tail on every pin
2const int LEDS[] = {18, 19, 21, 22, 23, 25, 26, 27};
3const int LED_SAYISI = sizeof(LEDS) / sizeof(LEDS[0]);
4const int POT = 34;                        // ADC1, yalnızca giriş / ADC1, input only
5
6int parlaklik[LED_SAYISI];                 // 0–255
7int konum = 0;
8int yon = 1;
9unsigned long sonAdim = 0;
10
11void setup() {
12  // analogWrite() pini PWM için kendisi hazırlar / analogWrite() sets the pin up for PWM itself
13}
14
15void loop() {
16  unsigned long aralik = map(analogRead(POT), 0, 4095, 400, 20);   // ESP32 ADC 12 bit: 0–4095
17  if (millis() - sonAdim >= aralik) {
18    sonAdim = millis();
19    for (int i = 0; i < LED_SAYISI; i++) parlaklik[i] /= 3;        // kuyruk söner / the tail fades
20    parlaklik[konum] = 255;
21    for (int i = 0; i < LED_SAYISI; i++) analogWrite(LEDS[i], parlaklik[i]);
22    konum += yon;
23    if (konum == LED_SAYISI - 1 || konum == 0) yon = -yon;
24  }
25}

Knight Rider di Raspberry Pi Pico dengan MicroPython

Di Raspberry Pi Pico, efek yang sama bisa kamu tulis dalam beberapa baris MicroPython. Menyimpan objek Pin di dalam list punya fungsi yang sama dengan array di Arduino. time.ticks_ms() dan time.ticks_diff() adalah padanan MicroPython untuk millis() dan pengurangan yang aman dari overflow. Potensiometer terhubung ke GP26 (ADC0); read_u16() mengembalikan nilai dari 0 sampai 65535 dan kode mengubahnya menjadi 400–20 ms. Total arus yang ditarik dari semua GPIO Pico disarankan tetap di bawah 50 mA; karena itulah kita memilih 330 Ω di tabel: sekitar 4 mA mengalir per LED, dan walaupun kedelapan LED menyala, totalnya tetap sekitar 32 mA. Proyek BlueGrays “Pemindai LED Knight Rider Raspberry Pi Pico” memakai 6 LED di pin GP9–GP14; kalau kamu sudah merakit rangkaian itu, cukup ubah list PINLER menjadi [9, 10, 11, 12, 13, 14]. Untuk instalasi dan meng-upload kode dengan Thonny, lihat Apa Itu Raspberry Pi Pico?.

MicroPython
1# Raspberry Pi Pico: potansiyometreyle hız ayarlı karaşimşek / Pico: Knight Rider with pot speed control
2from machine import Pin, ADC
3import time
4
5PINLER = [8, 9, 10, 11, 12, 13, 14, 15]        # GP8–GP15
6leds = [Pin(p, Pin.OUT) for p in PINLER]
7pot = ADC(26)                                   # GP26 = ADC0
8
9def adim_suresi():
10    # read_u16: 0–65535 -> 400–20 ms
11    return 400 - pot.read_u16() * 380 // 65535
12
13konum, yon = 0, 1
14leds[konum].on()
15son = time.ticks_ms()
16
17while True:
18    if time.ticks_diff(time.ticks_ms(), son) >= adim_suresi():   # millis() benzeri / like millis()
19        son = time.ticks_ms()
20        leds[konum].off()
21        konum += yon
22        if konum == len(leds) - 1 or konum == 0:
23            yon = -yon                          # uçta yön değiştir / reverse at the ends
24        leds[konum].on()

Setiap GPIO di Pico juga bisa menghasilkan PWM; dengan machine.PWM dan nilai duty_u16() untuk setiap LED, efek ekor dari ESP32 bisa kamu bawa ke Pico. Kalau kamu ingin memakai LED WS2812B, modul neopixel bawaan MicroPython bisa mengendalikan strip dari satu GPIO; namun, WS2812B yang diberi daya 5 V tidak selalu membaca sinyal data 3,3 V dari Pico dengan andal, jadi kalau warnanya kacau, tambahkan level shifter di antaranya.

Ide proyek Knight Rider

  • Pengukur level suara (VU meter): pakai kerasnya suara yang diukur dengan sensor suara KY-038 untuk menentukan berapa LED bar pengisi yang menyala.
  • Bar LED sensor parkir: nyalakan lebih banyak LED ketika jarak yang diukur dengan HC-SR04 makin pendek, dan kedipkan semuanya ketika sudah sangat dekat.
  • Game tangkap cahaya: selagi pemindai menyapu dengan cepat, coba tekan tombol tepat ketika LED tengah menyala; perpendek waktu langkah setiap kali berhasil.
  • Dekorasi malam otomatis: jalankan efeknya sendiri ketika LDR mendeteksi hari mulai gelap.
  • Lampu belakang untuk mobil model atau sepeda: buat Knight Rider merah berekor di stick WS2812B, lalu nyalakan semua LED dengan terang penuh ketika tombol rem ditekan.
  • Indikator level: tampilkan posisi potensiometer atau tegangan baterai sebagai bar pengisi.
  • Tampilan yang lebih besar: bawa logika yang sama ke LED matrix MAX7219 atau kubus LED.

Kesalahan umum dan cara memperbaikinya

GejalaPenyebabSolusi
LED sangat reduppinMode(OUTPUT) tidak ada; digitalWrite hanya menyalakan resistor pull-up internalJadikan semua pin OUTPUT dengan sebuah loop di setup()
Satu LED tidak pernah menyalaLED terpasang terbalik, atau resistor atau kabel bergeser satu barisKaki panjang ke resistor dan pin, kaki pendek ke GND; uji LED itu sendirian dengan 5V dan resistor
LED di ujung menyala dua kali lebih lamaKedua loop sama-sama menyertakan LED ujungPakai i < LED_SAYISI − 1 di loop maju dan i > 0 di loop mundur
Pin acak berkedip atau program berperilaku anehMembaca melewati ujung array: i <= LED_SAYISIUbah kondisinya menjadi i < LED_SAYISI; elemen LEDS[8] tidak ada
Kode gagal di-upload, atau LED berkedip selama uploadAda LED yang terhubung ke D0 dan D1Mulai array dari D2
Potensiometer tidak mengubah kecepatanKaki luar yang terhubung ke A0, bukan kaki tengah, atau nilainya hanya dibaca sekali di luar loopHubungkan kaki tengah ke A0; panggil analogRead di setiap langkah
Efeknya kacau setelah sekitar 32 detikNilai millis() disimpan di variabel intJadikan variabel waktu bertipe unsigned long
WS2812B tidak menyala sama sekali atau menampilkan warna acakTidak ada GND bersama, tidak ada resistor data, atau strip terhubung di ujung yang salah (DOUT)Satukan GND-nya, tambahkan 330 Ω, hubungkan di ujung DIN, tempat panahnya bermula
Sebelum merakit rangkaiannya, kamu bisa mencoba kodenya di Tinkercad dengan 8 LED dan sebuah potensiometer. Kalau ada yang salah di rangkaian sungguhan, upload sketch pendek yang membuat semua pin HIGH selama beberapa detik untuk menguji LED satu per satu; kamu akan langsung melihat LED mana yang tidak menyala.

Knight Rider memang terlihat sederhana, tetapi di dalamnya ada ide-ide dasar yang nanti kamu pakai di setiap proyek: array, loop, pembacaan analog, map(), pewaktuan tanpa blocking, operasi bit, dan LED addressable. Untuk langkah berikutnya, lihat proyek Lampu Lalu Lintas Arduino atau daftar ide proyek Arduino. Di aplikasi BlueGrays kamu akan menemukan LED berjalan, Knight Rider, dan versi yang kecepatannya bisa diatur, efek menumpuk dan Knight Rider dengan WS2812B, serta proyek LED berjalan ESP32 dan Knight Rider Pico, masing-masing dengan skema rangkaian langkah demi langkah dan kode siap pakai untuk dicoba di board-mu sendiri.

Pertanyaan umum

Berapa banyak LED yang bisa dikendalikan Arduino Uno?

Uno punya 20 pin yang bisa dipakai sebagai output digital, yaitu D0–D13 dan A0–A5; kalau D0 dan D1 kamu biarkan kosong untuk komunikasi serial, kamu bisa mengendalikan 18 LED secara langsung. Beri setiap LED resistornya sendiri dan jaga total arus di bawah 200 mA; kalau ke-18 LED akan menyala bersamaan, pilih 330 Ω atau lebih. Untuk LED yang lebih banyak, pakai shift register 74HC595 atau strip WS2812B, yang bisa mengendalikan ratusan LED dari satu pin.

Resistor berapa yang dibutuhkan untuk LED berjalan?

Di Arduino Uno 5 V, 220 Ω cocok untuk LED merah dan memberi sekitar 13,6 mA per LED; 330 Ω juga bisa, tetapi LED sedikit lebih redup. Di ESP32 3,3 V yang direkomendasikan 220 Ω, dan di Pico 330 Ω. Pada efek yang hanya menyalakan satu LED, satu resistor bersama juga bisa, tetapi terangnya turun ketika beberapa LED menyala, jadi satu resistor per LED adalah pilihan yang tepat.

Bisakah membuat rangkaian Knight Rider tanpa Arduino?

Bisa, cara klasiknya dengan timer 555 dan chip counter CD4017. 555 menghasilkan pulsa clock dan 4017 membuat 10 output-nya HIGH satu demi satu, yang dengan sendirinya sudah menghasilkan LED berjalan. Untuk gerakan bolak-balik, output-nya digabungkan dengan dioda: ke-10 output dihubungkan ke 6 LED dengan urutan 1-2-3-4-5-6-5-4-3-2, dan kecepatannya diatur dengan potensiometer di 555.

Apa bedanya LED berjalan dan efek Knight Rider?

Pada LED berjalan, cahaya mengalir ke satu arah dan mulai lagi setelah LED terakhir; dengan 8 LED satu putaran 8 langkah. Pada Knight Rider, cahaya berbalik di ujung dan memantul di antara kedua ujung; dengan 8 LED satu putaran 14 langkah. Perbedaan di kodenya juga kecil: untuk Knight Rider kamu menambahkan loop kedua yang menghitung mundur.

Kenapa memakai millis(), bukan delay(), untuk LED berjalan?

Selama delay() berjalan, Arduino tidak bisa mengerjakan hal lain; tekanan tombol terlewat dan sensor tidak bisa dibaca. Dengan millis(), setiap putaran loop hanya mengambil satu langkah ketika waktunya sudah tiba, dan tugas lain berjalan di sisa waktunya. Jadi selagi pemindai menyapu, tombol, potensiometer, atau perintah serial langsung direspons.

Bagaimana cara menambahkan ekor yang memudar ke efek Knight Rider?

Untuk ekornya, LED di belakang kepala perlu diredupkan secara bertahap, dan itu butuh PWM. Di Uno, PWM hanya tersedia di pin 3, 5, 6, 9, 10, dan 11, jadi kamu bisa membuat Knight Rider berekor 6 LED di pin-pin itu. Cara yang lebih mudah adalah strip WS2812B, yang setiap LED-nya bisa kamu atur satu per satu, atau ESP32 maupun Pico, yang punya PWM di setiap pin.

Lihat semua proyek
Efek LED Knight Rider
#6Menengah

Efek LED Knight Rider

Lampu pemindai klasik: sebuah titik cahaya meluncur dari satu ujung enam LED ke ujung lainnya lalu kembali. Arduino menyalakan setiap LED selama sepersepuluh detik sebelum pindah, berbalik di setiap u

4.8(106)
202
LED Berjalan
#5Menengah

LED Berjalan

Lampu-lampu yang menyala satu demi satu, seolah sedang berlari. Arduino menyalakan enam LED satu per satu; masing-masing menyala sebentar lalu padam, sehingga cahayanya berjalan dari awal ke akhir lal

4.6(85)
207
Efek LED Knight Rider dengan Kecepatan yang Bisa Diatur
#8Menengah

Efek LED Knight Rider dengan Kecepatan yang Bisa Diatur

Cahaya berlari dari satu ujung enam LED ke ujung lainnya, berbalik, lalu berlari kembali. Putar kenop potensiometer dan kamu langsung mengubah kecepatan larinya: dengan kenop di satu ujung cahayanya h

4.5(60)
120
LED Berjalan dengan Kecepatan yang Bisa Diatur
#7Menengah

LED Berjalan dengan Kecepatan yang Bisa Diatur

Enam LED menyala satu demi satu, sehingga cahayanya seolah berlari dari satu ujung ke ujung lainnya. Putar kenop potensiometer dan kecepatan larinya langsung berubah: ke satu arah cahayanya melesat, k

4.6(72)
146
Efek Knight Rider WS2812B
#73Menengah
Premium

Efek Knight Rider WS2812B

Titik cahaya merah meluncur dari satu ujung LED strip pintar ke ujung lainnya, lalu kembali, menyapu bolak-balik tanpa pernah berhenti. Di setiap langkah Arduino hanya menyalakan satu LED, menunggu se

4.9(73)
94
LED Berjalan WS2812B (Efek Isi)
#72Menengah
Premium

LED Berjalan WS2812B (Efek Isi)

Strip lampu yang terisi dan kosong seperti segelas air. Arduino menyalakan sepuluh LED warna satu per satu dengan warna oranye dan membiarkannya menyala; begitu strip penuh, ia mematikannya satu per s

4.7(50)
65
LED Knight Rider ESP32
#108Pemula

LED Knight Rider ESP32

6 LED yang bergerak berurutan dari kiri ke kanan dan dari kanan ke kiri (gaya Knight Rider). Contoh dasar penggunaan loop for dan array. Mengajarkan logika perubahan arah.

4.5(19)
32
Pemindai LED Knight Rider Raspberry Pi Pico (6 LED Bolak-balik)
#154Pemula

Pemindai LED Knight Rider Raspberry Pi Pico (6 LED Bolak-balik)

Efek pemindai LED "Knight Rider" klasik dengan Pico! 6 LED bergerak dari kiri ke kanan, lalu kembali, selamanya, seperti gril depan mobil KITT dari serial TV tahun 80-an. Ini pengembangan dari proyek LED Berjalan: rangkaian 6 LED yang sama (GP9-GP14), pola kode berbeda. Pelajari reversed() untuk membalik list, dua loop for untuk pola bolak-balik, dan cara membuat beberapa animasi di rangkaian yang sama. Perangkat keras sama, efek yang sama sekali berbeda.

0.0(0)
13