Obsah:

Svetlo na zdravie vianočnej hudby: 4 kroky
Svetlo na zdravie vianočnej hudby: 4 kroky

Video: Svetlo na zdravie vianočnej hudby: 4 kroky

Video: Svetlo na zdravie vianočnej hudby: 4 kroky
Video: 9,5 ЧАСОВ в ТЫКВЕ, ГУСЬ ЗАПЕЧЁННЫЙ!! МЯСО в ОГРОМНОЙ ТЫКВЕ!! 2024, November
Anonim
Svetlo na zdravie vianočnej hudby
Svetlo na zdravie vianočnej hudby

Veselé Vianoce! Chcete mať vianočný stromček, ktorý by s vami mohol interagovať?

Krok 1: Veci použité v tomto projekte

Hardvérové komponenty

  • Seeeduino V4.2
  • Základný štít V2
  • Grove - nastaviteľný snímač pohybu PIR
  • Grove - snímač hlasitosti
  • Grove - WS2813 RGB LED pásik vodotesný - 60 LED/m - 1m

Softvérové aplikácie a online služby

Arduino IDE

Krok 2: Pripojenie hardvéru

Hardvérové pripojenie
Hardvérové pripojenie

Pripojte PIR senzor, snímač hlasitosti a LED pásik oddelene k portu D2, A0 a D6 základného štítu. Pripojte základný štít k Seeduinu, všetko hotové.

Krok 3: Programovanie softvéru

Nasledujúce knižnice je potrebné nainštalovať pred programovaním, stiahnite si ich a importujte do svojho Arduino IDE ručne:

  • Led_Strip
  • MsTimer2
  • Arduino_Vector

Aby bol kód stručnejší, zabalili sme ho. Trieda CheerLight je aplikačnou triedou tohto projektu.

triedna aplikácia:: CheerLight

: verejná aplikácia:: rozhranie:: IAplikácia {public: void setup (void); prázdna slučka (prázdna); zrušiť setPIRSensorPin (pin uint8_t); neplatný setLoudnessSensorPin (pin uint8_t); neplatné opatrenie Senzory (prázdne); void changeAnimation (neplatné * args); void changeSpeed (neplatné * args); void changeColor (neplatné * args); statická aplikácia:: CheerLight * getInstance (neplatné); chránené: ovládač:: LEDStrip _ledStrip; ovládač:: PIRSensor _pirSensor; ovládač:: LoudnessSensor _loudnessSensor; uint8_t _animation; middleware:: Delegát _detectedDelegate; middleware:: Delegát _absoluteLoudnessDelegate; middleware:: Delegát _relativeLoudnessDelegate; CheerLight (prázdny); statická aplikácia:: CheerLight _inštancia; };

Triedu CheerLight navrhla spoločnosť Singleton Patterns, čo znamená, že pre ňu existuje iba jedna inštancia. Na túto inštanciu môžete zavolať CheerLight:: getInstance (). Ak sa pripojenie vašich senzorov líši od hardvérového pripojenia, môžete ich zmeniť volaním metód setPIRSensorPin () a setLoudnessSensorPin ().

Obrázok
Obrázok

Odporúčame použiť metódu MeasSensors () v prerušení časovača, aby boli senzory merané včas, ale manuálne volanie metód changeAnimation (), changeSpeed () alebo changeColor () nie je potrebné. Budú zavolaní prostredníctvom delegátov pri meraní senzorov.

Čo je to delegát?

Ako všetci vieme, môžeme deklarovať ukazovateľ funkcie a ukázať ho na funkciu v C:

void func1 (neplatné);

void (*pFunc) (void) = func1;

a pomocou neho zavolajte funkciu, na ktorú ukázal

pFunc ();

Existujú však rozdiely v C ++, ak sa pokúsite skompilovať kód nižšie:

trieda A {

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

kompilátor nahlási chybu prevodu typu, tu je správny príklad:

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

Keď sa ho pokúsime použiť na zavolanie tejto metódy, chyba znova. Dôvodom tejto chyby je, že objektovú metódu musí vyvolať objekt. Vytvoríme teda objekt, ktorý ho bude volať:

A a;

a.*pFunc ();

Tentoraz žiadny problém. V Delegate.h je teda trieda delegátov.

predloha

middleware triedy:: Delegát: verejný middleware:: rozhranie:: IDelegát {public: Delegát (objekt T *, prázdny (metóda T:: *) (prázdny *)); void invoke (void * args); chránené: T * _object; void (metóda T:: *_) (void *); }; vložený middleware šablóny:: Delegát:: Delegát (objekt T *, prázdny (metóda T:: *) (prázdny *)): _object (objekt), _metóda (metóda) {} šablóna vložený prázdny middleware:: Delegát:: vyvolať (neplatné * args) {(_object-> * _ metóda) (args); }

Pretože trieda delegáta je trieda šablón, čo znamená, že delegát je rozdiel voči delegátovi, ako ich označiť ukazovateľom rovnakého typu? Odpoveď je rozhranie, takže v IDelegate.h je rozhranie IDelegate.

middleware triedy:: rozhranie:: IDelegate {

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

V triede PIR Senzor a Senzor hlasitosti existuje premenná s názvom _delegates, ktorá sa používa na ukladanie ukazovateľa delegátov, a existuje metóda s názvom invokeAllDelegates (), ktorá sa používa na vyvolanie všetkých delegátov v skupine _delegates, a bude sa volať v meracej () metóde.

POZNÁMKA: Delegované metódy, ako napríklad changeAnimation (), changeSpeed () a changeColor (), sa budú volať v prerušení timer2, preto v nich NEPOUŽÍVAJTE delay () ani inú funkciu založenú na prerušení.

Odporúča: