Elektronika
Tingkat: Pemula
Estimasi: 30 Menit4 x dilihat
Cara Menggunakan Remote IR dan LED WS2812 dengan Arduino
Ringkasan Proyek
Pelajari cara mengendalikan LED strip WS2812 menggunakan remote infrared dan Arduino Nano. Proyek ini menghadirkan berbagai mode animasi cahaya, pengaturan warna, dan tingkat kecerahan melalui tombol remote. Kamu juga akan mengenal penggunaan library IRremote dan Adafruit NeoPixel serta memahami tantangan pengaturan timing ketika menggabungkan sinyal infrared dengan LED addressable.
Bahan & Komponen
Daftar perangkat keras, modul, dan tools yang dibutuhkan untuk merakit proyek ini.
Daftar Komponen & Perangkat Keras
1x Arduino Nano R3 (Mikrokontroler untuk membaca perintah remote IR dan mengendalikan LED strip).
1x DFRobot WS2812 180 LED 3m (LED strip addressable yang setiap LED-nya dapat dikendalikan secara individual).
1x DFRobot IR Remote Kit for Arduino (Perangkat remote infrared dan penerima sinyal untuk mengontrol proyek).
1x Resistor 330Ω (Dipasang pada jalur data LED untuk membantu mengurangi noise dan mencegah flickering atau pixel yang terlewat).
Catu Daya Tambahan
1x Power Supply 5V DC (Catu daya eksternal untuk LED strip. Penulis menjelaskan bahwa strip 180 LED dapat membutuhkan arus hingga sekitar 10,8A ketika seluruh LED menyala putih dengan kecerahan penuh).
Software dan Library
Arduino IDE 2.0.13 (Lingkungan pengembangan yang digunakan penulis untuk menulis dan mengunggah program).
IRremote Library (Library untuk menerima dan membaca sinyal dari remote infrared).
Adafruit NeoPixel Library (Library untuk mengontrol warna, kecerahan, dan animasi LED WS2812).
WS2812IR dan WS2812IR_NB (Library buatan penulis yang tersedia di repository GitHub. Versi NB menggunakan pendekatan non-blocking).
Catatan: Daftar hardware asli mencantumkan LED strip, IR Remote Kit, Arduino Nano, jumper wires, dan resistor 330Ω. Power supply 5V merupakan kebutuhan tambahan yang dijelaskan pada bagian Power dalam artikel.
Langkah Pembuatan
Khusus Member
Panduan perakitan tahap demi tahap dan catatan proses pengerjaan.
Proyek ini menunjukkan cara menggabungkan remote infrared dengan LED strip WS2812 menggunakan Arduino Nano. LED WS2812 merupakan LED addressable, sehingga setiap pixel dapat memiliki warna dan tingkat kecerahan yang berbeda. Remote IR digunakan untuk mengubah warna, kecerahan, dan mode animasi.
Proyek How to Use IR Remote and WS2812 LEDs with Arduino oleh K Gray.
Langkah 1: Memahami LED WS2812
WS2812 adalah jenis LED addressable yang memungkinkan setiap LED pada satu strip dikendalikan secara individual. Setiap pixel memiliki tiga komponen warna, yaitu Red, Green, dan Blue (RGB). Dengan mengatur intensitas ketiga warna tersebut, kita dapat menghasilkan berbagai warna, termasuk putih.
Berbeda dengan LED biasa, WS2812 membutuhkan pengiriman data dengan timing yang sangat presisi agar warna dan animasi dapat ditampilkan dengan benar.
Langkah 2: Memahami Cara Kerja Remote Infrared
Remote IR mengirimkan perintah menggunakan pulsa cahaya infrared yang tidak terlihat oleh mata manusia. IR receiver menangkap pulsa tersebut dan mengubahnya menjadi data yang dapat dibaca Arduino.
Proses penerimaan sinyal IR juga membutuhkan timing yang presisi. Inilah tantangan utama proyek ini karena WS2812 dan remote IR sama-sama membutuhkan pengaturan timing yang akurat.
Langkah 3: Memahami Tantangan Penggabungan IR dan WS2812
Penulis menemukan bahwa ketika Arduino sedang memperbarui tampilan LED WS2812, sinyal dari remote IR terkadang tidak dapat dibaca dengan benar. Hal ini terjadi karena kedua perangkat membutuhkan timing yang presisi.
Pada pendekatan awal, penulis menggunakan metode menerima kode IR sebagai interupsi untuk menghentikan atau mengubah tampilan LED. Metode ini memiliki keterbatasan, misalnya remote lain juga dapat mematikan tampilan dan perintah tidak dapat digunakan untuk memperbarui tampilan selama animasi berjalan.
Penulis kemudian mengembangkan pendekatan lain menggunakan non-blocking code. Pendekatan ini memungkinkan program memeriksa input remote dan memperbarui animasi tanpa harus terus-menerus menunggu proses tertentu selesai.
Langkah 4: Menyiapkan Catu Daya LED Strip
LED WS2812 membutuhkan daya yang cukup besar, terutama ketika seluruh pixel menyala putih. Setiap pixel dapat menggunakan sekitar 60mA ketika ketiga kanal RGB menyala dengan intensitas penuh.
Untuk LED strip yang terdiri dari 180 pixel, perkiraan kebutuhan arus maksimalnya adalah:
180 × 0,06A = 10,8A
Gunakan power supply 5V DC yang mampu menyediakan arus sesuai kebutuhan LED strip. Penulis menyarankan penggunaan caged AC to DC converter. Untuk jumlah LED yang lebih sedikit, kebutuhan arus juga lebih rendah.
Ilustrasi proyek LED WS2812 yang dikendalikan menggunakan Arduino.
Langkah 5: Merangkai LED WS2812 dan Arduino
Siapkan Arduino Nano dan LED strip WS2812. Hubungkan jalur data LED ke pin digital 2 Arduino melalui resistor 330Ω. Resistor pada jalur data digunakan untuk membantu mengurangi noise, flickering, dan pixel yang terlewat.
Hubungkan jalur 5V LED strip ke power supply 5V eksternal dan hubungkan GND LED strip dengan GND power supply serta GND Arduino. Pastikan seluruh ground terhubung bersama agar sinyal data memiliki referensi tegangan yang sama.
Hubungkan IR receiver dari DFRobot IR Remote Kit ke Arduino sesuai pinout modul. Dalam kode yang disediakan, pin penerima IR ditentukan sebagai pin digital 3.
Catatan: Artikel meminjam diagram rangkaian WS2812 dari HowToMechatronics. Nomor pin data LED dan IR receiver mengikuti kode program yang disediakan penulis.
Diagram skematik WS2812 yang digunakan sebagai referensi perakitan dan dikreditkan kepada HowToMechatronics.
Langkah 6: Memasang Library Arduino
Buka Arduino IDE dan siapkan library yang dibutuhkan oleh program:
IRremote: digunakan untuk membaca perintah yang dikirimkan oleh remote infrared.
Adafruit NeoPixel: digunakan untuk mengendalikan pixel LED WS2812, termasuk warna, kecerahan, dan animasi.
Penulis juga menyediakan library WS2812IR dan WS2812IR_NB melalui repository GitHub. Program yang disertakan dalam dokumentasi ini menggunakan pendekatan non-blocking dan memanggil IRremote serta Adafruit NeoPixel secara langsung.
Langkah 7: Mengatur Pin dan Jumlah LED
Program menggunakan konfigurasi berikut:
RECV_PIN = 3: pin penerima sinyal remote IR.
PIN = 2: pin data LED WS2812.
NUMPIXELS = 180: jumlah pixel LED pada strip.
modeAmount = 5: jumlah mode animasi yang tersedia.
Pastikan konfigurasi tersebut sesuai dengan rangkaian fisik yang dibuat.
Langkah 8: Mengunggah dan Menguji Program
Buka file WS2812IR_No_Blocking_with_Modes.ino dari repository penulis. Pilih board Arduino Nano dan port yang sesuai di Arduino IDE, kemudian unggah program.
Setelah program berjalan, arahkan remote ke IR receiver dan gunakan tombol berikut:
POWER: menyalakan atau mematikan tampilan LED.
VOL+: meningkatkan kecerahan LED.
VOL-: mengurangi kecerahan LED.
FUNC.: mengaktifkan atau menonaktifkan mode animasi.
BACK: memilih mode sebelumnya atau mengubah warna ke arah sebelumnya.
NEXT: memilih mode berikutnya atau mengubah warna ke arah berikutnya.
Perhatikan perubahan tampilan LED setiap kali tombol remote ditekan.
Langkah 9: Mengenal Lima Mode Animasi
Program menyediakan lima mode animasi yang dapat dipilih menggunakan tombol BACK dan NEXT ketika mode animasi aktif.
Mode 1: dua kelompok cahaya bergerak secara bergantian sepanjang LED strip.
Mode 2: cahaya bergerak melintasi LED strip secara bertahap dengan posisi pixel yang bergeser.
Mode 3: pixel menyala putih secara acak dengan jeda dan durasi yang berubah-ubah.
Mode 4: efek warna berjalan dengan perubahan hue secara bertahap sepanjang strip.
Mode 5: efek cahaya yang muncul dan meredup secara bertahap pada posisi pixel acak.
Langkah 10: Memahami Pengaturan Warna dan Kecerahan
Ketika mode animasi tidak aktif, tombol BACK dan NEXT digunakan untuk mengubah nilai hue sehingga warna LED dapat berganti. Tombol VOL+ dan VOL- mengatur tingkat kecerahan melalui variabel bright.
Nilai kecerahan dibatasi antara 0 sampai 255. Program memperbarui tampilan LED dengan fungsi setBrightness() dari Adafruit NeoPixel.
Langkah 11: Memahami Non-Blocking Code
Program menggunakan fungsi millis() untuk mengukur waktu tanpa menghentikan keseluruhan program. Dengan cara ini, Arduino dapat memeriksa perintah remote dan memperbarui animasi LED secara bergantian.
Fungsi listenIR() memeriksa sinyal infrared, sedangkan takeStep() memperbarui animasi LED. Pemisahan tugas ini membantu program tetap responsif selama LED strip menampilkan efek cahaya.
Langkah 12: Menyelesaikan Proyek
Setelah seluruh fungsi berjalan, coba berbagai tombol remote dan amati lima mode animasi yang tersedia. Ubah warna serta tingkat kecerahan untuk mengeksplorasi berbagai tampilan cahaya.
Pastikan power supply mampu menyediakan arus yang cukup untuk jumlah LED yang digunakan. Jangan mengambil seluruh daya LED strip dari pin 5V Arduino Nano karena kebutuhan arus LED dapat jauh lebih besar daripada kemampuan pin tersebut.
🔒
Akses Gratis Khusus Member
Buka Seluruh Panduan, Skema & Source Code
Dapatkan akses penuh ke langkah perakitan detail, diagram sirkuit lengkap, dan source code siap pakai. Gratis selamanya!
Proyek ini menunjukkan cara menggabungkan remote infrared dengan LED strip WS2812 menggunakan Arduino Nano. LED WS2812 merupakan LED addressable, sehingga setiap pixel dapat memiliki warna dan tingkat kecerahan yang berbeda. Remote IR digunakan untuk mengubah warna, kecerahan, dan mode animasi.
Proyek How to Use IR Remote and WS2812 LEDs with Arduino oleh K Gray.
Langkah 1: Memahami LED WS2812
WS2812 adalah jenis LED addressable yang memungkinkan setiap LED pada satu strip dikendalikan secara individual. Setiap pixel memiliki tiga komponen warna, yaitu Red, Green, dan Blue (RGB). Dengan mengatur intensitas ketiga warna tersebut, kita dapat menghasilkan berbagai warna, termasuk putih.
Berbeda dengan LED biasa, WS2812 membutuhkan pengiriman data dengan timing yang sangat presisi agar warna dan animasi dapat ditampilkan dengan benar.
Langkah 2: Memahami Cara Kerja Remote Infrared
Remote IR mengirimkan perintah menggunakan pulsa cahaya infrared yang tidak terlihat oleh mata manusia. IR receiver menangkap pulsa tersebut dan mengubahnya menjadi data yang dapat dibaca Arduino.
Proses penerimaan sinyal IR juga membutuhkan timing yang presisi. Inilah tantangan utama proyek ini karena WS2812 dan remote IR sama-sama membutuhkan pengaturan timing yang akurat.
Langkah 3: Memahami Tantangan Penggabungan IR dan WS2812
Penulis menemukan bahwa ketika Arduino sedang memperbarui tampilan LED WS2812, sinyal dari remote IR terkadang tidak dapat dibaca dengan benar. Hal ini terjadi karena kedua perangkat membutuhkan timing yang presisi.
Pada pendekatan awal, penulis menggunakan metode menerima kode IR sebagai interupsi untuk menghentikan atau mengubah tampilan LED. Metode ini memiliki keterbatasan, misalnya remote lain juga dapat mematikan tampilan dan perintah tidak dapat digunakan untuk memperbarui tampilan selama animasi berjalan.
Penulis kemudian mengembangkan pendekatan lain menggunakan non-blocking code. Pendekatan ini memungkinkan program memeriksa input remote dan memperbarui animasi tanpa harus terus-menerus menunggu proses tertentu selesai.
Langkah 4: Menyiapkan Catu Daya LED Strip
LED WS2812 membutuhkan daya yang cukup besar, terutama ketika seluruh pixel menyala putih. Setiap pixel dapat menggunakan sekitar 60mA ketika ketiga kanal RGB menyala dengan intensitas penuh.
Untuk LED strip yang terdiri dari 180 pixel, perkiraan kebutuhan arus maksimalnya adalah:
180 × 0,06A = 10,8A
Gunakan power supply 5V DC yang mampu menyediakan arus sesuai kebutuhan LED strip. Penulis menyarankan penggunaan caged AC to DC converter. Untuk jumlah LED yang lebih sedikit, kebutuhan arus juga lebih rendah.
Ilustrasi proyek LED WS2812 yang dikendalikan menggunakan Arduino.
Langkah 5: Merangkai LED WS2812 dan Arduino
Siapkan Arduino Nano dan LED strip WS2812. Hubungkan jalur data LED ke pin digital 2 Arduino melalui resistor 330Ω. Resistor pada jalur data digunakan untuk membantu mengurangi noise, flickering, dan pixel yang terlewat.
Hubungkan jalur 5V LED strip ke power supply 5V eksternal dan hubungkan GND LED strip dengan GND power supply serta GND Arduino. Pastikan seluruh ground terhubung bersama agar sinyal data memiliki referensi tegangan yang sama.
Hubungkan IR receiver dari DFRobot IR Remote Kit ke Arduino sesuai pinout modul. Dalam kode yang disediakan, pin penerima IR ditentukan sebagai pin digital 3.
Catatan: Artikel meminjam diagram rangkaian WS2812 dari HowToMechatronics. Nomor pin data LED dan IR receiver mengikuti kode program yang disediakan penulis.
Diagram skematik WS2812 yang digunakan sebagai referensi perakitan dan dikreditkan kepada HowToMechatronics.
Langkah 6: Memasang Library Arduino
Buka Arduino IDE dan siapkan library yang dibutuhkan oleh program:
IRremote: digunakan untuk membaca perintah yang dikirimkan oleh remote infrared.
Adafruit NeoPixel: digunakan untuk mengendalikan pixel LED WS2812, termasuk warna, kecerahan, dan animasi.
Penulis juga menyediakan library WS2812IR dan WS2812IR_NB melalui repository GitHub. Program yang disertakan dalam dokumentasi ini menggunakan pendekatan non-blocking dan memanggil IRremote serta Adafruit NeoPixel secara langsung.
Langkah 7: Mengatur Pin dan Jumlah LED
Program menggunakan konfigurasi berikut:
RECV_PIN = 3: pin penerima sinyal remote IR.
PIN = 2: pin data LED WS2812.
NUMPIXELS = 180: jumlah pixel LED pada strip.
modeAmount = 5: jumlah mode animasi yang tersedia.
Pastikan konfigurasi tersebut sesuai dengan rangkaian fisik yang dibuat.
Langkah 8: Mengunggah dan Menguji Program
Buka file WS2812IR_No_Blocking_with_Modes.ino dari repository penulis. Pilih board Arduino Nano dan port yang sesuai di Arduino IDE, kemudian unggah program.
Setelah program berjalan, arahkan remote ke IR receiver dan gunakan tombol berikut:
POWER: menyalakan atau mematikan tampilan LED.
VOL+: meningkatkan kecerahan LED.
VOL-: mengurangi kecerahan LED.
FUNC.: mengaktifkan atau menonaktifkan mode animasi.
BACK: memilih mode sebelumnya atau mengubah warna ke arah sebelumnya.
NEXT: memilih mode berikutnya atau mengubah warna ke arah berikutnya.
Perhatikan perubahan tampilan LED setiap kali tombol remote ditekan.
Langkah 9: Mengenal Lima Mode Animasi
Program menyediakan lima mode animasi yang dapat dipilih menggunakan tombol BACK dan NEXT ketika mode animasi aktif.
Mode 1: dua kelompok cahaya bergerak secara bergantian sepanjang LED strip.
Mode 2: cahaya bergerak melintasi LED strip secara bertahap dengan posisi pixel yang bergeser.
Mode 3: pixel menyala putih secara acak dengan jeda dan durasi yang berubah-ubah.
Mode 4: efek warna berjalan dengan perubahan hue secara bertahap sepanjang strip.
Mode 5: efek cahaya yang muncul dan meredup secara bertahap pada posisi pixel acak.
Langkah 10: Memahami Pengaturan Warna dan Kecerahan
Ketika mode animasi tidak aktif, tombol BACK dan NEXT digunakan untuk mengubah nilai hue sehingga warna LED dapat berganti. Tombol VOL+ dan VOL- mengatur tingkat kecerahan melalui variabel bright.
Nilai kecerahan dibatasi antara 0 sampai 255. Program memperbarui tampilan LED dengan fungsi setBrightness() dari Adafruit NeoPixel.
Langkah 11: Memahami Non-Blocking Code
Program menggunakan fungsi millis() untuk mengukur waktu tanpa menghentikan keseluruhan program. Dengan cara ini, Arduino dapat memeriksa perintah remote dan memperbarui animasi LED secara bergantian.
Fungsi listenIR() memeriksa sinyal infrared, sedangkan takeStep() memperbarui animasi LED. Pemisahan tugas ini membantu program tetap responsif selama LED strip menampilkan efek cahaya.
Langkah 12: Menyelesaikan Proyek
Setelah seluruh fungsi berjalan, coba berbagai tombol remote dan amati lima mode animasi yang tersedia. Ubah warna serta tingkat kecerahan untuk mengeksplorasi berbagai tampilan cahaya.
Pastikan power supply mampu menyediakan arus yang cukup untuk jumlah LED yang digunakan. Jangan mengambil seluruh daya LED strip dari pin 5V Arduino Nano karena kebutuhan arus LED dapat jauh lebih besar daripada kemampuan pin tersebut.
Skema & Diagram Sirkuit
Skema Rangkaian Arduino Nano dengan WS2812 dan Remote IR
Rangkaian menggunakan Arduino Nano sebagai pengendali, LED strip WS2812 sebagai output cahaya, dan IR receiver sebagai penerima perintah dari remote.
Jalur Koneksi
WS2812 DIN: terhubung ke pin digital 2 Arduino Nano melalui resistor 330Ω.
WS2812 5V: terhubung ke output positif power supply eksternal 5V DC.
WS2812 GND: terhubung ke GND power supply.
Arduino GND: dihubungkan bersama dengan GND power supply LED agar memiliki common ground.
IR Receiver OUT: terhubung ke pin digital 3 Arduino Nano sesuai konfigurasi RECV_PIN.
IR Receiver VCC dan GND: dihubungkan ke tegangan dan ground sesuai spesifikasi modul penerima IR.
Perhitungan kebutuhan daya: Penulis menjelaskan bahwa satu pixel WS2812 dapat membutuhkan sekitar 60mA pada kondisi putih dengan kecerahan penuh. Untuk 180 pixel, perkiraan arus maksimal adalah 10,8A. Oleh karena itu, gunakan power supply 5V dengan kapasitas arus yang sesuai.
Diagram skematik LED WS2812 yang dirujuk oleh penulis dari HowToMechatronics.
Catatan: Diagram ini merupakan referensi rangkaian WS2812 dari HowToMechatronics, bukan diagram lengkap khusus untuk seluruh komponen proyek. Koneksi IR receiver mengikuti konfigurasi pin dalam kode. Pastikan tegangan dan polaritas power supply sesuai spesifikasi LED strip dan modul IR.
Kode Program
Kode Program Arduino: WS2812IR_No_Blocking_with_Modes.ino
Kode berikut merupakan sketch non-blocking yang ditampilkan pada dokumentasi Hackster.io. Program menggunakan library IRremote dan Adafruit NeoPixel.
/*************************************************************
File Name: WS2812IR_No_Blocking_with_Modes.ino
Processor/Platform: Arduino (Nano tested)
Development Environment: Arduino 2.0.13
Download latest code here:
https://github.com/Kgray44/WS2812IR
Driveway Gates code meant to be used alongside the tutorial found here:
https://www.hackster.io/k-gray/how-to-use-ir-remote-and-ws2812-leds-with-arduino-342df9
Copyright 2022 K Gray
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Liscense found here:
https://opensource.org/licenses/MIT
*************************************************************/
bool testIR = false;//true or false
#include <IRremote.h>
#include <Adafruit_NeoPixel.h>
#define modeAmount 5
#define hueinc 1000
#define brightinc 20
#define RECV_PIN 3
#define PIN 2
#define NUMPIXELS 180
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long key_value = 0;
unsigned long hue = 0;
int bright = 127;
int modecount = 0;
bool mode = false;
bool on = true;
bool update = true;
int currentpixel=0;
bool first = true;
int section = 1;
bool flash = false;
int t=1;
int d=1;
int p=1;
unsigned long firstpixelhue=0;
struct structu {
int value=0;
unsigned long lastm=0;
int timeb=0;
int number=0;
bool rising=true;
};
structu pixelF[15];
int pc=0;
unsigned long lastmillis=0;
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
Serial.begin(9600);
irrecv.enableIRIn();
irrecv.blink13(true);
pixels.begin();
}
void loop() {
listenIR();
takeStep();
}
void listenIR() {
if (irrecv.decode()) {
handleKey();
irrecv.resume(); // Receive the next value
}
}
void takeStep(){
if (on){
pixels.setBrightness(bright);
if (!mode){
if (update){
pixels.fill(pixels.gamma32(pixels.ColorHSV(hue)),0,NUMPIXELS);
pixels.show();
update=false;
}
}
else {
if (modecount == 0){
if (millis() - lastmillis > 300){
if (first){
currentpixel=currentpixel+6;
pixels.fill(pixels.gamma32(pixels.ColorHSV(hue)),currentpixel,currentpixel+3);
pixels.fill(pixels.Color(0,0,0),currentpixel+3,currentpixel+6);
if (currentpixel >= NUMPIXELS){
pixels.show();
currentpixel=0;
first = false;
lastmillis = millis();
}
}
else {
currentpixel=currentpixel+6;
pixels.fill(pixels.Color(0,0,0),currentpixel,currentpixel+3);
pixels.fill(pixels.gamma32(pixels.ColorHSV(hue)),currentpixel+3,currentpixel+6);
if (currentpixel >= NUMPIXELS){
pixels.show();
currentpixel=0;
first = true;
lastmillis = millis();
}
}
}
}
else if (modecount == 1){
if (millis() - lastmillis > 200){
if (section == 1){
currentpixel=currentpixel+3;
pixels.setPixelColor(currentpixel,pixels.gamma32(pixels.ColorHSV(hue)));
pixels.setPixelColor(currentpixel-1,pixels.Color(0,0,0));
if (currentpixel >= NUMPIXELS){
pixels.show();
currentpixel=1;
section = 2;
lastmillis = millis();
}
}
else if (section == 2){
currentpixel=currentpixel+3;
pixels.setPixelColor(currentpixel,pixels.gamma32(pixels.ColorHSV(hue)));
pixels.setPixelColor(currentpixel-1,pixels.Color(0,0,0));
if (currentpixel >= NUMPIXELS){
pixels.show();
currentpixel=2;
section = 3;
lastmillis = millis();
}
}
else {
currentpixel=currentpixel+3;
pixels.setPixelColor(currentpixel,pixels.gamma32(pixels.ColorHSV(hue)));
pixels.setPixelColor(currentpixel-1,pixels.Color(0,0,0));
if (currentpixel >= NUMPIXELS){
pixels.show();
currentpixel=0;
section = 1;
lastmillis = millis();
}
}
}
}
else if (modecount == 2){
if (millis() - lastmillis > t && !flash){
pixels.setPixelColor(p,pixels.Color(255,255,255));
pixels.show();
flash = true;
lastmillis = millis();
}
else if (millis() - lastmillis > d && flash){
pixels.setPixelColor(p,pixels.Color(0,0,0));
pixels.show();
flash = false;
lastmillis = millis();
t = random(10,500);
d = random(4,30);
p = random(0,NUMPIXELS);
}
}
else if (modecount == 3){
if (millis() - lastmillis > 5){
currentpixel++;
int pixelHue = firstpixelhue + (currentpixel * 65536L / NUMPIXELS);
pixels.setPixelColor(currentpixel,pixels.ColorHSV(pixelHue));
if (currentpixel >= NUMPIXELS){
pixels.show();
currentpixel=0;
firstpixelhue=firstpixelhue+256;
lastmillis = millis();
}
}
}
else if (modecount == 4){
pc++; if (pc>10){pc=0;}
if (millis() - pixelF[pc].lastm > pixelF[pc].timeb){
if (pixelF[pc].rising==true){
pixelF[pc].value=pixelF[pc].value+10;
pixels.setPixelColor(pixelF[pc].number, pixels.Color(pixelF[pc].value,pixelF[pc].value,map(pixelF[pc].value,0,255,0,80)));
pixels.show();
if (pixelF[pc].value >= 250){
pixelF[pc].value=250;
pixels.setPixelColor(pixelF[pc].number, pixels.Color(pixelF[pc].value,pixelF[pc].value,map(pixelF[pc].value,0,255,0,80)));
pixels.show();
pixelF[pc].timeb=random(50,1000);
pixelF[pc].lastm=millis();
pixelF[pc].rising=false;
}
}
else {
pixelF[pc].value=pixelF[pc].value-10;
pixels.setPixelColor(pixelF[pc].number, pixels.Color(pixelF[pc].value,pixelF[pc].value,map(pixelF[pc].value,0,255,0,80)));
pixels.show();
if (pixelF[pc].value <= 0){
pixelF[pc].value=0;
pixels.setPixelColor(pixelF[pc].number, pixels.Color(0,0,0));
pixels.show();
pixelF[pc].timeb=random(1000,14000);
pixelF[pc].lastm=millis();
pixelF[pc].rising=true;
pixelF[pc].number=random(0,NUMPIXELS);
}
}
}
}
}
}
else {
if (update){
clear();
update=false;
}
}
}
void clear(){
pixels.fill(pixels.Color(0,0,0),0,NUMPIXELS);
pixels.show();
}
void handleKey() {
uint16_t command;
if (irrecv.decodedIRData.protocol == 7 && !testIR){
command = irrecv.decodedIRData.command;
}
if (testIR){
Serial.println(command);
return;
}
Serial.println("Protocol:" + String(irrecv.decodedIRData.protocol));
switch (command) {
case 0: Serial.println("POWER"); update=true;currentpixel=0;on = !on; break;
case 1: Serial.println("VOL+"); update=true;bright+=brightinc;if(bright>255){bright=255;} break;
case 2: Serial.println("FUNC."); update=true;clear();mode = !mode; break;
case 4: Serial.println("BACK"); update=true;if (mode){clear();modecount--;if(modecount<0){modecount=modeAmount-1;}}else{hue-=hueinc;if(hue<0){hue=65536;}} break;
case 5: Serial.println("PLAY"); break;
case 6: Serial.println("NEXT"); update=true;if (mode){clear();modecount++;if(modecount>modeAmount-1){modecount=0;}}else{hue+=hueinc;if(hue>65536){hue=0;}} break;
case 8: Serial.println("DOWN"); break;
case 9: Serial.println("VOL-"); update=true;bright-=brightinc;if(bright<0){bright=0;} break;
case 10: Serial.println("UP"); break;
case 12: Serial.println("num: 0"); break;
case 13: Serial.println("EQ"); break;
case 14: Serial.println("REPT."); break;
case 16: Serial.println("num: 1"); break;
case 17: Serial.println("num: 2"); break;
case 18: Serial.println("num: 3"); break;
case 20: Serial.println("num: 4"); break;
case 21: Serial.println("num: 5"); break;
case 22: Serial.println("num: 6"); break;
case 24: Serial.println("num: 7"); break;
case 25: Serial.println("num: 8"); break;
case 26: Serial.println("num: 9"); break;
default: Serial.println(command); break;
}
}
Repository Kode Sumber
Penulis menyediakan library dan sketch tambahan melalui repository GitHub berikut:
https://github.com/Kgray44/WS2812IR
Dokumentasi fungsi untuk library WS2812IR_NB juga tersedia di:
Catatan teknis: Kode di atas disalin dari sketch yang ditampilkan pada halaman Hackster. Penulis menyebut sketch ini telah diuji menggunakan Arduino Nano. Sebelum digunakan, pastikan versi library IRremote kompatibel. Pada kode asli, variabel command hanya diisi jika protokol yang diterima bernilai 7 dan testIR bernilai false; periksa kondisi tersebut jika remote yang digunakan memiliki protokol berbeda.