Daftar Isi:

Musik Natal Cheer Light: 4 Langkah
Musik Natal Cheer Light: 4 Langkah

Video: Musik Natal Cheer Light: 4 Langkah

Video: Musik Natal Cheer Light: 4 Langkah
Video: Coldplay - Christmas Lights (Official Video) 2024, November
Anonim
Musik Natal Cheer Light
Musik Natal Cheer Light

Selamat Natal! Apakah Anda ingin memiliki pohon Natal yang dapat berinteraksi dengan Anda?

Langkah 1: Hal-hal yang Digunakan dalam Proyek Ini

Komponen perangkat keras

  • Seeeduino V4.2
  • Perisai Dasar V2
  • Grove - Sensor Gerak PIR yang Dapat Disesuaikan
  • Grove - Sensor Kenyaringan
  • Grove - WS2813 RGB LED Strip Tahan Air - 60 LED/m - 1m

Aplikasi perangkat lunak dan layanan online

Arduino IDE

Langkah 2: Koneksi Perangkat Keras

Koneksi Perangkat Keras
Koneksi Perangkat Keras

Hubungkan Sensor PIR, Sensor Kenyaringan, dan strip LED ke port D2, A0 dan D6 Base Shield secara terpisah. Pasang Base Shield ke Seeduino, semua selesai.

Langkah 3: Pemrograman Perangkat Lunak

Pustaka berikut perlu diinstal sebelum pemrograman, silakan unduh dan impor ke Arduino IDE Anda secara manual:

  • Led_Strip
  • MsTimer2
  • Arduino_Vektor

Untuk membuat kode lebih ringkas, kami telah mengemasnya. Kelas CheerLight adalah kelas aplikasi dari proyek ini.

aplikasi kelas::CheerLight

: aplikasi publik::interface::IApplication { public: void setup(void); lingkaran batal (batal); batalkan setPIRSensorPin(pin uint8_t); void setLoudnessSensorPin(pin uint8_t); void measureSensors(void); void changeAnimation(void * args); void changeSpeed(void * args); void changeColor(void * args); aplikasi statis::CheerLight * getInstance(void); dilindungi: driver::LEDStrip _ledStrip; driver::PIRSensor _pirSensor; driver::LoudnessSensor _loudnessSensor; uint8_t _animation; middleware::Delegasikan _detectedDelegate; middleware::Delegasikan _absoluteLoudnessDelegate; middleware::Delegasikan _relativeLoudnessDelegate; CheerLight(kosong); aplikasi statis::CheerLight _instance; };

Kelas CheerLight dirancang oleh Singleton Patterns, yang berarti hanya ada satu instance untuknya, Anda dapat memanggil CheerLight::getInstance() ke instance tersebut. Jika koneksi Sensor Anda berbeda dengan Koneksi Perangkat Keras, Anda dapat mengubahnya dengan memanggil metode setPIRSensorPin() dan setLoudnessSensorPin().

Gambar
Gambar

Kami merekomendasikan memanggil metode measureSensors() dalam interupsi timer untuk membuat sensor diukur tepat waktu, tetapi memanggil metode changeAnimation(), changeSpeed() atau changeColor() secara manual tidak diperlukan. Mereka akan dipanggil melalui Delegasi saat sensor diukur.

Apa itu Delegasi?

Seperti yang kita semua tahu, kita dapat mendeklarasikan pointer fungsi dan membuatnya menunjuk ke fungsi di C:

batal func1(kosong);

void (*pFunc)(void) = fungsi1;

dan gunakan untuk memanggil fungsi yang ditunjuknya

pFunc();

Tetapi ada perbedaan dalam C++, jika Anda mencoba mengkompilasi kode berikut:

kelas A {

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

kompiler akan melaporkan kesalahan konversi tipe, berikut adalah contoh yang tepat:

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

Ketika kami mencoba menggunakannya untuk memanggil metode itu, kesalahan lagi. Alasan kesalahan itu adalah bahwa metode objek harus dipanggil oleh objek. Jadi kami membuat objek untuk menyebutnya:

A A;

a.*pFunc();

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

templat

class middleware::Delegate: public middleware::interface::IDelegate { public: Delegate(T * objek, void (T::*method)(void *)); void memanggil(void * args); dilindungi: T * _objek; batal (T::*_metode)(batal *); }; template inline middleware::Delegate::Delegate(T * objek, void (T::*method)(void *)): _object(object), _method(method) { } template inline void middleware::Delegate::invoke(void * args) { (_object->*_method)(args); }

Karena kelas Delegate adalah kelas template, yang berarti Delegate berbeda dengan Delegate, bagaimana caranya agar mereka ditunjuk oleh pointer dengan tipe yang sama? Jawabannya adalah interface, jadi ada interface IDelegate di IDelegate.h.

kelas middleware::interface::IDelegate {

publik: virtual void memanggil(void * args) = 0; };

Di kelas PIR Sensor dan Loudness Sensor, ada variabel bernama _delegates yang digunakan untuk menyimpan pointer dari Delegate, dan ada sebuah method bernama inviteAllDelegates() yang digunakan untuk memanggil semua Delegates di _delegates, itu akan dipanggil di method measure().

CATATAN: Metode delegasi, seperti changeAnimation(), changeSpeed() dan changeColor() akan dipanggil dalam interupsi timer2, jadi JANGAN gunakan delay() atau fungsi berbasis interupsi lainnya di dalamnya.

Direkomendasikan: