Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Excel untuk WS2812 RGB LED Array Animations

Komponen dan persediaan

Arduino UNO
× 1
ws2812 8x8 matriks LED RGB
× 1
Kabel Jumper Pria/Wanita
Tiga saya adalah Black-Gnd, Red-5v dan Green-Data
× 3
Baterai 9V (generik)
× 1
Konektor 9V ke Barrel Jack
× 1
Male-Header 5 Posisi- 1 Baris- Panjang (0,1" )
Hanya tiga pin yang diperlukan
× 1

Alat dan mesin yang diperlukan

Besi solder (generik)
Kawat Solder, Bebas Timah

Tentang proyek ini

Setelah memeriksa bahwa ada dukungan on-line, saya memesan matriks LED WS2812 8x8 RGB yang diharapkan akan ditangani sebagai struktur koordinat XY, bukan rantai daisy (pita) dari 64 LED yang dibungkus menjadi 8 baris 8!

Pencarian “WS2812 Led animation” menghasilkan sedikit yang dapat saya pahami dengan mudah dan segera. Ketika saya menemukan video YouTube yang diproduksi oleh Kevin Darrah, dia menangani matriks 16 x 16 (256LED daisy chain) seolah-olah itu adalah sistem koordinat XY.

Utilitas Excel-nya mengkompilasi kode teks untuk menyalin/menempel ke sketsanya di mana semua fungsi yang diperlukan; tidak ada perpustakaan yang perlu diimpor.

Ketika dia memilih sel dalam utilitasnya dan nilai RGB ditambahkan, mereka diterapkan ke sel yang dipilih tanpa diskriminasi; bukan yang saya inginkan jadi saya mendesain ulang dan membangunnya kembali. Itu juga berarti saya harus mengubah sketsanya untuk kompatibilitas 8x8.

Ketika saya bertanya lebih banyak tentang WS2812 saya, saya harus terus memodifikasi aplikasi Excel saya, LED_Utility.xlsm.

Buku Kerja Excel sekarang menawarkan:

  • Properti RGB LED untuk ditangani satu per satu.
  • Mengubah properti tersebut secara dinamis melalui pemrograman.
  • Relokasi XY dari properti tersebut untuk mensimulasikan gerakan.
  • Nilai RGB yang akan ditangani serta mengubah lokasi XY.
  • Pengalamatan LED 8x8 dan 16x16.
  • Sekumpulan kecil nilai RGB untuk referensi cepat.

Secara khusus, tujuan saya adalah untuk:

  • Kembangkan kotak berongga merah dan nyalakan dan matikan.
  • Overlay kotak lain dengan lapisan warna yang berbeda dan bergantian di antara mereka.
  • Kembangkan kotak Merah dan mainkan.
  • Pertimbangkan pemikiran tentang penggunaan fungsi untuk menahan elemen tampilan; Saya akan membuat spiral yang memudar.
  • Buat desain di mana warna memudar masuk dan keluar.
  • Bawa gerakan ke dalam desain.
  • Alamat array 16x16.

Saya menyadari bahwa pengetahuan pemrograman akan menciptakan masalah. Saya telah menawarkan beberapa panduan tetapi menyarankan penelitian atau meminta seseorang yang mungkin secara pribadi menyarankan Anda.

KEPADA MULAI

Merakit perangkat keras

Jika matriks Anda datang tanpa pin header, solder bank pin header ke bagian belakang Matrix di lokasi yang lebih rendah (DIN, +5V, GND). Hubungkan pin DIN ke pin 8 di sebelah kanan Arduino dan dua lainnya ke lokasi yang cocok di sisi lain papan.

Untuk papan ini, dan utilitasnya, XY (0, 0) berada di kiri atas.

Utilitas Excel

Buka file LED_Utility.xlsm. Anda akan melihat tiga lembar, "Eight", "Sixteen" dan "ColMap".

Yang terakhir adalah contoh kecil kode RGB yang disediakan untuk referensi.

Saya telah mengatur LED_Utility.xlsm ke read-only untuk mencegah keduanya menimpa tetapi juga untuk mendorong penggunaan "SaveAs" untuk menyimpan file untuk kemungkinan penggunaan kembali. Beberapa "jebakan kesalahan" lainnya juga telah terpasang.

Pilih Lembar Kerja "Delapan".

Perhatikan bahwa kisi sebelah kanan diisi dengan nol. Itu penting karena sketsa tidak akan menerima nilai 'null'.

Ada empat tombol seperti yang ditunjukkan di atas (pada “Sixteen” tombol tersebut mungkin berada di luar layar di sebelah kanan, satu di bawah yang lain, tetapi akan berfungsi seperti yang dijelaskan di bawah).

Untuk menghasilkan kode teks:

"Show" menampilkan RGB nilai di grid kiri. Ini hanya menangani nilai dari 0-255. Ini akan mengingatkan nilai di atas 255 atau variabel apa pun.

“Var Map” menerima numerik dan variabel tetapi tidak menawarkan tampilan.

"Bungkus Peta" adalah dua tingkat. Ini menerima nilai RGB yang biasanya dimasukkan untuk tampilan "Tampilkan". Kemudian menambahkan fungsi modulus untuk pengkodean sketsa untuk memungkinkan overrun matriks. Variabel kedua dapat ditambahkan tetapi kemudian harus diprogram dalam sketsa. Saya tidak membahas itu di sini.

Masing-masing menghasilkan teks 'Merah' di bawah kisi (di kedua Lembar Kerja) yang kompatibel dengan sketsa yang dirancang untuk menerimanya.

“Hapus” jelas akan menghilangkan kedua kisi.

Ini semua akan dijelaskan nanti.

Saat Anda bekerja dengan Utilitas Excel, saya sarankan Anda menggunakan File/SaveAs... setelah Anda melakukannya membuat kode Anda sehingga Anda tidak perlu membuat ulang desain Anda di beberapa tempat hal lain, dan terutama jika desainnya cukup rumit. Juga, LED_Utility.xlsm asli telah disetel ke hanya-baca untuk melindunginya agar tidak ditimpa.

Sketsa

Kode ditawarkan di bawah dengan catatan peringatan untuk menyimpan dengan properti Hanya-Baca.

Buka Arduino IDE dan muat sketsa ‘LED_Arduino.ino’.

Anda akan melihat bahwa:

  • Baris 3 mendefinisikan pin Arduino yang digunakan. Ini ditetapkan sebagai Pin 8.
  • Baris 4 mendefinisikan unit LED di papan tulis. Ini 64.
  • Namun Baris 5 mengalikan angka tersebut dengan 3 untuk memperhitungkan jumlah RBG, jadi 192.
  • Baris 8, 10, dan 25 mendefinisikan fungsi yang digunakan.

Di antara baris 3 dan 19 teks asli telah diubah tetapi Anda dapat mengedit untuk menangani matriks 16x16. Karena itu, saya telah menyediakan LED_Ardino16.ino dalam perangkat lunak dan LED_Utility.xlsm akan mengakomodasinya.

Sering saya akan menyarankan Anda membuka 'LED_Arduino.ino' dan kemudian "Save As" dengan beberapa nama. Itu akan memastikan bahwa 'LED_Arduino.ino' tidak berubah jika Anda belum mengatur properti yang sesuai ke 'Read-Only'. [Saya menemukan bahwa file saya yang baru dibuat masih memiliki set properti Read-Only; lepaskan itu untuk memastikan pengeditan dan penyimpanan di masa mendatang].

Pada saat yang sama sketsa yang baru dibuat mungkin perlu memiliki salah satu atau keduanya port dan board didefinisikan ulang; pesan kesalahan akan muncul tetapi mungkin tidak segera terhapus.

Proyek 1

Muat LED_Arduino.ino ke dalam Arduino IDE dan simpan sebagai Red_Square (ino akan ditambahkan secara otomatis).

Awalnya saya mengusulkan untuk membangun kotak merah 3x3 dan letakkan kode itu di Baris 40 sketsa. SelN8, O8, P8, N11, P11, N14, O14 dan P14 akan memiliki nilai 255.

Saat teks merah LED_Utility,

mapLEDXY(2,2,255,0,0);mapLEDXY(2,3,255,0,0);mapLEDXY(2,4,255,0,0);mapLEDXY(3,2,255,0,0); mapLEDXY(3,4,255,0,0);mapLEDXY(4,2,255,0,0);mapLEDXY(4,3,255,0,0);mapLEDXY(4,4,255,0,0); 

disalin ke Baris 40, teks di bawahnya secara alami akan dipindahkan ke bawah.

Saat Anda mengunggah sketsa ke Arduino, matriks Anda akan mengaktifkan dan menonaktifkan kotak tersebut.

Sebelum melanjutkan, pertimbangkan:

  • Mengosongkan kedua kisi.
  • Ubah beberapa warna di dalam kotak itu.
  • Tambahkan kotak berwarna berbeda di sekeliling aslinya.

Proyek2

Saya sarankan Anda membuka sketsa Red_Square.ino dan menyimpannya sebagai Color_Sq ('.ino' akan ditambahkan secara otomatis) untuk mencegah penimpaan Red_Square.ino.

Dengan Colour_Sq.ino dimuat ke dalam IDE, buka Red_Square di Utilitas dan ubah kotak tengah. MakeO8, O10, O14 dan O16 '255'. N11 dan P11 adalah '0' tetapi N12 dan P12 adalah '255'. Tekan "Tampilkan".

Setelah Anda menambahkan kode baru di, saya akan mengantisipasi baris 47 di IDE, Anda harus mengikutinya dengan blok kode ini:

RGB_update(-1, 0, 0, 0);delay(1000);clearLEDs();RGB_update(-1, 0, 0, 0); delay(1000); 

Perhatikan bahwa Anda dapat mengubah nilai penundaan sesuai keinginan Anda; 1000 sama dengan 1 detik.

Proyek3

Muat ulang Red_Square.ino dan simpan sebagai Grow.

Buat kembali kotak Merah di Utilitas. Di sekitar bujur sangkar itu tambahkan nilai pilihan Anda untuk membuat batas, nilainya bisa dari 0 hingga 255 tetapi lebih rendah dari 32 mungkin sangat redup. Ini adalah kreasi saya di 'LED_Utility.xlsm':

Sekarang hapus nilai untuk kotak merah bagian dalam dan tekan "Show". Salin kode yang dihasilkan ke Baris 47 di IDE dan salin/tempel baris 42 hingga 46 setelah itu. Unggah ke Arduino untuk pergantian kotak merah bagian dalam dan kemudian yang dikelilingi oleh berbagai warna.

Coba perluas ke perbatasan lain jika Anda mau.

Proyek4

Anda mungkin telah menyadari bahwa saat kami menambahkan kode ke dalam “Loop”, ada kecenderungan untuk menjadi panjang dan mungkin menimbulkan kesulitan untuk mengedit nanti.

Di sini saya sedang membangun Spiral.

Gambar dari Workbook "spir5.xlsm". Ini adalah puncak dari 4 Buku Kerja sebelumnya.

"spir1.xlsm" adalah pusat dengan blok terang (255), "spir2.xlsm" menggunakan nilai kotak 4x4 bagian dalam, dengan "spir3.xlsm" menjadi blok kotak 27, dll. Pada setiap tahap saya menyalin kode ke sketsa saya tetapi tidak untuk "berputar".

Sebagai gantinya saya membuat 5 fungsi batal di bawah "loop" dan mereferensikannya di dalam "loop":

Void loop(){Sp1();Sp2();Sp3();Sp4();Sp5();clearLEDs();delay(1000);} 

Fungsi pertama saya, void Sp1(), adalah:

 void Sp1(){mapLEDXY(3,3,255,0,0);mapLEDXY(3,4,255,0,0);mapLEDXY(4,3,255,0,0);mapLEDXY(4,4,255, 0,0);RGB_update(-1, 0, 0, 0);delay(100);clearLEDs();RGB_update(-1, 0, 0, 0);delay(10);} 

Setiap fungsi yang berurutan akan sama kecuali untuk dua baris “mapLEDXY…”.

Mungkin tampak sepele dari contoh ini untuk menyarankan membuka "spir4.xlsm" untuk mengedit warna ujung luar untuk mengedit fungsi khusus daripada mengedit dalam "loop".

Berbatasan dengan yang konyol, misalkan Anda ingin menampilkan huruf-huruf dari kata “MISSISSIPPI” berturut-turut satu per satu. Ada 11 karakter sehingga berarti 77 baris kode untuk 'void loop()' untuk ditangani. Jika Anda memutuskan untuk mengubah "S", maka Anda harus melakukan 4 pengeditan. Hanya ada 4 karakter yang digunakan dalam kata tersebut. Oleh karena itu masuk akal untuk membuat fungsi untuk masing-masing dari mereka dan memanggilnya dengan tepat dari "loop".

Proyek5

Proyek ini memperhitungkan fungsi lain dari LED_Utility, "Var Map". Di sini variabel akan diperkenalkan dan oleh karena itu beberapa pengetahuan pemrograman dasar akan diperlukan.

Sintaks “For Loop” akan digunakan serta kondisi “If”.

The "for" akan digunakan untuk menambah atau mengurangi nilai RGB seperti:

for (int r=0; r<=256; r++) {} orfor (int r=255; r>=0; r--) {}  

“Jika” akan mengubah proses jika diperlukan.

Mari kita mulai dengan sederhana, dan maksud saya sederhana.

Buat kotak merah 2x2 di tengah LED_utility dan “Show”, dan ini kodenya:

mapLEDXY(3,3,255,0,0);mapLEDXY(3,4,255,0,0);mapLEDXY(4,3,255,0,0);mapLEDXY(4,4,255,0,0);  

Sekarang ubah semua 255 nilai menjadi 'r'. Tekan “Tampilkan”…. Ooow! Itu tidak seperti itu. Tidak apa-apa, itu adalah perlindungan yang telah saya tambahkan. Tekan “Var Map” dan periksa kode yang dihasilkan:

mapLEDXY(3,3,r,0,0);mapLEDXY(3,4,r,0,0);mapLEDXY(4,3,r,0,0);mapLEDXY(4,4 ,r,0,0); 

255 telah diganti dengan 'r'.

Di IDE buka arsip LED_Arduino.ino dan simpan sebagai “perubahan”.

Pada baris 40 masukkan:

for (int r=0; r<256;r++){}/// diikuti oleh:for (int r=255;r>=0;r--){}  

Perhatikan bahwa ada baris kosong setelah setiap pernyataan 'untuk'.

Pada baris 41 paste kode Excel Anda:

mapLEDXY(3,3,r,0,0);mapLEDXY(3,4,r,0,0);mapLEDXY(4,3,r,0,0);mapLEDXY(4,4 ,r,0,0);ikuti itu dengan:RGB_update(-1, 0, 0, 0);delay(50); 

Sekarang salin/tempelkan blok kode 4 baris yang sama ke blok "untuk" kedua.

Setelah itu blok “for”, di bawah “}” tambahkan ‘delay(200);’. Saya merasa perlu bagi mata saya untuk mengetahui bahwa blok kedua telah ditutup!

Saat diunggah, blok merah meningkat menjadi kecerahan penuh dan kemudian berkurang, mati dan kemudian berulang.

Proyek6

Sekarang mari kita manfaatkan kondisi “Jika”.

Buat kembali kotak merah sebelumnya di LED_utility tetapi kelilingi dengan blok 'biru langit' menggunakan 255 untuk nilai G dan B. Gunakan "Tampilkan".

Biarkan Merah 255 saja tetapi ubah semua G 255 menjadi 'g' dan B 255 menjadi 'b',

lalu tekan “Var Map”.

Muat ulang “LED_Arduino.ino” ke dalam IDE dan Simpan Sebagai “FadeBorder”.

Sekarang kita akan memiliki beberapa masalah. Kami memiliki dua variabel, 'g' dan 'b', dan masing-masing harus diberi nilai. Mereka juga harus dideklarasikan dalam program. Saya bermaksud untuk menyatakan 'g' dalam pernyataan 'untuk', tetapi saya perlu menyatakan 'b' di awal sketsa. Dalam sketsa pada baris 5 adalah deklarasi BYTE RGB[192]. Di bawahnya masukkan ‘int b=0;’.

Sebagai titik penjelasan, seseorang tidak dapat menggunakan dua loop "untuk" seperti yang akan diperlukan nanti. Di sini setiap nilai 'b' harus sama dengan nilai 'g' yang dihasilkan oleh loop "untuk".

“Loop” saya terstruktur seperti di bawah ini tetapi tanpa kode Peta saya:

void loop() {delay(50);for (int g=0; g<256;g++){b=g;[Tambahkan Kode Peta di sini]RGB_update(-1, 0, 0, 0 );delay(50);}untuk (int g=255;g>=0;g--){b=g; [Tambahkan Kode Peta di sini]RGB_update(-1, 0, 0, 0);delay(50);}} 

Perhatikan bahwa nilai B terkait dengan nilai G dengan pernyataan 'b=g;'. Nilai R tetap statis pada 255 sementara batas memudar naik dan turun dalam kecerahan.

Proyek7

Sekarang saatnya menggunakan pernyataan “jika”.

Buat dan 'Tampilkan' yang berikut menggunakan 255 di mana variabel muncul di kotak kanan. Perhatikan bahwa 'L' sangat kecil muncul di sel yang berdekatan dengan sel darah merah. Itu akan memungkinkan program untuk mengendalikan sel-sel itu jika perlu.

Kali ini LED akan memudar sebagai hijau dan merah hingga nilai 64 tercapai dan kemudian sel batas tengah tersebut akan berubah menjadi kuning dengan kecerahan papan yang terus meningkat. Kemudian prosesnya akan dibalik.

Sekali lagi saya akan menawarkan struktur dasar 'loop' saya. Saya menamakan sketsa ini 'FadeColourChange.ino'.

void loop() { delay(50);for (int r=0; r<256;r++){g=r;if(g>64){ g=65; l=r;}[Kode AddMap di sini]RGB_update(-1, 0, 0, 0); delay(50);}untuk (int r=255;r>=0;r--){if(r<65){g=r; l=0;}[Tambahkan Kode Peta di sini]RGB_update(-1, 0, 0, 0);delay(50);}} 

Proyek8

Untuk proyek terakhir ini saya tidak akan mengubah warna tetapi memperkenalkan gerakan; Saya memiliki panah yang bergerak melintasi papan tetapi akan muncul kembali dari kiri.

Di sini saya hanya ingin membuat kode menggunakan “Show”.

Karena saya ingin panah berpindah dari posisinya saat ini ke setiap posisi berikutnya, saya perlu mengubah nilai 'x'.

Ini adalah kode yang dibuat di G29:G33:

mapLEDXY(0,3,0,255,255);mapLEDXY(1,1,255,128,128);mapLEDXY(1,3,0,255,255);mapLEDXY(1,5,255,128,128);mapLEDXY(2,2,255,128,128);mapLEDXY(2,3 ,0,255,255);mapLEDXY(2,4,255,128,128);mapLEDXY(3,3,255,128,128); 

Karena '1' adalah nilai terkecil saya untuk koordinat X, saya menyebutnya sebagai 'x' dan mengurangi semua nilai lainnya dengan 1.

mapLEDXY(x+0,3,0,255,255);mapLEDXY(x+1,255,128,128);mapLEDXY(x+1,3,0,255,255);mapLEDXY(x+1,5,255,128,128);mapLEDXY(x+2, 2.255.128.128);mapLEDXY(x+2,3,0,255,255);mapLEDXY(x+2,4,255,128,128);mapLEDXY(x+3,3,255,128,128); 

‘for (int x…loop’ saya bekerja dengan baik, kecuali bahwa panah meluap ke baris bawah untuk beberapa lintasan loop!

Solusi! Jika suatu nilai melampaui '8', saya memerlukan nilai modulusnya. Itu memaksa saya untuk membuat tombol "Bungkus Peta". Kode untuk satu LED sekarang muncul seperti:

mapLEDXY((x +1) % 8, (y +1) %8, 255, 128, 128);

Untuk mengatasi tata letak XY, ​​saya merasa yang terbaik adalah membuat dua loop 'untuk' meskipun satu tidak akan digunakan (ya, saya menemukan alternatif yang canggung).

untuk(int x=0;x<8;x++){untuk(int y=0;y<8;y++){[kode peta]}} 

Jika saya membuat 'y<1' di loop kedua, 'y' diabaikan. Sebaliknya, mengubah 'y' menjadi 8 dan 'x' menjadi 0 memiliki efek yang berbeda.

Sebagai pemikiran terakhir, "Bungkus Peta" akan menerima variabel RGB. Lihat di atas di mana saya telah dirujuk. Seseorang dengan pemrograman dasar harus dapat menghadapinya. Saya telah menambahkan sketsa INO, ArrowVar.ino, di mana bagian depan panah berubah kecerahan sebagai demo kecil.

Penggunaan matriks 16x16.

Semua yang disebutkan di atas berlaku untuk matriks WS2812 16x16. Namun sketsa 'LED_Arduino16.ino' harus digunakan.

Sketsa yang disediakan dirancang untuk Matriks 8x8 kecuali satu, 'Spiral16.ino'. Ini memberikan tampilan yang lebih besar daripada 'Spiral.ino'.

Spiral ini, matriks 16x16, memiliki 2 lembar kertas printer sebagai penyebar cahaya. Tampilan dijeda selama sekitar 10 detik untuk mengambil gambar yang wajar.

Untuk mengembangkan kode Anda, buka LED_Utility.xlsm dan pilih tab “Sixteen” di bagian bawah halaman.

Jika, seperti saya, tampilan Anda terlalu besar dan Anda perlu menggulir, gunakan opsi perkecil. Meskipun demikian, beberapa pengguliran akan diperlukan untuk menyalin kode Anda.

Ekstensi?

Apakah mungkin untuk menangani Matriks dengan ukuran lain?

Saya bertanya-tanya mengapa 'LED_Arduino.ino' dan 'LED_Arduino16.ino' saya sangat berbeda di baris pembukanya. Saya memiliki baris-baris tertentu yang dikomentari di bagian pertama saya; kedua sketsa berfungsi seperti yang saya inginkan.

Saya tidak akan menulis Lembar Kerja untuk '8x32' meskipun saya baru saja memperoleh papan. Saya akan mengarahkan Anda ke “Sketsa " di atas. Ada parameter yang perlu diperhatikan. Khusus untuk baris 15 dan 18 juga.

NB:Saya juga mempertimbangkan opsi yang lebih kecil daripada papan tipe UNO.

Kode

  • LED_Arduino
LED_ArduinoC/C++
Sketsa ini membentuk fondasi proyek. Saat menyimpannya harus disetel ke Hanya-Baca dan penggunaan lebih lanjut menjadi sebagai 'Simpan Sebagai' untuk pengarsipan untuk mencegah penimpaan dan memungkinkan pengeditan ulang dengan mudah.
//VARIABEL DAN DEFINISI DI SINI - DIBUTUHKAN OLEH KODE DRIVER WS2812#define WS2812_pin 8 // hanya pin 8 digital yang berfungsi saat ini#tentukan jumlahLED 64// jumlah total LED RGB [256]byte RGB[192];//ambil jumlah LED Anda dan kalikan dengan 3 [768]// FUNCTIONS HEREvoid RGB_update(int LED, byte RED, byte GREEN, byte BLUE);//berfungsi untuk menggerakkan LEDsvoid mapLEDXY(int x, int y, byte RED, byte GREEN, byte BLUE) { int RGBlocation =0; //if (y % 2 ==0) { //kolom genap [Uncomment] RGBlocation =x + y * 8; //[16] // } else { //kolom ganjil [Batalkan komentar] //lokasi RGB =7 - x + y * 8; //[15] dan [16] // } [Batalkan Komentar] RGB[RGBlocation * 3] =BIRU; RGB[RGBlokasi * 3 + 1] =MERAH; RGB[RGBlocation * 3 + 2] =HIJAU;}void clearLEDs() { memset(RGB, 0, sizeof(RGB));}void setup() { pinMode(WS2812_pin, OUTPUT); clearLED(); RGB_update(-1, 0, 0, 0);}//setup0void loop() {//Tempel mapLEDXY line(s) langsung di atas RGB_update di bawah.RGB_update(-1, 0, 0, 0); penundaan (1000); clearLED(); RGB_update(-1, 0, 0, 0); delay(1000);}//loop//WS2812 Driver Functionvoid RGB_update(int LED, byte RED, byte GREEN, byte BLUE) { // LED adalah nomor LED yang dimulai dengan 0 // RED, GREEN, BLUE adalah kecerahan 0 ..255 setpoint untuk byte LED ExistingPort, WS2812pinHIGH;//variabel lokal di sini untuk mempercepat pinWrites if (LED>=0) { //petakan Nilai REG GREEN BLUE ke dalam array RGB[] RGB[LED * 3] =HIJAU; RGB[LED * 3 + 1] =MERAH; RGB[LED * 3 + 2] =BIRU; } noInterrupts();//matikan interupsi saat kami mengirim aliran bit keluar... ExistingPort =PORTB; // simpan status seluruh PORT B ​​- mari kita menulis ke seluruh port tanpa mengacaukan pin lain pada port tersebut WS2812pinHIGH =PORTB | 1; //ini memberi kita satu byte yang dapat kita gunakan untuk menyetel seluruh PORTB dengan pin WS2812 HIGH int bitStream =numberOfLEDs * 3;//total byte dalam string LED //Loop for ini berjalan melalui semua bit (8 pada a waktu) untuk mengatur waktu ON/OFF pin WS2812 untuk (int i =bitStream - 1; i>=0; i--) { PORTB =WS2812pinHIGH;//bit 7 terlebih dahulu, setel pin HIGH - selalu menjadi tinggi terlepas dari dari 0/1 //inilah bagian yang sulit, periksa apakah bit dalam byte tinggi/rendah lalu kan status itu ke pin // (RGB[i] &B10000000) akan menghapus bit lain di RGB[i ], jadi di sini kita akan dibiarkan dengan B10000000 atau B00000000 // maka mudah untuk memeriksa apakah bit tinggi atau rendah dengan DAN dengan bit mask ""&&B10000000)"" ini memberikan 1 atau 0 // jika 1, kami akan OR itu dengan port yang ada, sehingga menjaga pin HIGH, jika 0 pin ditulis LOW PORTB =((RGB[i] &B10000000) &&B10000000) | Pelabuhan yang ada; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");//ini adalah NOPS - ini mari kita tunda jam siklus untuk pengaturan waktu yang lebih tepat PORTB =ExistingPort;//oke, di sini kita tahu bahwa kita harus LOW terlepas dari status 0/1 bit __asm__("nop\n\t""nop\n\t""nop\n\ t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");//waktu RENDAH minimum untuk pin terlepas dari status 0/1 bit // lalu lakukan itu lagi untuk bit berikutnya dan seterusnya... lihat bit terakhir meskipun untuk sedikit perubahan PORTB =WS2812pinHIGH;//bit 6 PORTB =((RGB[i] &B01000000) &&B01000000) | Pelabuhan yang ada; __asm__("tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t"); PORTB =Pelabuhan yang Ada; __asm__("tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t "); PORTB =WS2812pinHIGH;//bit 5 PORTB =((RGB[i] &B00100000) &&B00100000) | Pelabuhan yang ada; __asm__("tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t"); PORTB =Pelabuhan yang Ada; __asm__("tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t "); PORTB =WS2812pinHIGH;//bit 4 PORTB =((RGB[i] &B00010000) &&B00010000) | Pelabuhan yang ada; __asm__("tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t"); PORTB =Pelabuhan yang Ada; __asm__("tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t "); PORTB =WS2812pinHIGH;//bit 3 PORTB =((RGB[i] &B00001000) &&B00001000) | Pelabuhan yang ada; __asm__("tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t"); PORTB =Pelabuhan yang Ada; __asm__("tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t "); PORTB =WS2812pinHIGH;//bit 2 PORTB =((RGB[i] &B000000100) &&B000000100) | Pelabuhan yang ada; __asm__("tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t"); PORTB =Pelabuhan yang Ada; __asm__("tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t "); PORTB =WS2812pinHIGH;//bit 1 PORTB =((RGB[i] &B00000010) &&B00000010) | Pelabuhan yang ada; __asm__("tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t"); PORTB =Pelabuhan yang Ada; __asm__("tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t "); PORTB =WS2812pinHIGH;//bit 0 __asm__("nop\n\t");//pada bit terakhir ini, pemeriksaannya jauh lebih cepat, jadi harus menambahkan NOP di sini PORTB =((RGB[i] &B00000001) &&B00000001) | Pelabuhan yang ada; __asm__("tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t""tidak\n\t"); PORTB =ExistingPort;// perhatikan tidak ada NOP setelah menulis pin LOW, hal ini karena FOR Loop menggunakan siklus clock yang dapat kita gunakan sebagai pengganti NOPS }//for loop interrupt();//mengaktifkan interupsi // semua selesai!}//void RGB_update
Led_Utility.xlsm
Aplikasi ini menghasilkan berbagai teks untuk menyalin/menempel ke dalam sketsa.https://github.com/CobraCat/LED_Utility
Sketsa.zip
Ini adalah beberapa atau lebih sketsa yang digunakan selama pengembangan. Mereka tersedia sebagai 'dukungan'.https://github.com/CobraCat/LED_Utility

Proses manufaktur

  1. Panel LCD dengan Arduino untuk Simulator Penerbangan
  2. Beralih/Panel LED dengan Arduino untuk FS2020
  3. Excel untuk WS2812 RGB LED Array Animations
  4. Tiga langkah untuk keamanan IoT global
  5. Tiga Tren Manufaktur Digital untuk 2020
  6. Tiga Tips untuk Ekspansi UKM ke Luar Negeri
  7. Tiga Pelajaran untuk Pengecer di Tahun Gangguan
  8. Buat Liburan! Robot - Proyek Pemula Mudah untuk Anak
  9. Tiga Tips untuk Perawatan Peralatan Industri
  10. Tiga Tips Membeli Alat Berat Industri