Съдържание:

Коледна музика Cheer Light: 4 стъпки
Коледна музика Cheer Light: 4 стъпки

Видео: Коледна музика Cheer Light: 4 стъпки

Видео: Коледна музика Cheer Light: 4 стъпки
Видео: Holiday Cheer ! Over 4 hours of Christmas music content. Merry Christmas 2021 and on to 2022 2024, Ноември
Anonim
Коледна музика Cheer Light
Коледна музика Cheer Light

Весела Коледа! Искате ли да имате коледно дърво, което да взаимодейства с вас?

Стъпка 1: Нещата, използвани в този проект

Хардуерни компоненти

  • Seeeduino V4.2
  • Базов щит V2
  • Grove - Регулируем PIR сензор за движение
  • Grove - Сензор за силата на звука
  • Grove - WS2813 RGB LED лента Водоустойчива - 60 LED/m - 1м

Софтуерни приложения и онлайн услуги

Arduino IDE

Стъпка 2: Хардуерна връзка

Хардуерна връзка
Хардуерна връзка

Свържете PIR сензор, сензор за силата на звука и LED лента към портовете D2, A0 и D6 на Base Shield поотделно. Включете основния щит към Seeduino, всичко е готово.

Стъпка 3: Софтуерно програмиране

Следващите библиотеки трябва да се инсталират преди програмиране, моля, изтеглете ги и ги импортирайте ръчно във вашата Arduino IDE:

  • Led_Strip
  • MsTimer2
  • Arduino_Vector

За да направим кода по -кратък, ние го опаковаме. Класът CheerLight е класът на приложение на този проект.

приложение за клас:: CheerLight

: обществено приложение:: интерфейс:: IApplication {обществено: настройка на void (void); void loop (void); void setPIRSensorPin (щифт uint8_t); void setLoudnessSensorPin (uint8_t щифт); void mjeraSensors (void); void changeAnimation (void * args); void changeSpeed (void * args); void changeColor (void * args); статично приложение:: CheerLight * getInstance (void); защитен: драйвер:: LEDStrip _ledStrip; драйвер:: PIRSensor _pirSensor; драйвер:: LoudnessSensor _loudnessSensor; uint8_t _анимация; посредник:: Делегат _detectedDelegate; посредник:: Делегат _absoluteLoudnessDelegate; посредник:: Делегат _relativeLoudnessDelegate; CheerLight (невалидно); статично приложение:: CheerLight _instance; };

Класът CheerLight е проектиран от Singleton Patterns, което означава, че има само един екземпляр за него, можете да извикате CheerLight:: getInstance () към този екземпляр. Ако връзката на вашите сензори е различна от хардуерната връзка, можете да ги промените, като извикате методите setPIRSensorPin () и setLoudnessSensorPin ().

Образ
Образ

Препоръчваме извикване на метода mereSensors () в прекъсване на таймера, за да направим сензорите измервани своевременно, но извикването на методите changeAnimation (), changeSpeed () или changeColor () ръчно не е необходимо. Те ще бъдат извикани чрез Делегати, когато сензорите бъдат измерени.

Какво е делегат?

Както всички знаем, можем да декларираме указател на функция и да го накараме да посочи функция в C:

void func1 (void);

void (*pFunc) (void) = func1;

и го използвайте за извикване на функцията, към която е посочил

pFunc ();

Но има разлики в C ++, ако се опитате да компилирате кода следното:

клас А {

публично: void func1 (void); }; void (*pFunc) (void) = & A:: func1;

компилаторът ще докладва грешка при преобразуване на тип, ето десния пример:

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

Когато се опитваме да го използваме за извикване на този метод, отново грешка. Причината за тази грешка е, че обект-метод трябва да бъде извикан от обект. Затова създаваме обект, който да го нарича:

А а;

a.*pFunc ();

Този път няма проблем. Така че има Delegate клас в Delegate.h.

шаблон

клас middleware:: Делегат: обществен посредник:: интерфейс:: IDelegate {обществен: Делегат (T *обект, void (метод T:: *) (void *)); void invoke (void * args); защитен: T * _object; void (T:: *_ метод) (void *); }; шаблон вграден посредник:: Делегиране:: Делегиране (T *обект, void (T:: *метод) (void *)): _object (обект), _method (метод) {} шаблон inline void middleware:: Delegate:: invoke (void * args) {(_object-> * _ method) (args); }

Тъй като класът делегат е клас шаблон, което означава, че делегатът е разлика за делегата, как да ги накараме да бъдат посочени от показалец имат същия тип? Отговорът е интерфейс, така че има интерфейс IDelegate в IDelegate.h.

клас middleware:: интерфейс:: IDelegate {

публично: извикване на виртуална невалидност (void * args) = 0; };

В класа на PIR Sensor и Loudness Sensor има променлива, наречена _delegates, използвана за съхраняване на показалеца на Делегати, и има метод, наречен invokeAllDelegates (), използван за извикване на всички Делегати в _delegates, той ще бъде извикан в метода mere ().

ЗАБЕЛЕЖКА: Делегиращите методи, като changeAnimation (), changeSpeed () и changeColor () ще бъдат извикани в timeer2 прекъсване, така че НЕ използвайте delay () или друга функция, базирана на прекъсване.

Препоръчано: