Daftar Isi:
2025 Pengarang: John Day | [email protected]. Terakhir diubah: 2025-01-13 06:57
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
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().
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.