Коледна музика Cheer Light: 4 стъпки
Коледна музика Cheer Light: 4 стъпки
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 () или друга функция, базирана на прекъсване.

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