Мазмұны:

Рождестволық музыка көңілді жарық: 4 қадам
Рождестволық музыка көңілді жарық: 4 қадам

Бейне: Рождестволық музыка көңілді жарық: 4 қадам

Бейне: Рождестволық музыка көңілді жарық: 4 қадам
Бейне: Таңғы жаттығу |Балаларға арналған әндер | Казахские детские песни 2024, Қараша
Anonim
Рождестволық музыка көңілді жарық
Рождестволық музыка көңілді жарық

Рождество құтты болсын! Сізбен араласатын шырша болғанын қалайсыз ба?

1 -қадам: Бұл жобада қолданылатын заттар

Аппараттық компоненттер

  • Seeeduino V4.2
  • Негізгі қалқан V2
  • Grove - реттелетін PIR қозғалыс сенсоры
  • Grove - дыбыс датчигі
  • Grove - WS2813 RGB суға төзімді LED жолағы - 60 жарық диоды/м - 1м

Бағдарламалық жасақтама және онлайн қызметтері

Arduino IDE

2 -қадам: Жабдыққа қосылу

Аппараттық қосылым
Аппараттық қосылым

PIR сенсоры, дыбыс датчигі мен жарық диодты жолақты Base Shield D2, A0 және D6 портына бөлек қосыңыз. Негізгі қалқаны Seeduino -ға қосыңыз, бәрі дайын.

3 -қадам: бағдарламалық қамтамасыз ету

Келесі кітапханалар бағдарламалау алдында орнатылуы керек, оларды Arduino IDE -ге қолмен жүктеп, импорттаңыз:

  • Led_Strip
  • MsTimer2
  • Arduino_Vector

Кодты неғұрлым қысқа ету үшін біз оны пакеттедік. CheerLight класы - бұл жобаның қолданбалы класы.

сынып қосымшасы:: CheerLight

: жалпы қолданба:: интерфейс:: IApplication {public: void setup (void); бос цикл (бос); жарамсыз setPIRSensorPin (uint8_t түйреуіш); жарамсыз setLoudnessSensorPin (uint8_t түйреуіш); сенсорлар (жарамсыз); void changeAnimation (void * args); void changeSpeed (void * args); void changeColor (void * args); статикалық қолданба:: CheerLight * getInstance (жарамсыз); қорғалған: драйвер:: LEDStrip _ledStrip; жүргізуші:: PIRSensor _pirSensor; жүргізуші:: LoudnessSensor _loudnessSensor; uint8_t _ анимация; орта бағдарлама:: Delegate _detectedDelegate; орта бағдарлама:: Delegate _absoluteLoudnessDelegate; орта бағдарламалық қамтамасыз ету:: Delegate _relationLoudnessDelegate; CheerLight (жарамсыз); статикалық қолданба:: CheerLight _instance; };

CheerLight сыныбын Singleton Patterns әзірледі, бұл оның бір ғана данасы бар екенін білдіреді, сіз CheerLight:: getInstance () шақыруға болады. Егер сенсорлардың қосылымы аппараттық қосылымнан өзгеше болса, оларды setPIRSensorPin () және setLoudnessSensorPin () әдістеріне қоңырау шалу арқылы өзгертуге болады.

Кескін
Кескін

Датчиктерді уақытында өлшеу үшін, өлшеуіштердегі үзіліс кезінде өлшеуіштерді шақыруды ұсынамыз, бірақ changeAnimation (), changeSpeed () немесе changeColor () әдістерін қолмен шақырудың қажеті жоқ. Сенсорлар өлшенген кезде олар делегаттар арқылы шақырылады.

Делегат дегеніміз не?

Барлығымыз білетіндей, біз функция көрсеткішін жариялай аламыз және оны C функциясына нұсқай аламыз:

void func1 (жарамсыз);

void (*pFunc) (void) = func1;

және оны көрсетілген функцияны шақыру үшін пайдаланыңыз

pFunc ();

Бірақ C ++ - те айырмашылықтар бар, егер сіз төмендегі кодты құрастыруға тырыссаңыз:

А сыныбы {

қоғамдық: void func1 (жарамсыз); }; void (*pFunc) (void) = & A:: func1;

компилятор түрлендіру қатесі туралы хабарлайды, бұл дұрыс мысал:

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

Біз бұл әдісті шақыру үшін оны қолдануға тырысқанда, қате қайтадан пайда болады. Бұл қатенің себебі-объект-әдіс объектімен шақырылуы керек. Сондықтан біз оны шақыратын объект жасаймыз:

А а;

a.*pFunc ();

Бұл жолы проблема жоқ. Сонымен, Delegate.h -те Delegate класы бар.

үлгі

class middleware:: Delegate: public middleware:: interface:: IDelegate {public: Delegate (T *object, void (T:: *method) (void *)); void invoke (void * args); қорғалған: T * _объект; void (T:: *_ әдісі) (void *); }; орта кірістірілген бағдарламалық жасақтама үлгісі:: Delegate:: Delegate (T *объектісі, void (T:: *әдісі) (void *)): _object (object), _method (method) {} шаблон кірістірілген бос орта бағдарламалық қамтамасыз ету:: Delegate:: invoke (void * args) {(_object-> * _ әдісі) (args); }

Delegate класы - бұл үлгі класы, бұл Delegate -дің делегаттан айырмашылығын білдіреді, оларды бір типті көрсеткішпен қалай көрсетуге болады? Жауап - бұл интерфейс, сондықтан IDelegate.h ішінде IDelegate интерфейсі бар.

орта бағдарламалық қамтамасыз ету:: интерфейс:: IDelegate {

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

PIR Sensor және Loudness Sensor сыныбында делегаттар көрсеткішін сақтау үшін _delegates деп аталатын айнымалы бар, және _delegates -те барлық делегаттарды шақыру үшін invokeAllDelegates () атты әдіс бар, ол шара () әдісі деп аталады.

ЕСКЕРТПЕ: changeAnimation (), changeSpeed () және changeColor () сияқты өкілдік әдістер timer2 үзілісінде шақырылады, сондықтан delay () немесе үзілуге негізделген басқа функцияны ҚОЛДАНБАҢЫЗ.

Ұсынылған: