Spisu treści:

Świąteczna muzyka Cheer Light: 4 kroki
Świąteczna muzyka Cheer Light: 4 kroki

Wideo: Świąteczna muzyka Cheer Light: 4 kroki

Wideo: Świąteczna muzyka Cheer Light: 4 kroki
Wideo: Carol of the Bells "Щедрик" - Скрипка и Танец - Каролина Проценко 2024, Listopad
Anonim
Boże Narodzenie Muzyka Cheer Światło
Boże Narodzenie Muzyka Cheer Światło

Wesołych Świąt! Czy chcesz mieć choinkę, która może wchodzić w interakcje z tobą?

Krok 1: Rzeczy użyte w tym projekcie

Komponenty sprzętowe

  • Seeeduino V4.2
  • Tarcza podstawowa V2
  • Grove - Regulowany czujnik ruchu PIR
  • Grove - czujnik głośności
  • Grove - Taśma LED RGB WS2813 Wodoodporna - 60 LED/m - 1m

Aplikacje i usługi online

IDE Arduino

Krok 2: Połączenie sprzętowe

Połączenie sprzętowe
Połączenie sprzętowe

Podłącz czujnik PIR, czujnik głośności i pasek LED do portów D2, A0 i D6 osłony podstawy oddzielnie. Podłącz osłonę podstawy do Seeduino, wszystko gotowe.

Krok 3: Programowanie oprogramowania

Poniższe biblioteki muszą zostać zainstalowane przed programowaniem, pobierz je i zaimportuj ręcznie do swojego Arduino IDE:

  • Pasek ledowy
  • MsTimer2
  • Arduino_Vector

Aby kod był bardziej zwięzły, spakowaliśmy go. Klasa CheerLight to klasa aplikacji tego projektu.

Aplikacja klasy::CheerLight

: public application::interface::IApplication { public: void setup(void); pusta pętla(pusta); void setPIRSensorPin(uint8_t pin); void setLoudnessSensorPin(uint8_t pin); void MeasureSensors(void); void changeAnimation(void *args); void changeSpeed(void *args); void changeColor(void * args); aplikacja statyczna::CheerLight * getInstance(void); chroniony: driver::LEDStrip _ledStrip; sterownik::PIRSensor _pirSensor; driver::LoudnessSensor _loudnessSensor; uint8_t _animacja; oprogramowanie pośredniczące::Delegate _detectedDelegate; oprogramowanie pośredniczące::Delegate _absoluteLoudnessDelegate; oprogramowanie pośredniczące::Delegate _relativeLoudnessDelegate; CheerLight (unieważnione); aplikacja statyczna::CheerLight _instance; };

Klasa CheerLight została zaprojektowana przez Singleton Patterns, co oznacza, że istnieje tylko jedna instancja dla tej instancji, możesz wywołać CheerLight::getInstance() do tej instancji. Jeśli połączenie Twoich czujników różni się od połączenia sprzętowego, możesz je zmienić, wywołując metody setPIRSensorPin() i setLoudnessSensorPin().

Obraz
Obraz

Zalecamy wywołanie metody MeasureSensors() w przerwaniu czasowym, aby czujniki były mierzone w odpowiednim czasie, ale ręczne wywoływanie metod changeAnimation(), changeSpeed() lub changeColor() nie jest konieczne. Będą one wywoływane przez delegatów podczas pomiaru czujników.

Kim jest delegat?

Jak wszyscy wiemy, możemy zadeklarować wskaźnik do funkcji i sprawić, by wskazywał na funkcję w C:

void func1(unieważniony);

nieważne (*pFunc)(nieważne) = func1;

i użyj go, aby wywołać wskazaną funkcję

pFunc();

Ale są różnice w C++, jeśli spróbujesz skompilować kod w następujący sposób:

klasa A {

public: void func1(void); }; nieważne (*pFunc)(nieważne) = &A::func1;

kompilator zgłosi błąd konwersji typu, oto właściwy przykład:

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

Kiedy próbujemy użyć go do wywołania tej metody, ponownie błąd. Powodem tego błędu jest to, że obiekt-metoda musi być wywołana przez obiekt. Więc tworzymy obiekt, aby go nazwać:

A;

a.*pFunc();

Tym razem nie ma problemu. Tak więc w Delegate.h jest klasa Delegate.

szablon

class middleware::Delegate: public middleware::interface::IDelegate { public: Delegate(T * obiekt, void (T::*method)(void *)); void invoke(void * argumenty); chroniony: T * _object; nieważne (T::*_metoda)(nieważne *); }; wbudowane oprogramowanie pośredniczące szablonu::Delegate::Delegate(T * obiekt, void (T::*method)(void *)): _object(object), _method(method) { } wbudowane oprogramowanie pośredniczące szablonu::Delegate::invoke(void * argumenty) { (_object->*_metoda)(argumenty); }

Ponieważ klasa Delegate jest klasą szablonową, co oznacza, że Delegate jest różnicą w stosunku do Delegate, jak sprawić, by były wskazywane przez wskaźnik, miały ten sam typ? Odpowiedzią jest interfejs, więc w IDelegate.h jest interfejs IDelegate.

class middleware::interface::IDelegate {

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

W klasie PIR Sensor i Loudness Sensor znajduje się zmienna o nazwie _delegates służąca do przechowywania wskaźnika Delegates oraz metoda o nazwie invokeAllDelegates() służąca do wywoływania wszystkich delegatów w _delegates, zostanie ona wywołana w metodzie Measure().

UWAGA: Metody delegujące, takie jak changeAnimation(), changeSpeed() i changeColor() będą wywoływane w przerwaniu timera2, więc NIE używaj w nim delay() ani innej funkcji opartej na przerwaniu.

Zalecana: