Оглавление:

Рождественская музыка Cheer Light: 4 шага
Рождественская музыка Cheer Light: 4 шага

Видео: Рождественская музыка Cheer Light: 4 шага

Видео: Рождественская музыка Cheer Light: 4 шага
Видео: Mariah Carey - All I Want for Christmas Is You (Make My Wish Come True Edition) 2024, Ноябрь
Anonim
Рождественская музыка Cheer Light
Рождественская музыка Cheer Light

Счастливого Рождества! Вы хотите, чтобы елка могла взаимодействовать с вами?

Шаг 1. Вещи, использованные в этом проекте

Компоненты оборудования

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

Программные приложения и онлайн-сервисы

IDE Arduino

Шаг 2: Подключение оборудования

Подключение оборудования
Подключение оборудования

Подключите ИК-датчик, датчик громкости и светодиодную ленту к портам D2, A0 и D6 Base Shield по отдельности. Подключите Base Shield к Seeduino, все готово.

Шаг 3: Программирование программного обеспечения

Следующие ниже библиотеки необходимо установить перед программированием, загрузите и импортируйте их в свою Arduino IDE вручную:

  • Светодиодная полоса
  • MsTimer2
  • Arduino_Vector

Чтобы код был лаконичнее, мы его упаковали. Класс CheerLight - это класс приложения этого проекта.

класс application:: CheerLight

: общедоступное приложение:: интерфейс:: IApplication {общедоступное: установка недействительности (недействительность); пустая петля (void); void setPIRSensorPin (вывод uint8_t); void setLoudnessSensorPin (вывод uint8_t); void measureSensors (недействителен); void changeAnimation (void * args); void changeSpeed (void * args); void changeColor (void * args); статическое приложение:: CheerLight * getInstance (void); защищено: драйвер:: LEDStrip _ledStrip; драйвер:: PIRSensor _pirSensor; драйвер:: LoudnessSensor _loudnessSensor; uint8_t _animation; промежуточное ПО:: Delegate _detectedDelegate; промежуточное ПО:: Delegate _absoluteLoudnessDelegate; промежуточное ПО:: Delegate _relativeLoudnessDelegate; CheerLight (недействительно); статическое приложение:: CheerLight _instance; };

Класс CheerLight был разработан Singleton Patterns, что означает, что для него существует только один экземпляр, вы можете вызвать CheerLight:: getInstance () для этого экземпляра. Если подключение ваших датчиков отличается от подключения оборудования, вы можете изменить их, вызвав методы setPIRSensorPin () и setLoudnessSensorPin ().

Изображение
Изображение

Мы рекомендуем вызывать метод measureSensors () в прерывании таймера, чтобы датчики измерялись своевременно, но вызывать методы changeAnimation (), changeSpeed () или changeColor () вручную не требуется. Они будут вызываться через делегатов при измерении датчиков.

Что такое делегат?

Как мы все знаем, мы можем объявить указатель функции и сделать так, чтобы он указывал на функцию в C:

void func1 (пусто);

void (* pFunc) (void) = func1;

и используйте его для вызова функции, на которую он указал

pFunc ();

Но в C ++ есть отличия, если вы попытаетесь скомпилировать следующий код:

class A {

общедоступные: void func1 (void); }; void (* pFunc) (void) = & A:: func1;

компилятор сообщит об ошибке преобразования типа, вот правильный пример:

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

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

А а;

а. * pFunc ();

На этот раз без проблем. Итак, в Delegate.h есть класс Delegate.

шаблон

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

Поскольку класс Delegate является классом-шаблоном, что означает, что Delegate отличается от Delegate, как заставить их указывать указатель того же типа? Ответ - интерфейс, поэтому в IDelegate.h есть интерфейс IDelegate.

class middleware:: interface:: IDelegate {

public: виртуальный вызов void (void * args) = 0; };

В классе PIR Sensor и Loudness Sensor есть переменная с именем _delegates, используемая для хранения указателя делегатов, и есть метод с именем invokeAllDelegates (), используемый для вызова всех делегатов в _delegates, он будет вызываться в методе measure ().

ПРИМЕЧАНИЕ. Методы делегирования, такие как changeAnimation (), changeSpeed () и changeColor (), будут вызываться в прерывании timer2, поэтому НЕ используйте в нем delay () или другие функции, основанные на прерываниях.

Рекомендуемые: