Panduan · 10 mnt baca

Lampu LED Pohon Natal dengan Arduino: Efek Salju dan Pelangi WS2812B

Buat lampu LED pohon Natal dengan Arduino: LED strip WS2812B, efek salju turun, pelangi, dan kelap-kelip, ganti mode dengan tombol, perhitungan catu daya 5 V, dan kodenya.

Memakai Arduino dan LED strip WS2812B untuk proyek pohon Natal adalah cara paling seru untuk melampaui beberapa mode tetap yang ditawarkan lampu pohon siap pakai. Karena kamu bisa mengatur warna dan kecerahan setiap LED satu per satu, kamu bisa menambahkan kepingan salju yang melayang turun dari puncak, pelangi yang berputar mengelilingi dahan, atau bintang merah, hijau, dan emas yang berkelap-kelip secara acak. Untuk semua ini kamu cukup butuh satu kabel data, satu tombol, dan catu daya 5 V yang dipilih dengan benar.

Di panduan ini kita mulai dari daftar komponen lalu membangunnya langkah demi langkah: perhitungan catu daya sesuai panjang strip, pengkabelan yang benar antara catu daya, board, dan strip, program Arduino Uno lengkap (FastLED) yang mengganti efek dengan tombol, serta versi ESP32 (Adafruit NeoPixel) dan Raspberry Pi Pico (MicroPython) dari proyek yang sama. Di akhir, kamu juga akan belajar cara melilitkan strip ke pohon, apa saja yang perlu diperhatikan soal keselamatan, dan cara mengatasi masalah yang paling sering muncul.

LED RGB addressable WS2812B NeoPixel
LED RGB addressable WS2812B NeoPixel

Kenapa LED strip WS2812B untuk pohon Natal?

Pada lampu Natal klasik, semua bohlam menyala bersamaan atau berjalan bergantian dalam beberapa kelompok. Di WS2812B, setiap LED punya chip driver kecil di dalamnya. Arduino mengirim data warna secara berurutan lewat jalur data; LED pertama mengambil jatah 24 bit miliknya dan meneruskan sisanya ke LED berikutnya. Dengan begitu kamu bisa mengendalikan strip berisi 100 atau 300 LED hanya dengan satu pin dan memberi setiap LED warnanya sendiri. Inilah yang membuat efek bergerak seperti salju turun terlihat hidup, sesuatu yang tidak bisa ditandingi lampu tetap. Kalau ingin memahami cara kerja LED addressable lebih dalam, baca artikel LED Strip WS2812B NeoPixel.

FiturNilai
Kemasan5050 SMD, chip driver di dalam LED
Catu daya5 V (kira-kira 3,5–5,3 V)
ArusSekitar 20 mA per warna, sekitar 60 mA pada putih penuh
DataSatu jalur, 800 kHz, 24 bit per LED (urutan G-R-B)
Waktu data30 µs per LED; 100 LED butuh sekitar 3 ms
Ambang input dataMinimal 0,7 × VDD untuk logika 1 (3,5 V pada 5 V)
Warna256 level per kanal, total 16,7 juta warna
Kerapatan strip30, 60, dan 144 LED/m
PemotonganBisa dipotong tepat di tengah pad tembaga di antara LED

Daftar komponen

  • LED strip WS2812B: untuk pohon setinggi 1,5–1,8 m, strip 60 LED/m sepanjang 2,5 m atau strip 30 LED/m sepanjang 5 m adalah awal yang bagus. Versi IP65 berlapis silikon lebih tahan ketika digantung di dahan dan lebih tahan debu.
  • Board pengendali: Arduino Uno, Nano, ESP32, atau Raspberry Pi Pico.
  • Catu daya 5 V: pilih rating arusnya dari tabel di bawah; untuk 100 LED, 5 V 4 A adalah pilihan yang lega.
  • Jack DC female (terminal sekrup): untuk menyambungkan colokan catu daya ke kabelmu tanpa menyolder.
  • Kapasitor elektrolit 1000 µF / 10 V: meredam lonjakan arus mendadak di input strip.
  • Resistor 330 Ω: dipasang seri di jalur data; meredam pantulan sinyal dan membatasi arus input LED pertama.
  • Push button: untuk berpindah antar efek.
  • Kabel tebal: kabel dengan penampang minimal 0,75–1,5 mm² untuk jalur 5V dan GND.
  • Opsional 74AHCT125 atau 74HCT245: untuk menaikkan sinyal data 3,3 V dari ESP32 dan Pico menjadi 5 V.

Perhitungan catu daya: berapa ampere yang kamu butuhkan?

Masing-masing chip merah, hijau, dan biru di dalam WS2812B menarik sekitar 20 mA pada kecerahan penuh, jadi satu LED memakai sekitar 60 mA pada putih penuh. Arus kasus terburuk kamu dapat dengan rumus I = jumlah LED × 60 mA. Strip berisi 100 LED menarik 6 A ketika semua LED putih bersih dengan kecerahan penuh, artinya P = 5 V × 6 A = 30 W. Pada efek pelangi, salju, dan kelap-kelip, sebagian besar LED hanya satu warna atau diredupkan, jadi dalam praktiknya arus tetap di sekitar sepertiga kasus terburuk. Agar aman, kalikan arus tipikal ini dengan 2 lalu bulatkan ke atas ke rating catu daya terdekat, dan atur batas arus di software sekitar 80% dari kapasitas catu daya. Hubungan antara arus, tegangan, dan daya bisa kamu cek dengan mudah memakai kalkulator hukum Ohm.

Jumlah LEDKasus terburuk (putih penuh)Arus efek tipikalCatu daya yang disarankanBatas software (MAX_MA)
301,8 Asekitar 0,6 A5 V 2 A1600 mA
603,6 Asekitar 1,2 A5 V 3 A2400 mA
1006 Asekitar 2 A5 V 4 A3200 mA
1509 Asekitar 3 A5 V 6 A4800 mA
300 (5 m, 60 LED/m)18 Asekitar 6 A5 V 12 A9600 mA

Pada strip yang panjang, masalah kedua adalah jatuh tegangan. Karena jalur tembaga tipis di strip punya hambatan, tegangan di ujung strip 5 m bisa turun di bawah 4 V; chip biru dan hijau pun melemah dan warna putih terlihat kekuningan dan pudar. Solusinya, beri lagi 5V dan GND bukan hanya dari awal strip, tetapi juga setiap 1–1,5 meter (atau setiap 100–150 LED) dengan kabel terpisah dari catu daya. Cara ini disebut injeksi daya (power injection). Untuk kabel ini, pakai penampang minimal 0,75 mm² untuk 5 ampere dan 1,5 mm² untuk 10 ampere; jalur data cukup disambungkan di awal strip saja.

Jangan pernah mencoba memberi daya strip dari pin 5V Arduino. Pin 5V pada Uno yang diberi daya lewat USB hanya bisa memberi paling banyak 400–500 mA, cukup untuk menyalakan beberapa LED dengan kecerahan rendah saja. Lebih dari itu, board akan reset, sekring pelindung USB putus, atau jalur tipis di board jadi panas. Selalu beri daya strip langsung dari catu daya.

Skema rangkaian: catu daya 5 V, strip, dan board

KoneksiArduino UnoESP32Raspberry Pi Pico
DIN strip (data)D6 (lewat 330 Ω)GPIO 13 (lewat 330 Ω)GP0 (lewat 330 Ω)
5V strip+5 V catu daya+5 V catu daya+5 V catu daya
GND stripGND catu daya + GND UnoGND catu daya + GND ESP32GND catu daya + GND Pico
TombolD2 dan GNDGPIO 4 dan GNDGP15 dan GND
Kapasitor 1000 µF5V–GND di input strip5V–GND di input strip5V–GND di input strip
Daya board (versi jadi)Pin 5V atau USBPin 5V (VIN) atau USBVSYS (lewat dioda Schottky) atau USB
  1. Cari tanda panah di strip dan solder kabel ke ujung tempat panah dimulai (DIN). Kalau kamu mengirim data dari ujung sebaliknya, yaitu ujung DOUT, tidak ada LED yang menyala.
  2. Sambungkan output +5 V catu daya ke ujung 5V strip (di beberapa strip tertulis +5V atau VCC) dan GND catu daya ke ujung GND strip.
  3. Pasang kapasitor 1000 µF di antara 5V dan GND di input strip; kaki panjang (positif) ke 5V dan kaki yang badannya bergaris (negatif) ke GND.
  4. Sambungkan pin GND board ke GND catu daya. Tanpa GND bersama, sinyal data tidak punya acuan.
  5. Sambungkan pin data board (D6 di Uno) ke ujung DIN strip lewat resistor 330 Ω; menaruh resistor dekat strip memberi hasil lebih baik.
  6. Sambungkan satu kaki tombol ke D2 dan kaki lainnya ke GND; resistor pull-up internal akan diaktifkan di kode.
  7. Kalau kamu memakai lebih dari 150 LED, tarik juga kabel 5V dan GND terpisah dari catu daya ke bagian tengah dan ujung strip.
  8. Selama pengembangan, beri daya board dari USB dan strip dari catu daya. Begitu proyek selesai, kamu bisa memasukkan 5 V dari catu daya ke pin 5V Uno; dalam hal ini jangan colokkan kabel USB secara bersamaan.
Kesalahan paling umum adalah lupa menyatukan GND board dengan GND catu daya; akibatnya LED berkedip dengan warna acak atau tidak merespons sama sekali. Detailnya ada di artikel Ground Bersama (GND). Masalah umum kedua adalah sinyal data 3,3 V dari ESP32 dan Pico: dengan catu 5 V, WS2812B butuh minimal 3,5 V agar bisa mengenali logika 1 dengan andal. Sebagian besar strip tetap jalan dengan 3,3 V, tetapi kalau LED-LED pertama berkedip, pasang konverter level logika (74AHCT125) di antaranya.

Kode Arduino Uno (FastLED): tiga efek dan ganti mode dengan tombol

Buka Library Manager di Arduino IDE dan instal library dengan mencari FastLED; untuk panduan lengkapnya lihat Cara Instal Library Arduino. Program di bawah berisi efek pelangi, salju turun, dan kelap-kelip seperti bintang; setiap kali tombol ditekan, program pindah ke efek berikutnya. Karena kodenya memakai millis() alih-alih delay(), tombol terdeteksi kapan saja selama efek berjalan. Logika metode ini bisa kamu temukan di artikel Arduino millis() vs delay().

C++ (Arduino IDE)
1#include <FastLED.h>
2
3#define LED_PIN     6      // şeridin DIN girişi (330 ohm üzerinden) / strip DIN input (via 330 ohm)
4#define BUTTON_PIN  2      // buton, diğer bacak GND / button, other leg to GND
5#define NUM_LEDS    100    // şeritteki LED sayısı / number of LEDs on the strip
6#define BRIGHTNESS  120    // genel parlaklık 0-255 / global brightness 0-255
7#define MAX_MA      3200   // 4 A adaptörün %80'i / 80% of a 4 A supply
8
9CRGB leds[NUM_LEDS];
10
11const uint8_t MODE_COUNT = 3;                          // 0 gökkuşağı, 1 kar, 2 yıldız / 0 rainbow, 1 snow, 2 twinkle
12const uint16_t FRAME_MS[MODE_COUNT] = {20, 60, 30};    // kare süreleri (ms) / frame times (ms)
13const CRGB XMAS[4] = {CRGB::Red, CRGB::Green, CRGB::Gold, CRGB::White};
14
15uint8_t mode = 0;
16uint8_t hue = 0;
17
18void setup() {
19  pinMode(BUTTON_PIN, INPUT_PULLUP);
20  FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
21  FastLED.setMaxPowerInVoltsAndMilliamps(5, MAX_MA);  // akım sınırı / current limit
22  FastLED.setBrightness(BRIGHTNESS);
23  FastLED.clear(true);                                // açılışta hepsini söndür / all off at start
24}
25
26void checkButton() {
27  static bool lastState = HIGH;
28  static unsigned long lastChange = 0;
29  bool state = digitalRead(BUTTON_PIN);
30  if (state != lastState && millis() - lastChange > 50) {  // 50 ms zıplama filtresi / 50 ms debounce
31    lastChange = millis();
32    lastState = state;
33    if (state == LOW) {                                     // basıldı / pressed
34      mode = (mode + 1) % MODE_COUNT;
35      FastLED.clear();
36    }
37  }
38}
39
40void rainbow() {
41  fill_rainbow(leds, NUM_LEDS, hue, 3);   // her LED'de ton 3 artar / hue +3 per LED
42  hue += 2;                               // renkler döner / colours rotate
43}
44
45void snowfall() {
46  for (int i = 0; i < NUM_LEDS - 1; i++) {
47    leds[i] = leds[i + 1];                // bir LED aşağı kaydır / shift one LED down
48  }
49  if (random8() < 38) {
50    leds[NUM_LEDS - 1] = CRGB::White;     // tepede yeni kar tanesi / new flake at the top
51  } else {
52    leds[NUM_LEDS - 1] = CRGB(0, 0, 24);  // koyu mavi gece / dark blue night
53  }
54}
55
56void twinkle() {
57  fadeToBlackBy(leds, NUM_LEDS, 20);      // hepsini biraz kıs / dim everything a little
58  if (random8() < 80) {
59    leds[random16(NUM_LEDS)] = XMAS[random8(4)];  // rastgele yıldız / random star
60  }
61}
62
63void loop() {
64  checkButton();
65  static unsigned long lastFrame = 0;
66  if (millis() - lastFrame >= FRAME_MS[mode]) {
67    lastFrame = millis();
68    if (mode == 0) rainbow();
69    else if (mode == 1) snowfall();
70    else twinkle();
71    FastLED.show();                       // renkleri şeride gönder / push colours to the strip
72  }
73}
Baris / pengaturanFungsinya
NUM_LEDSJumlah LED di strip; kalau salah diisi, sebagian strip tetap gelap atau efeknya bergeser.
BRIGHTNESSKecerahan umum (0–255). Sekitar 120 sudah cukup terang untuk pohon dan aman dari sisi arus maupun panas.
setMaxPowerInVoltsAndMilliamps(5, MAX_MA)FastLED memperkirakan arus yang ditarik di setiap frame dan otomatis menurunkan kecerahan kalau batasnya akan terlampaui.
addLeds<WS2812B, LED_PIN, GRB>Menentukan tipe strip, pin data, dan urutan warna; untuk WS2812B urutannya GRB.
FRAME_MSWaktu frame setiap efek (ms); nilai yang lebih kecil berarti animasi lebih cepat.
checkButton()Membaca tombol dengan filter debounce 50 ms dan menaikkan mode satu tingkat setiap kali ditekan.
FastLED.show()Mengirim warna di memori ke strip; kalau tidak dipanggil, tidak ada perubahan yang terlihat.

Bagaimana efeknya bekerja?

Pelangi: fungsi fill_rainbow dimulai dari hue (rona warna) yang diberikan ke LED pertama dan menaikkan hue sebanyak 3 langkah untuk setiap LED. Di FastLED, hue berkisar dari 0 sampai 255; dengan 100 LED, hue maju total 300 langkah, jadi di sepanjang strip terlihat sedikit lebih dari satu lingkaran warna penuh. Karena kita menaikkan variabel hue sebesar 2 di setiap frame, warnanya berputar perlahan mengelilingi pohon. Kalau ingin pita warna yang lebih lebar, pakai 1 atau 2 alih-alih 3.

Salju turun: ketika strip dililitkan ke pohon dari bawah ke atas, LED pertama ada di paling bawah dan LED terakhir di puncak. Di setiap frame, kita menggeser semua warna turun satu LED dan menambahkan kepingan salju putih atau piksel malam biru tua di puncak. Karena random8() menghasilkan angka 0 sampai 255, peluang hasilnya di bawah 38 sekitar 15%; naikkan angka ini dan saljunya makin lebat. Dengan waktu frame 60 ms, sebuah kepingan salju butuh 6 detik untuk turun melewati 100 LED. Kelap-kelip (bintang): fadeToBlackBy meredupkan semua LED sekitar 8% di setiap frame; bersamaan dengan itu, satu LED yang dipilih acak menyala dengan kecerahan penuh berwarna merah, hijau, emas, atau putih. Hasilnya kilau yang mengingatkan pada lampu Natal model lama, tetapi jauh lebih hidup.

Untuk menambah efek baru, tulis sebuah fungsi, naikkan MODE_COUNT satu, tambahkan kecepatannya ke array FRAME_MS, dan masukkan baris baru di pilihan dalam loop. Misalnya, fill_solid(leds, NUM_LEDS, CRGB::Red) sudah cukup untuk mewarnai seluruh pohon dengan satu warna; kalau kamu menggantinya antara merah dan hijau setiap detik, kamu dapat efek Natal klasik.

Pohon Natal dengan ESP32 (Adafruit NeoPixel)

FastLED juga jalan di ESP32, tetapi di sini kita menulis proyek yang sama dengan library Adafruit NeoPixel supaya kamu kenal kedua library populer ini. Versi terbaru library ini bisa dikompilasi dengan kode yang sama di versi 2.x dan 3.x dari core Arduino ESP32 dan menghasilkan sinyal dengan unit RMT hardware. Karena warna yang diredupkan dengan setBrightness di Adafruit NeoPixel bisa rusak ketika dibaca kembali, kita menghitung efek di array kecerahan kita sendiri (level) lalu menulis ulang semuanya ke strip dari awal di setiap frame. Pin data adalah GPIO 13 dan tombol GPIO 4. Kalau nanti kamu ingin mengendalikan pohon dari ponsel, artikel WLED menawarkan antarmuka siap pakai.

C++ (Arduino IDE)
1#include <Adafruit_NeoPixel.h>
2
3#define LED_PIN     13     // şeridin DIN girişi (330 ohm üzerinden) / strip DIN input (via 330 ohm)
4#define BUTTON_PIN  4      // buton, diğer bacak GND / button, other leg to GND
5#define NUM_LEDS    100    // şeritteki LED sayısı / number of LEDs on the strip
6
7Adafruit_NeoPixel strip(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
8
9const uint8_t MODE_COUNT = 3;                          // 0 gökkuşağı, 1 kar, 2 yıldız / 0 rainbow, 1 snow, 2 twinkle
10const uint16_t FRAME_MS[MODE_COUNT] = {20, 60, 30};    // kare süreleri (ms) / frame times (ms)
11const uint8_t PALETTE[4][3] = {{255, 0, 0}, {0, 255, 0}, {255, 160, 0}, {255, 255, 255}};
12
13uint8_t level[NUM_LEDS];      // LED başına parlaklık / per-LED level
14uint8_t colorIdx[NUM_LEDS];   // yıldız rengi / star colour index
15uint8_t mode = 0;
16uint16_t hue = 0;
17
18void setup() {
19  pinMode(BUTTON_PIN, INPUT_PULLUP);
20  strip.begin();
21  strip.setBrightness(110);   // genel parlaklık / global brightness
22  strip.clear();
23  strip.show();
24}
25
26void checkButton() {
27  static bool lastState = HIGH;
28  static unsigned long lastChange = 0;
29  bool state = digitalRead(BUTTON_PIN);
30  if (state != lastState && millis() - lastChange > 50) {  // 50 ms zıplama filtresi / 50 ms debounce
31    lastChange = millis();
32    lastState = state;
33    if (state == LOW) {                                     // basıldı / pressed
34      mode = (mode + 1) % MODE_COUNT;
35      memset(level, 0, sizeof(level));                      // efekt belleğini sıfırla / reset effect buffer
36      strip.clear();
37    }
38  }
39}
40
41void rainbow() {
42  for (int i = 0; i < NUM_LEDS; i++) {
43    uint16_t h = hue + (uint32_t)i * 65536UL / NUM_LEDS;   // LED'e göre ton / hue per LED
44    strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(h)));
45  }
46  hue += 256;                                              // renkler döner / colours rotate
47}
48
49void snowfall() {
50  for (int i = 0; i < NUM_LEDS - 1; i++) level[i] = level[i + 1];   // bir LED aşağı kaydır / shift one LED down
51  level[NUM_LEDS - 1] = (random(100) < 15) ? 255 : 0;               // tepede yeni kar / new flake on top
52  for (int i = 0; i < NUM_LEDS; i++) {
53    if (level[i]) strip.setPixelColor(i, 255, 255, 255);            // kar tanesi / snowflake
54    else strip.setPixelColor(i, 0, 0, 24);                          // koyu mavi gece / dark blue night
55  }
56}
57
58void twinkle() {
59  for (int i = 0; i < NUM_LEDS; i++) {
60    level[i] = (level[i] > 12) ? level[i] - 12 : 0;                 // yavaşça sön / fade out
61  }
62  if (random(100) < 30) {
63    int p = random(NUM_LEDS);
64    level[p] = 255;                                                 // yeni yıldız / new star
65    colorIdx[p] = random(4);
66  }
67  for (int i = 0; i < NUM_LEDS; i++) {
68    const uint8_t *c = PALETTE[colorIdx[i]];
69    strip.setPixelColor(i, c[0] * level[i] / 255, c[1] * level[i] / 255, c[2] * level[i] / 255);
70  }
71}
72
73void loop() {
74  checkButton();
75  static unsigned long lastFrame = 0;
76  if (millis() - lastFrame >= FRAME_MS[mode]) {
77    lastFrame = millis();
78    if (mode == 0) rainbow();
79    else if (mode == 1) snowfall();
80    else twinkle();
81    strip.show();                                                   // renkleri şeride gönder / push colours to the strip
82  }
83}

Pohon Natal dengan Raspberry Pi Pico dan MicroPython

Modul neopixel sudah tersedia bawaan di MicroPython untuk Raspberry Pi Pico; kamu tidak perlu menginstal apa pun lagi. Karena modul ini mengurus sendiri timing presisi WS2812B, kamu bisa memakai pin GP mana pun; di bawah, data disambungkan ke GP0 dan tombol ke GP15. Karena MicroPython tidak punya pengaturan kecerahan umum, kita meredupkan warna sendiri dengan faktor BRIGHT. Karena Python berjalan lebih lambat dari C++, efek tetap mulus dengan 100 LED; di atas 300 LED, waktu frame bisa makin panjang. Kalau kamu baru mengenal MicroPython, kamu bisa mulai dari artikel dasar-dasar MicroPython.

MicroPython
1from machine import Pin
2import neopixel, time, random
3
4NUM_LEDS = 100
5BRIGHT = 0.4                                   # 0-1 parlaklık / brightness
6np = neopixel.NeoPixel(Pin(0), NUM_LEDS)       # veri GP0 / data on GP0
7button = Pin(15, Pin.IN, Pin.PULL_UP)          # buton GP15-GND / button GP15-GND
8
9mode = 0
10MODE_COUNT = 3                                 # 0 gökkuşağı, 1 kar, 2 yıldız / 0 rainbow, 1 snow, 2 twinkle
11FRAME_MS = (20, 60, 30)                        # kare süreleri / frame times
12level = [0] * NUM_LEDS                         # LED başına parlaklık / per-LED level
13color_idx = [0] * NUM_LEDS                     # yıldız rengi / star colour index
14PALETTE = ((255, 0, 0), (0, 255, 0), (255, 160, 0), (255, 255, 255))
15hue = 0
16
17def scale(r, g, b):
18    return (int(r * BRIGHT), int(g * BRIGHT), int(b * BRIGHT))
19
20def wheel(pos):
21    # 0-255 -> gökkuşağı rengi / rainbow colour
22    pos = pos & 255
23    if pos < 85:
24        return (255 - pos * 3, pos * 3, 0)
25    if pos < 170:
26        pos -= 85
27        return (0, 255 - pos * 3, pos * 3)
28    pos -= 170
29    return (pos * 3, 0, 255 - pos * 3)
30
31def rainbow():
32    global hue
33    for i in range(NUM_LEDS):
34        np[i] = scale(*wheel(hue + i * 256 // NUM_LEDS))
35    hue = (hue + 2) & 255                      # renkler döner / colours rotate
36
37def snowfall():
38    for i in range(NUM_LEDS - 1):
39        level[i] = level[i + 1]                # bir LED aşağı kaydır / shift one LED down
40    level[-1] = 255 if random.randint(0, 99) < 15 else 0
41    for i in range(NUM_LEDS):
42        np[i] = scale(255, 255, 255) if level[i] else scale(0, 0, 24)
43
44def twinkle():
45    for i in range(NUM_LEDS):
46        level[i] = level[i] - 12 if level[i] > 12 else 0   # yavaşça sön / fade out
47    if random.randint(0, 99) < 30:
48        p = random.randint(0, NUM_LEDS - 1)
49        level[p] = 255                         # yeni yıldız / new star
50        color_idx[p] = random.randint(0, 3)
51    for i in range(NUM_LEDS):
52        r, g, b = PALETTE[color_idx[i]]
53        k = level[i] * BRIGHT / 255
54        np[i] = (int(r * k), int(g * k), int(b * k))
55
56effects = (rainbow, snowfall, twinkle)
57last_btn = 1
58last_change = time.ticks_ms()
59last_frame = time.ticks_ms()
60
61while True:
62    now = time.ticks_ms()
63    state = button.value()
64    if state != last_btn and time.ticks_diff(now, last_change) > 50:   # zıplama filtresi / debounce
65        last_change = now
66        last_btn = state
67        if state == 0:                         # basıldı / pressed
68            mode = (mode + 1) % MODE_COUNT
69            for i in range(NUM_LEDS):
70                level[i] = 0
71    if time.ticks_diff(now, last_frame) >= FRAME_MS[mode]:
72        last_frame = now
73        effects[mode]()
74        np.write()                             # şeride gönder / push to the strip

Memasang strip di pohon dan keselamatan

  • Mulai dari bawah: taruh ujung DIN strip di dasar pohon di samping kotak kontrol, lalu lilitkan strip ke atas membentuk spiral. Dengan begitu efek salju mengalir dari atas ke bawah dan kabel data tetap pendek.
  • Jarak spiral: pada pohon 1,8 m, melilit dengan jarak 20–25 cm menyebarkan strip 5 m secara merata di dahan; karena diameter lilitan makin kecil ke arah puncak pohon, kamu bisa sedikit merapatkan jaraknya.
  • Strip vertikal: kamu juga bisa memasang strip zigzag, dari atas ke bawah lalu dari bawah ke atas. Dengan susunan ini, arah efek salju terbalik di setiap strip kedua, jadi kamu perlu sedikit penyesuaian yang menghitung urutan LED berdasarkan nomor strip.
  • Panas: strip WS2812B jadi hangat pada kecerahan tinggi; jangan menekannya rapat ke hiasan kertas atau dahan kering. Menjaga kecerahan di sekitar 100–150 mengurangi panas sekaligus arus.
  • Keamanan catu daya: jangan membuat rangkaian sendiri di sisi listrik PLN 220 V; pakai catu daya 5 V jadi yang tertutup rapat dan bertanda CE. Jauhkan kotak kontrol dari air dan siraman pot tanaman, dan matikan pohon ketika kamu keluar rumah.
  • Sekring: pada sistem di atas 5 A, menambahkan sekring tusuk (blade fuse) dengan rating yang sesuai di output catu daya adalah langkah pencegahan yang baik terhadap kemungkinan korsleting.

Ide proyek untuk pohon Natal

  • Pohon yang bereaksi terhadap musik: nyalakan lampu mengikuti irama lagu dengan mikrofon; detailnya ada di artikel LED reaktif musik.
  • Hitung mundur Tahun Baru: tampilkan sisa waktu sampai tengah malam di layar dan mulai efek kembang api di pohon pukul 00.00; baca artikel penghitung mundur Tahun Baru.
  • Pohon yang menyala sendiri: nyalakan lampu otomatis begitu hari mulai gelap dengan sensor cahaya LDR.
  • Pohon yang makin terang ketika didekati: naikkan kecerahan dengan sensor gerak PIR ketika ada orang masuk ruangan, dan redupkan ketika ruangan kosong.
  • Kendali dari ponsel: buka halaman web dengan ESP32 dan pilih efek serta warna dari ponselmu; artikel WebSocket ESP32 adalah titik awal yang bagus.
  • Layar bintang di puncak pohon: pasang LED matrix WS2812B kecil di puncak pohon dan putar animasi bintang atau kepingan salju.

Kesalahan umum dan cara mengatasinya

GejalaKemungkinan penyebabSolusi
Tidak ada LED yang menyalaData tersambung ke ujung DOUT atau GND tidak bersamaCek arah panah dan sambungkan ke ujung DIN, satukan GND board dan GND catu daya
LED-LED pertama berkedip, warnanya acakSinyal data lemah, level 3,3 V, kabel data panjangDekatkan resistor 330 Ω ke strip, perpendek kabel data, pakai 74AHCT125
Warna salah (hijau, bukan merah)Urutan warna salahPakai GRB di FastLED dan NEO_GRB di NeoPixel; beberapa strip memakai urutan RGB
Ujung strip kekuningan dan pudarJatuh teganganTambahkan injeksi daya di tengah dan di ujung, pakai kabel yang lebih tebal
Board reset ketika warnanya berubah putihCatu daya terlalu kecil, tarikan arus mendadakPakai catu daya yang lebih besar, turunkan batas MAX_MA, pasang kapasitor 1000 µF
Tombol melompati dua mode dalam sekali tekanPantulan tombol (bounce)Naikkan waktu debounce dari 50 ms ke 80 ms, buat kabel tombol tetap pendek
Efek berjalan lambat di PicoTerlalu banyak LED dan perhitungan PythonKurangi NUM_LEDS, perpanjang waktu frame, atau pindah ke C++ di Arduino IDE
Sebelum memasang strip di pohon, jalankan dulu di meja dengan kecerahan tinggi selama beberapa menit dan cek dengan tangan apakah catu daya, terminal, dan kabel jadi panas. Kalau kabel terasa lebih dari hangat, pakai kabel yang lebih tebal atau turunkan nilai MAX_MA. Kalau ingin menyegarkan ingatan soal pengkabelan tombol, lihat artikel cara menghubungkan tombol.

Dengan beberapa meter LED strip, satu tombol, dan catu daya 5 V yang ukurannya pas, pohon Natalmu berubah menjadi pertunjukan cahaya yang bisa diprogram dan diperbarui dengan efek baru setiap tahun. Kamu bisa merancang efekmu sendiri dengan bereksperimen pada palet warna dan waktu frame, dan untuk pertanyaan soal daya dan pengkabelan kamu bisa kembali ke panduan Cara Memberi Daya ke Arduino. Di aplikasi BlueGrays kamu akan menemukan proyek LED berjalan, Knight Rider, lampu strobo polisi, dan animasi dengan WS2812B, plus kendali strip NeoPixel dengan ESP32, lengkap dengan skema rangkaian dan kode langkah demi langkah.

Pertanyaan umum

Berapa LED yang kubutuhkan untuk pohon Natal?

Untuk pohon setinggi 1,5–1,8 m, 150–300 LED, yaitu strip 30 LED/m sepanjang 5 m atau strip 60 LED/m sepanjang 2,5–5 m, memberi tampilan yang penuh dan hidup. Dengan LED lebih sedikit juga bisa, tetapi efeknya terlihat jarang. Semakin banyak LED, kamu juga perlu memperhitungkan arus catu daya dan RAM board (3 byte per LED).

Berapa ampere catu daya yang dibutuhkan LED strip WS2812B?

Setiap LED menarik sekitar 60 mA pada putih penuh; untuk 100 LED, kasus terburuknya 6 A. Pada efek berwarna, arus sebenarnya tetap di sekitar sepertiganya, jadi catu daya 5 V 4 A sudah cukup untuk 100 LED, asalkan kamu membatasi arus ke 3200 mA dengan fungsi setMaxPowerInVoltsAndMilliamps dari FastLED. Kalau kamu akan sering memakai putih penuh dalam waktu lama, pilih catu daya berdasarkan kasus terburuk.

Apakah strip WS2812B bisa jalan di 12 V?

Tidak, WS2812B adalah strip 5 V dan menyambungkan 12 V akan langsung merusak LED-nya. Kalau ingin strip addressable yang jalan di 12 V, pilih tipe WS2811 atau WS2815. Kalau ingin memakai catu daya 12 V yang sudah kamu punya untuk strip kecil, kamu bisa mendapatkan 5 V dengan konverter step-down seperti LM2596, tetapi modul ini terbatas di sekitar 2–3 A.

Sebaiknya pakai FastLED atau Adafruit NeoPixel?

Keduanya bisa menggerakkan WS2812B tanpa masalah. FastLED memudahkan penulisan efek dengan fungsi siap pakai untuk pelangi, palet warna, peredupan, dan pembatasan arus, dan biasanya lebih cepat. Adafruit NeoPixel menawarkan API yang lebih sederhana; kalau kamu baru mulai, cara yang bagus adalah memulai dengan salah satunya lalu mencoba yang lain.

Berapa banyak LED WS2812B yang bisa dikendalikan Arduino Uno?

Batasnya ditentukan oleh RAM dan kecepatan. Karena setiap LED memakan 3 byte dari RAM 2 KB milik Uno, dalam praktiknya ada batas sekitar 500 LED setelah variabel lain ikut dihitung. Selain itu, karena mengirim data ke setiap LED butuh 30 µs, satu frame untuk 1000 LED mencapai 30 ms. Di ESP32 dan Pico yang RAM-nya lega, ribuan LED pun mungkin; batas sebenarnya jadi catu daya.

Kenapa ujung LED strip-ku menyala kuning atau redup?

Ini tanda jatuh tegangan. Jalur tembaga tipis di strip kehilangan tegangan seiring naiknya arus; di bawah 4 V, LED di ujung menghasilkan biru dan hijau yang lemah, dan warna putih bergeser ke kuning. Kamu bisa mengatasinya dengan menarik kabel 5V dan GND terpisah dari catu daya ke bagian tengah dan ujung strip, serta sedikit menurunkan kecerahan.

Lihat semua proyek
Menggunakan LED Strip WS2812B
#69Menengah
Premium

Menggunakan LED Strip WS2812B

Kenalan dengan LED strip pintar yang setiap lampunya bisa kamu warnai sendiri-sendiri. Arduino pertama-tama menyalakan lima LED pertama dengan warna merah, sedetik kemudian lima lainnya biru, lalu mem

4.8(54)
70
Lampu Polisi dengan WS2812B
#70Menengah
Premium

Lampu Polisi dengan WS2812B

Kamu membawa lampu merah dan biru dari atap mobil polisi langsung ke mejamu. Separuh dari strip WS2812B sepuluh LED berkedip merah tiga kali dengan cepat, lalu separuh lainnya berkedip biru tiga kali,

4.8(67)
86
LED Berjalan WS2812B
#71Menengah
Premium

LED Berjalan WS2812B

Di strip sepuluh LED, satu titik cahaya hijau bergerak dari awal ke akhir satu LED demi satu, lalu melompat kembali ke awal; titik itu bertahan di setiap LED selama sepertiga detik. Di strip WS2812B,

4.8(58)
75
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
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
Animasi WS2812B 1
#75Menengah
Premium

Animasi WS2812B 1

Di strip 56 LED, semua warna pelangi berjajar berdampingan dan mengalir tanpa pernah berhenti, seolah sungai cahaya meluncur di sepanjang strip. Setiap LED menyala dengan warna yang sedikit berbeda da

4.9(69)
89
Animasi WS2812B 2
#76Menengah
Premium

Animasi WS2812B 2

Siapkan pertunjukan cahaya di kamarmu yang berganti warna dengan sendirinya. Arduino terus mengalirkan warna di sepanjang strip 30 LED dan berganti ke set warna baru setiap beberapa detik: pelangi, ga

4.8(65)
84
Kendali Strip NeoPixel WS2812B ESP32
#126Menengah
Premium

Kendali Strip NeoPixel WS2812B ESP32

LED addressable WS2812B (NeoPixel) adalah LED RGB pintar yang bisa dikendalikan secara berantai lewat satu pin data. Di proyek ini, kita mengendalikan strip WS2812B 8 LED dengan library Adafruit_NeoPixel untuk membuat animasi pelangi yang halus. Meskipun level logika 3,3V ESP32 bekerja lancar dengan sebagian besar komponen WS2812B, kita menunjukkan solusi dengan resistor seri 470Ω dan kapasitor 1000µF untuk berjaga-jaga jika tidak stabil. Animasinya dibuat dengan menggeser nilai hue.

4.9(19)
30