Isi kandungan:

Cahaya Sorakan Muzik Krismas: 4 Langkah
Cahaya Sorakan Muzik Krismas: 4 Langkah

Video: Cahaya Sorakan Muzik Krismas: 4 Langkah

Video: Cahaya Sorakan Muzik Krismas: 4 Langkah
Video: Ding dong ding Lonceng Berbunyi/ Jinglle Bells gerak dan lagu Natal 2024, November
Anonim
Cahaya Sorakan Muzik Krismas
Cahaya Sorakan Muzik Krismas

Selamat Hari Natal! Adakah anda ingin mempunyai pokok Krismas yang dapat berinteraksi dengan anda?

Langkah 1: Perkara Yang Digunakan dalam Projek Ini

Komponen perkakasan

  • Seeeduino V4.2
  • Perisai Pangkalan V2
  • Grove - Sensor Gerakan PIR Boleh Laras
  • Grove - Sensor Loudness
  • Grove - WS2813 RGB LED Strip Waterproof - 60 LED / m - 1m

Aplikasi perisian dan perkhidmatan dalam talian

Arduino IDE

Langkah 2: Sambungan Perkakasan

Sambungan Perkakasan
Sambungan Perkakasan

Sambungkan PIR Sensor, Loudness Sensor dan strip LED ke port Base Shield D2, A0 dan D6 secara berasingan. Pasangkan Base Shield ke Seeduino, semuanya selesai.

Langkah 3: Pengaturcaraan Perisian

Perpustakaan yang mengikuti perlu dipasang sebelum pengaturcaraan, sila muat turun dan import ke Arduino IDE anda secara manual:

  • Led_Strip
  • MsTimer2
  • Arduino_Vector

Untuk menjadikan kodnya lebih ringkas, kami telah mengemasnya. Kelas CheerLight adalah kelas aplikasi projek ini.

aplikasi kelas:: CheerLight

: aplikasi awam:: antara muka:: IApplication {public: void setup (void); gelung kosong (kekosongan); batal setPIRSensorPin (pin uint8_t); batal setLoudnessSensorPin (pin uint8_t); pengukuran kekosongan Sensor (kekosongan); perubahan voidAnimation (void * args); void changeSpeed (void * args); void changeColor (void * args); aplikasi statik:: CheerLight * getInstance (tidak sah); dilindungi: driver:: LEDStrip _ledStrip; pemandu:: PIRSensor _pirSensor; pemandu:: LoudnessSensor _loudnessSensor; uint8_t _animasi; middleware:: Delegate _detectedDelegate; middleware:: Delegate _absoluteLoudnessDelegate; middleware:: Delegate _relativeLoudnessDelegate; CheerLight (tidak sah); aplikasi statik:: CheerLight _instance; };

Kelas CheerLight dirancang oleh Singleton Patterns, yang bermaksud hanya ada satu contoh untuknya, anda boleh memanggil CheerLight:: getInstance () ke instance tersebut. Sekiranya sambungan Sensor anda berbeza dengan Sambungan Perkakasan, anda boleh mengubahnya dengan memanggil kaedah setPIRSensorPin () dan setLoudnessSensorPin ().

Imej
Imej

Kami mengesyorkan memanggil kaedah mengukurSensors () pada pemasa untuk mengganggu agar sensor diukur tepat pada masanya, tetapi memanggil kaedah ChangeAnimation (), changeSpeed () atau changeColor () secara manual tidak diperlukan. Mereka akan dipanggil melalui Delegasi ketika sensor diukur.

Apa itu Delegasi?

Seperti yang kita semua ketahui, kita dapat menyatakan fungsi penunjuk dan membuatnya menunjuk ke fungsi dalam C:

kekosongan func1 (kekosongan);

void (* pFunc) (void) = func1;

dan menggunakannya untuk memanggil fungsi yang ditunjukkannya

pFunc ();

Tetapi terdapat perbezaan dalam C ++, jika anda cuba menyusun kod berikut:

kelas A {

awam: void func1 (void); }; void (* pFunc) (void) = & A:: func1;

penyusun akan melaporkan ralat penukaran jenis, berikut adalah contoh yang betul:

void (A:: * pFunc) (void) = & A:: func1;

Apabila kita mencuba menggunakannya untuk memanggil kaedah itu, ralat sekali lagi. Sebab untuk kesalahan itu adalah bahawa kaedah objek mesti dipanggil oleh objek. Oleh itu, kami membuat objek untuk memanggilnya:

A a;

a. * pFunc ();

Kali ini tiada masalah. Jadi ada kelas Delegate di Delegate.h.

templat

kelas middleware:: Delegate: public middleware:: interface:: IDelegate {public: Delegate (objek T *, void (kaedah T:: *) (void *)); invoid batal (void * args); dilindungi: T * _object; batal (kaedah T:: * _) (batal *); }; templat inline tengah:: Delegate:: Delegate (objek T *, void (kaedah T:: *) (void *)): _object (objek), _method (kaedah) {} templat inline void templat:: Delegate:: invoke (batal * args) {(kaedah _object -> * _) (args); }

Oleh kerana kelas Delegate adalah kelas templat, yang berarti Delegate adalah perbezaan dengan Delegate, bagaimana membuat mereka ditunjuk oleh pointer mempunyai jenis yang sama? Jawapannya adalah antara muka, jadi terdapat antara muka IDelegate di IDelegate.h.

middleware kelas:: antara muka:: IDelegate {

awam: virtual void invoke (void * args) = 0; };

Dalam kelas PIR Sensor dan Loudness Sensor, terdapat pemboleh ubah bernama _delegates yang digunakan untuk menyimpan pointer of Delegates, dan ada kaedah bernama invokeAllDelegates () yang digunakan untuk memanggil semua Delegate dalam _delegates, ia akan dipanggil dalam kaedah mengukur ().

CATATAN: Kaedah perwakilan, seperti perubahanAnimation (), changeSpeed () dan changeColor () akan dipanggil dalam pemasa 2 interrupt, jadi JANGAN gunakan penundaan () atau fungsi lain berdasarkan gangguan di dalamnya.

Disyorkan: