Mundarija:

Rojdestvo musiqasi quvnoq nur: 4 qadam
Rojdestvo musiqasi quvnoq nur: 4 qadam

Video: Rojdestvo musiqasi quvnoq nur: 4 qadam

Video: Rojdestvo musiqasi quvnoq nur: 4 qadam
Video: Gulinur - Jo'ji qoro (Official Music Video) 2024, Noyabr
Anonim
Rojdestvo musiqasi quvnoq nur
Rojdestvo musiqasi quvnoq nur

Rojdestvo muborak! Siz bilan muloqot qila oladigan Rojdestvo daraxti bo'lishini xohlaysizmi?

1 -qadam: Ushbu loyihada ishlatilgan narsalar

Uskuna komponentlari

  • Seeeduino V4.2
  • Asosiy qalqon V2
  • Grove - sozlanishi PIR harakat sensori
  • Grove - ovoz balandligi sensori
  • Grove - suv o'tkazmaydigan WS2813 RGB LED tasmasi - 60 LED/m - 1m

Dasturiy ta'minot va onlayn xizmatlar

Arduino IDE

2 -qadam: Uskuna ulanishi

Uskuna ulanishi
Uskuna ulanishi

PIR Sensor, Shovqin sensori va LED tasmasini Base Shield D2, A0 va D6 portiga alohida ulang. Baza qalqonini Seeduino -ga ulang, hammasi tayyor.

3 -qadam: dasturiy ta'minot

Quyidagi kutubxonalar dasturlashdan oldin o'rnatilishi kerak, ularni Arduino IDE -ga qo'lda yuklab oling va import qiling:

  • Led_Strip
  • MsTimer2
  • Arduino_Vector

Kodni aniqroq qilish uchun biz uni qadoqladik. CheerLight klassi - bu loyihaning amaliy sinfi.

sinf ilovasi:: CheerLight

: umumiy dastur:: interfeys:: IApplication {public: void setup (void); bo'sh halqa (bo'sh); bekor qilingan setPIRSensorPin (uint8_t pin); bekor qilingan setLoudnessSensorPin (uint8_t pin); bo'sh o'lchov Sensorlar (bo'sh); void changeAnimatsiya (void * args); void changeSpeed (void * args); void changeColor (void * args); statik dastur:: CheerLight * getInstance (bekor); himoyalangan: haydovchi:: LEDStrip _ledStrip; haydovchi:: PIRSensor _pirSensor; haydovchi:: LoudnessSensor _loudnessSensor; uint8_t _ jonlantirish; o'rta dastur:: Delegate _detectedDelegate; o'rta dastur:: Delegate _absoluteLoudnessDelegate; o'rta dastur:: Delegate _relatifLoudnessDelegate; CheerLight (bekor); statik dastur:: CheerLight _instance; };

CheerLight klassi Singleton Patterns tomonidan ishlab chiqilgan, ya'ni buning uchun faqat bitta misol bor, siz CheerLight:: getInstance () ga bu misolga qo'ng'iroq qilishingiz mumkin. Agar Sensor ulanishi "Hardware Connection" dan farq qiladigan bo'lsa, ularni setPIRSensorPin () va setLoudnessSensorPin () usullariga qo'ng'iroq qilib o'zgartirish mumkin.

Rasm
Rasm

Sensorlarni o'z vaqtida o'lchash uchun, taymer uzilishida o'lchov sensori () usulini chaqirishni tavsiya qilamiz, lekin changeAnimation (), changeSpeed () yoki changeColor () usullarini qo'lda chaqirish shart emas. Sensorlar o'lchaganida, ular Delegatlar orqali chaqiriladi.

Vakil nima?

Hammamiz bilganimizdek, biz funktsiya ko'rsatgichini e'lon qilib, uni C funktsiyasiga ishora qilishimiz mumkin:

void func1 (bekor);

void (*pFunc) (void) = func1;

va undan ko'rsatilgan funktsiyani chaqirish uchun foydalaning

pFunc ();

Ammo C ++ da farqlar mavjud, agar siz quyidagi kodni kompilyatsiya qilmoqchi bo'lsangiz:

A sinf {

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

kompilyator turdagi konvertatsiya xatosi haqida xabar beradi, bu erda to'g'ri misol:

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

Biz uni ushbu usulni chaqirish uchun ishlatmoqchi bo'lsak, yana xato. Bu xatoning sababi shundaki, ob'ekt-usul ob'ekt tomonidan chaqirilishi kerak. Shunday qilib, biz uni chaqirish uchun ob'ekt yaratamiz:

A a;

a.*pFunc ();

Bu safar muammo yo'q. Demak, Delegate.h da Delegat klassi bor.

shablon

sinf o'rta dasturlari:: Delegat: umumiy o'rta dastur:: interfeys:: IDelegate {public: Delegate (T *object, void (T:: *method) (void *)); void chaqirish (void * args); himoyalangan: T * _object; void (T:: *_ usuli) (bekor *); }; shablon ichidagi o'rta dasturlar:: Delegat:: Delegat (T *obyekti, void (T:: *usuli) (void *)): _object (ob'ekt), _method (usul) {} shablon ichki bo'shliq o'rta dastur:: Delegate:: invoke (void * args) {(_object-> * _ usuli) (args); }

Delegat klassi shablon klassi bo'lgani uchun, Delegatsiya Delegatsiyadan farq qiladi, shuning uchun ularni bir xil turdagi ko'rsatgich bilan ko'rsatishni qanday qilish kerak? Javob - bu interfeys, shuning uchun IDelegate.h da IDelegate interfeysi mavjud.

o'rta dasturiy ta'minot:: interfeys:: IDelegate {

ommaviy: virtual bo'shliqni chaqirish (void * args) = 0; };

PIR Sensor va Loudness Sensor sinfida Delegatlar ko'rsatgichini saqlash uchun ishlatiladigan _delegates nomli o'zgarmaydigan mavjud va barcha delegatlarni _delegatlarda chaqirish uchun invokeAllDelegates () deb nomlangan usul mavjud, u chora () usuli deb nomlanadi.

QAYD: changeAnimation (), changeSpeed () va changeColor () kabi vakolatli usullar timer2 uzilishida chaqiriladi, shuning uchun unda delay () yoki boshqa uzilishga asoslangan funktsiyani ishlatmang.

Tavsiya: