paparan LED matriks dot (atau dikenali sebagai paparan matriks titik atau DMD) adalah paparan dengan grid lampu LED yang boleh anda hidupkan dan dimatikan untuk memaparkan teks dan bentuk. Sesetengah daripada mereka mempunyai pelbagai warna, sementara yang lain hanya satu warna. Yang akan kita gunakan dalam demo ini hanya mempunyai satu warna, jadi kita terhad kepada imej hitam dan putih. Adalah penting untuk diperhatikan - paparan LED agak berbeza dengan paparan LCD. LCD menggunakan kristal cahaya mewah dan digunakan untuk memaparkan pada VCR, jam, kalkulator dan sebagainya. Saya menulis artikel beberapa minggu yang lalu untuk memaparkan API Web di LCD Arduino menggunakan Node.js. Lihatlah bahawa jika anda ingin membandingkan kedua -dua.
Demo khusus ini memerlukan paparan matriks Freetronics 32 × 16 dot, kerana ia bergantung pada Perpustakaan DMD Freetronics.
kod demo
Perpustakaan DMD Freetronics
Kebanyakan fungsi untuk memaparkan unsur -unsur pada DMD kami akan berlaku dalam kod lakaran Arduino kami. Kod lakaran akan mengawasi mesej di atas port siri dan menukar paparan yang ditunjukkan berdasarkan mesej tersebut.
lakaran bermula dengan termasuk dan pemalar kami. Kami termasuk softwareserial.h untuk membolehkan kami mengakses port siri dan menentukan lebar dan ketinggian DMD kami (32 × 16 dalam kes kami). Buflength menyimpan bilangan lampu yang kami ada, kerana ini adalah saiz maksimum mesej yang kami mahu hantar Arduino kami. Dalam kes kita, ia adalah 32 didarab dengan 16 iaitu 512.
<span><span>#include <SoftwareSerial.h></span> </span> <span><span>#define SCREEN_WIDTH <span>32</span></span> </span> <span><span>#define SCREEN_HEIGHT <span>16</span></span> </span> <span><span>#define BUFLENGTH <span>512</span></span></span>
Seterusnya, kami mempunyai kami termasuk khusus untuk Freetronics DMD. Ini semua boleh didapati dari fail yang kami disalin ke folder Perpustakaan Arduino kami lebih awal.
<span><span>#include <SPI.h></span> </span> <span><span>#include <DMD.h></span> </span> <span><span>#include <TimerOne.h></span></span>
Kemudian, kita mempunyai dua pemalar plex_across dan pleames_down yang digunakan untuk menentukan berapa banyak memaparkan LED yang telah kita sertai bersama. Saya akan menganggap anda berada dalam keadaan yang sama seperti saya dan hanya mempunyai satu paparan, oleh itu kedua -duanya adalah sama dengan satu. Kami kemudian lulus ke perpustakaan DMD kami, membuatnya berjalan menggunakan DMD DMD ().
<span><span>#define DISPLAYS_ACROSS <span>1</span></span> </span> <span><span>#define DISPLAYS_DOWN <span>1</span></span> </span> DMD <span>dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);</span>
Kod bit seterusnya dimasukkan ke dalam sampel DMD. Ini adalah fungsi yang kami panggil untuk mendapatkan perpustakaan DMD untuk menyegarkan paparan pada selang set. Kami mentakrifkan selang itu sedikit lebih jauh.
<span>void ScanDMD() { </span> dmd<span>.scanDisplayBySPI(); </span> <span>}</span>
Kami kemudian menentukan dua pembolehubah terakhir kami. Kedua -dua ini berkaitan dengan menerima mesej melalui port siri. Pertama, Buf [Buflength] menyimpan penampan mesej port siri di mana LED harus dihidupkan dan dimatikan. Kedua, Bufcount akan digunakan untuk menyimpan berapa banyak bait dalam penampan ini yang tersisa untuk dibaca.
<span>char buf[BUFLENGTH]; </span> <span>int bufCount;</span>
Fungsi persediaan kami () memulakan keseluruhan proses menggunakan pemalar kami dan perpustakaan yang ditakrifkan. Ia bermula dengan mendengar di port 57600 untuk mesej port siri.
<span>void setup() { </span> Serial<span>.begin(57600);</span>
Kemudian, kami memulakan pemasa menggunakan perpustakaan timerone yang kami sertakan sebelumnya. Kami menceritakannya kepada Countdown dari empat milisaat. Dalam contoh Freetronics, mereka mengesyorkan tidak menetapkan ini kepada lebih daripada lima milisaat untuk mengelakkan kelipan pada paparan kami.
Timer1<span>.initialize(4000);</span>
Kami kemudian menetapkannya untuk menjalankan fungsi scandmd () apabila pemasa kami tamat, yang seterusnya menyegarkan paparan.
Timer1<span>.attachInterrupt(ScanDMD);</span>
Akhirnya, dalam fungsi persediaan kami (), kami membersihkan semua piksel pada paparan dengan lulus dalam fungsi DMD.ClearsCreen (). Sekiranya anda lulus dalam fungsi ini, setiap piksel akan dihidupkan!
<span><span>#include <SoftwareSerial.h></span> </span> <span><span>#define SCREEN_WIDTH <span>32</span></span> </span> <span><span>#define SCREEN_HEIGHT <span>16</span></span> </span> <span><span>#define BUFLENGTH <span>512</span></span></span>
Dalam fungsi gelung Arduino () kami, kami mengawasi sebarang mesej di pelabuhan bersiri. Kami menonton untuk melihat berapa banyak bait yang tersedia untuk membaca dari port siri. Sekiranya terdapat bait yang tersedia, maka kami mempunyai mesej yang mengalir melalui dan kami menjalankan fungsi SerialParse ().
<span><span>#include <SPI.h></span> </span> <span><span>#include <DMD.h></span> </span> <span><span>#include <TimerOne.h></span></span>
Di dalam SerialParse (), kami menetapkan bufcount ke -1 untuk menetapkan semula nilai kiraan. Kemudian, kita membaca dalam 512 elemen dari array itu (buflength kami) menggunakan serial.readBytesuntil (). Sekiranya terdapat watak N, ia juga akan berhenti membaca array. Matlamat utama di sini adalah untuk mengekalkan mesej bersiri dalam panjang grid cahaya LED kami.
<span><span>#define DISPLAYS_ACROSS <span>1</span></span> </span> <span><span>#define DISPLAYS_DOWN <span>1</span></span> </span> DMD <span>dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);</span>
Jika kita mempunyai mesej dalam penampan kami, maka kami menghantarnya melalui ParseBuffer () yang akan menghuraikan dan memaparkannya ke skrin kami.
<span>void ScanDMD() { </span> dmd<span>.scanDisplayBySPI(); </span> <span>}</span>
Dalam fungsi parsebuffer (), kita mulakan dengan membersihkan skrin siap untuk kita menyala dengan lukisan baru. Kemudian kita membuat integer saya untuk menjejaki kedudukan mana dalam array yang kita baca.
Kami kemudian melangkah melalui setiap watak dalam penampan kami, dari kiri ke kanan melalui x gelung menyeberang sehingga screen_width, dan atas ke bawah melalui y gelung ke bawah hingga screen_height. Ini membacakan pelbagai dimensi kami ke dalam paparan dua dimensi DMD kami. Untuk setiap watak, kami periksa untuk melihat sama ada ia adalah '1'. Jika ya, maka kita masuk ke dalam yang memimpin pada paparan di x dan y. Itu akan digunakan untuk bahagian -bahagian imej kita yang hitam. Jika ia bukan '1', maka kita terus ke kedudukan seterusnya dan sebagainya. Akhirnya, melukis seluruh imej kami.
<span>char buf[BUFLENGTH]; </span> <span>int bufCount;</span>
yang merangkumi bagaimana Arduino kami berfungsi - jika kami menjalankan kod itu pada Arduino kami sekarang dengan LED kami dilampirkan, ia tidak memaparkan apa -apa. Untuk mempunyai apa -apa paparan pada paparan Matrix Dot kami, kami memerlukan kod nod kami untuk menghantar mesej ke atas port bersiri.
JavaScript kami bermula dengan memerlukan dua modul NPM penting. Serialport adalah apa yang membolehkan kami menghantar mesej melalui port siri ke Arduino dan PNG-JS kami adalah apa yang akan dibaca dalam imej PNG kami.
<span>void setup() { </span> Serial<span>.begin(57600);</span>
Kami kemudian menyediakan pemesejan port siri kami. Kami menyediakan objek Serialport di dalam Serialport yang berubah -ubah, dengan tetapan yang mana port kami Arduino disambungkan dan kadar baud yang akan kami dengar untuk mesej port bersiri.
Timer1<span>.initialize(4000);</span>
Jika anda tidak pasti port mana arduino anda disambungkan ke (mis. Saya mempunyai '/dev/tty.usbmodem1431'), sambungkannya ke PC anda, buka IDE Arduino, pergi ke Tools> Port dan lihat yang mana dipilih.
Kami kemudian memulakan pembolehubah rentetan yang dipanggil SerialMessage yang akan menyimpan rentetan penuh dan sifar yang akan kami hantar melalui port bersiri kami.
<span><span>#include <SoftwareSerial.h></span> </span> <span><span>#define SCREEN_WIDTH <span>32</span></span> </span> <span><span>#define SCREEN_HEIGHT <span>16</span></span> </span> <span><span>#define BUFLENGTH <span>512</span></span></span>
Objek Serialport kami mempunyai pendengar acara 'terbuka' yang ia balas apabila pelabuhan bersiri ditakrifkan terbuka dan bersedia untuk mengakses dari JavaScript kami. Apabila ini berlaku, kami menjalankan Console.log supaya kami dapat memastikan semuanya baik dengan pemesejan port siri kami.
<span><span>#include <SPI.h></span> </span> <span><span>#include <DMD.h></span> </span> <span><span>#include <TimerOne.h></span></span>
Sebaik sahaja kita tahu port siri kami sudah siap untuk mesej, kami menjalankan fungsi png.decode () untuk dibaca dalam fail imej PNG kami. Dalam demo kami, kami mendapat imej PNG di dalam folder yang sama seperti fail nod kami yang dipanggil SitePointLogo-WithSmile.png, jadi kami lulus dalam nama fail itu. Kemudian kami mempunyai fungsi panggil balik kami yang memberikan kami data fail PNG melalui pembolehubah data.
<span><span>#define DISPLAYS_ACROSS <span>1</span></span> </span> <span><span>#define DISPLAYS_DOWN <span>1</span></span> </span> DMD <span>dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);</span>
Data yang dikembalikan dari fungsi png.decode () kami akan menjadi pelbagai nilai dari 0 hingga 255. nilai. Kami tidak akan menggunakan nilai alfa dalam demo kami kerana kami berurusan hanya dengan imej hitam dan putih tetapi anda secara teorinya boleh jika anda mahu. Arahan sampel kelihatan seperti:
<span>void ScanDMD() { </span> dmd<span>.scanDisplayBySPI(); </span> <span>}</span>
Arahan di atas mewakili satu piksel putih dengan 255,255,255,255 dan satu piksel hitam dengan 0,0,0,255. Ini berterusan berulang kali untuk setiap piksel sehingga kami mewakili keseluruhan imej.
Dalam fungsi panggil balik kami, kami menetapkan semula SerialMessage untuk menjadi rentetan kosong dan kemudian mula meleleh melalui array data dalam set empat. Kami menetapkan pembolehubah tempatan merah, hijau dan biru untuk memadankan setiap nilai masing -masing piksel.
<span>char buf[BUFLENGTH]; </span> <span>int bufCount;</span>
Untuk dapat menangani nilai -nilai greyscale yang tidak sepenuhnya hitam atau putih, kami juga mendapat pemeriksaan luminance. Fungsi di bawah menentukan bagaimana gelap atau cahaya warna piksel ialah:
<span>void setup() { </span> Serial<span>.begin(57600);</span>
Jika nilai itu lebih besar daripada 150, maka kita mengandaikan ia adalah warna yang cantik dan menetapkannya ke 0 (putih). Jika tidak, kami menetapkannya kepada 1 dan menjadikannya hitam. Kami menambahkan nilai sama ada kepada rentetan serialmessage.
Timer1<span>.initialize(4000);</span>
Sebaik sahaja kami telah melalui setiap piksel dan memperuntukkan sama ada sifar atau yang mewakili, kami menghantar mesej itu ke atas port bersiri menggunakan SerialPort.write (). Keseluruhan proses membaca dalam imej dan meleleh melalui sebenarnya nampaknya lebih cepat daripada masa yang diperlukan untuk paparan bersedia untuk menerimanya, jadi saya telah memasukkannya ke dalam setTimeout untuk menunggu dua saat sebelum berlari .
Timer1<span>.attachInterrupt(ScanDMD);</span>
Jika anda memuat naik lakaran, sambungkan paparan ke arduino anda dan jalankan kod pelayan nod melalui node serialdmd.js (ingat ke NPM memasang semuanya terlebih dahulu), anda harus melihatnya menyala dengan fail png anda seperti:
Terdapat banyak cara anda boleh mengembangkannya. Ia adalah pelayan nod, jadi anda boleh menyambungkannya ke API dan memaparkan imej yang melaluinya. Anda boleh membuatnya memaparkan imej yang berbeza bergantung pada waktu siang, keadaan peranti yang disambungkan di internet di rumah anda, cuaca atau sebilangan besar perkara lain!
Jika anda mengembangkan idea ini menjadi sesuatu yang sangat kemas, beritahu saya dalam komen atau berhubung dengan saya di Twitter (@thatpatrickguy), saya mahu melihat!
node.js memainkan peranan penting dalam memaparkan imej pada paparan LED matriks dot. Ia adalah runtime JavaScript yang dibina di atas enjin V8 JavaScript Chrome, yang digunakan untuk membangunkan aplikasi pelayan dan rangkaian. Dalam konteks paparan LED matriks dot, node.js digunakan untuk mengawal paparan dan memanipulasi imej yang akan ditunjukkan. Ia membolehkan penciptaan pelayan yang boleh menghantar data ke paparan LED, membolehkan paparan imej, teks, atau mana -mana jenis data lain.
Atas ialah kandungan terperinci Memaparkan imej pada paparan LED matriks titik dengan node.js. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!