Obsah:

Vánoční hudba Cheer Light: 4 kroky
Vánoční hudba Cheer Light: 4 kroky

Video: Vánoční hudba Cheer Light: 4 kroky

Video: Vánoční hudba Cheer Light: 4 kroky
Video: Magical Christmas Scenes & Music Ambience w/ Christmas Lights & Snow Falling 2024, Prosinec
Anonim
Světlo vánoční hudby na zdraví
Světlo vánoční hudby na zdraví

Veselé Vánoce! Chcete mít vánoční stromeček, který s vámi může komunikovat?

Krok 1: Věci použité v tomto projektu

Hardwarové komponenty

  • Seeeduino V4.2
  • Základní štít V2
  • Grove - nastavitelný snímač pohybu PIR
  • Grove - Senzor hlasitosti
  • Grove - WS2813 RGB LED pásek vodotěsný - 60 LED/m - 1m

Softwarové aplikace a online služby

Arduino IDE

Krok 2: Hardwarové připojení

Hardwarové připojení
Hardwarové připojení

Připojte samostatně PIR senzor, senzor hlasitosti a LED pásek k portu D2, A0 a D6 základního štítu. Připojte základní štít k Seeduino, vše hotovo.

Krok 3: Programování softwaru

Následující knihovny je třeba nainstalovat před programováním, stáhněte si je a importujte do svého Arduino IDE ručně:

  • Led_Strip
  • MsTimer2
  • Arduino_Vector

Aby byl kód stručnější, zabalili jsme ho. Třída CheerLight je aplikační třídou tohoto projektu.

třída aplikace:: CheerLight

: veřejná aplikace:: rozhraní:: IApplication {public: void setup (void); prázdná smyčka (prázdná); zrušit setPIRSensorPin (pin uint8_t); void setLoudnessSensorPin (pin uint8_t); neplatné opatření Senzory (neplatné); void changeAnimation (neplatné * args); void changeSpeed (neplatné * args); void changeColor (neplatné * args); statická aplikace:: CheerLight * getInstance (neplatné); chráněno: driver:: LEDStrip _ledStrip; ovladač:: PIRSensor _pirSensor; ovladač:: LoudnessSensor _loudnessSensor; uint8_t _animation; middleware:: Delegát _detectedDelegate; middleware:: Delegát _absoluteLoudnessDelegate; middleware:: Delegát _relativeLoudnessDelegate; CheerLight (neplatné); statická aplikace:: CheerLight _instance; };

Třídu CheerLight navrhla společnost Singleton Patterns, což znamená, že pro ni existuje pouze jedna instance, na kterou můžete zavolat CheerLight:: getInstance (). Pokud se připojení vašich senzorů liší od hardwarového připojení, můžete je změnit voláním metod setPIRSensorPin () a setLoudnessSensorPin ().

obraz
obraz

Doporučujeme volat metodu MeasSensors () v přerušení časovače, aby byly senzory měřeny včas, ale ruční volání metod changeAnimation (), changeSpeed () nebo changeColor () není nutné. Budou voláni prostřednictvím delegátů při měření senzorů.

Co je to delegát?

Jak všichni víme, můžeme deklarovat ukazatel funkce a ukázat jej na funkci v C:

void func1 (neplatné);

void (*pFunc) (void) = func1;

a použijte jej k volání funkce, na kterou ukázal

pFunc ();

Existují však rozdíly v C ++, pokud se pokusíte zkompilovat kód níže:

třída A {

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

kompilátor nahlásí chybu převodu typu, zde je správný příklad:

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

Když se ho pokusíme použít k volání této metody, chyba znovu. Důvodem této chyby je, že objektovou metodu musí volat objekt. Vytvoříme tedy objekt, kterému budeme říkat:

A a;

a.*pFunc ();

Tentokrát žádný problém. V Delegate.h je tedy třída Delegate.

šablona

middleware třídy:: Delegát: veřejný middleware:: rozhraní:: IDelegát {public: Delegát (objekt T *, void (metoda T:: *) (void *)); void invoke (void * args); chráněno: T * _object; void (metoda T:: *_) (void *); }; vložený middleware šablony:: Delegát:: Delegát (objekt T *, neplatný (metoda T:: *) (prázdný *)): _objekt (objekt), _metoda (metoda) {} šablona vložený prázdný middleware:: Delegát:: vyvolat (neplatné * args) {(_object-> * _ metoda) (args); }

Protože třída Delegate je třída šablony, což znamená, že Delegate je rozdíl vůči Delegate, jak je přimět, aby ukazovaly ukazatelem stejného typu? Odpověď je rozhraní, takže v IDelegate.h existuje rozhraní IDelegate.

middleware třídy:: rozhraní:: IDelegate {

public: virtuální void invoke (void * args) = 0; };

Ve třídě PIR Sensor a Loudness Sensor's existuje proměnná s názvem _delegates, která slouží k ukládání ukazatele Delegates, a existuje metoda s názvem invokeAllDelegates (), která slouží k vyvolání všech delegátů v _delegates, bude volána metodou Meas ().

POZNÁMKA: Delegované metody, jako například changeAnimation (), changeSpeed () a changeColor (), budou volány v přerušení timer2, takže v nich NEPOUŽÍVEJTE delay () ani jinou funkci založenou na přerušení.

Doporučuje: