Tartalomjegyzék:

Karácsonyi zene örömfény: 4 lépés
Karácsonyi zene örömfény: 4 lépés

Videó: Karácsonyi zene örömfény: 4 lépés

Videó: Karácsonyi zene örömfény: 4 lépés
Videó: Az Öröm Advent 4 vasárnapja 2024, November
Anonim
Karácsonyi zene vidám fény
Karácsonyi zene vidám fény

Boldog Karácsonyt! Szeretnél egy karácsonyfát, amely kölcsönhatásba léphet veled?

1. lépés: A projektben használt dolgok

Hardver alkatrészek

  • Seeeduino V4.2
  • Alappajzs V2
  • Grove - Állítható PIR mozgásérzékelő
  • Grove - Hangosság érzékelő
  • Grove - WS2813 RGB LED szalag Vízálló - 60 LED/m - 1m

Szoftveralkalmazások és online szolgáltatások

Arduino IDE

2. lépés: Hardvercsatlakozás

Hardver kapcsolat
Hardver kapcsolat

Csatlakoztassa a PIR érzékelőt, a hangosságérzékelőt és a LED szalagot az alappajzs D2, A0 és D6 portjához külön. Csatlakoztassa az alappajzsot a Seeduino -hoz, minden kész.

3. lépés: Szoftverprogramozás

A következő könyvtárakat telepíteni kell a programozás előtt, kérjük, töltse le és importálja őket manuálisan az Arduino IDE -be:

  • LED-csík
  • MsTimer2
  • Arduino_Vector

Annak érdekében, hogy a kód tömörebb legyen, csomagoltuk. A CheerLight osztály a projekt alkalmazási osztálya.

osztályos alkalmazás:: CheerLight

: nyilvános alkalmazás:: felület:: IApplication {public: void setup (void); void loop (void); void setPIRSensorPin (uint8_t pin); void setLoudnessSensorPin (uint8_t pin); void intézkedésSensors (void); void changeAnimation (void * args); void changeSpeed (void * args); void changeColor (void * args); statikus alkalmazás:: CheerLight * getInstance (void); védett: illesztőprogram:: LEDStrip _ledStrip; illesztőprogram:: PIRSensor _pirSensor; illesztőprogram:: LoudnessSensor _loudnessSensor; uint8_t _animation; köztes szoftver:: Delegate _detectedDelegate; köztes szoftver:: Delegálás _absoluteLoudnessDelegate; köztes szoftver:: Delegate _relativeLoudnessDelegate; CheerLight (érvénytelen); statikus alkalmazás:: CheerLight _instance; };

A CheerLight osztályt a Singleton Patterns tervezte, ami azt jelenti, hogy csak egy példány létezik, a CheerLight:: getInstance () meghívható erre a példányra. Ha az érzékelők kapcsolata eltér a hardverkapcsolattól, akkor a setPIRSensorPin () és a setLoudnessSensorPin () metódusok meghívásával megváltoztathatja őket.

Kép
Kép

Javasoljuk, hogy az időzítő megszakításában hívja meg a meetSensors () metódust, hogy az érzékelőket időben mérjék, de a changeAnimation (), changeSpeed () vagy changeColor () metódusok manuális megadása nem szükséges. Az érzékelők mérésekor a küldötteken keresztül hívják őket.

Mi az a küldött?

Mint mindannyian tudjuk, deklarálhatunk egy függvénymutatót, és ráirányíthatjuk egy C függvényre:

void func1 (void);

void (*pFunc) (void) = func1;

és annak segítségével hívja meg a rámutatott függvényt

pFunc ();

De vannak különbségek a C ++ nyelvben, ha megpróbálja lefordítani a kódot az alábbiak szerint:

A osztály {

nyilvános: void func1 (void); }; void (*pFunc) (void) = & A:: func1;

a fordító jelenteni fog egy típuskonverziós hibát, itt a megfelelő példa:

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

Amikor megpróbáljuk meghívni ezt a módszert, ismét hiba történik. A hiba oka az, hogy egy objektum-metódust egy objektumnak kell meghívnia. Létrehozunk tehát egy objektumot annak megnevezésére:

A a;

a.*pFunc ();

Ezúttal semmi gond. Tehát van Delegate osztály a Delegate.h -ban.

sablon

class middleware:: Delegate: public middleware:: interface:: IDelegate {public: Delegate (T *object, void (T:: *method) (void *)); void invoke (void * args); védett: T * _objektum; void (T:: *_ módszer) (void *); }; sablon inline middleware:: Delegate:: Delegate (T *object, void (T:: *method) (void *)): _object (object), _method (method) {} template inline void middleware:: Delegate:: invoke (void * args) {(_object-> * _ metódus) (args); }

Mivel a Delegate osztály sablonosztály, ami azt jelenti, hogy a Delegate eltér a Delegate -től, hogyan lehet őket azonos mutatóval mutatni? A válasz az interfész, tehát van IDelegate felület az IDelegate.h -ban.

class middleware:: interfész:: IDelegate {

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

A PIR érzékelő és a hangosság érzékelő osztályában van egy _delegates nevű változó, amelyet a küldöttek mutatójának tárolására használnak, és van egy invokeAllDelegates () nevű metódus, amelyet az összes delegátus meghívására használnak a _delegates -ben, ez lesz a mértékegység () metódus.

MEGJEGYZÉS: A delegált módszerek, például a changeAnimation (), a changeSpeed () és a changeColor () meghívásra kerülnek a timer2 interrupt-ban, ezért NE használjon delay () vagy más megszakításon alapuló függvényt.

Ajánlott: