Taula de continguts:

Christmas Music Cheer Light: 4 passos
Christmas Music Cheer Light: 4 passos

Vídeo: Christmas Music Cheer Light: 4 passos

Vídeo: Christmas Music Cheer Light: 4 passos
Vídeo: Jingle Bell Rock Christmas Dance | Easy Christmas Choreography Dance Song 2024, De novembre
Anonim
Christmas Music Cheer Light
Christmas Music Cheer Light

Bon Nadal! Voleu tenir un arbre de Nadal que pugui interactuar amb vosaltres?

Pas 1: coses utilitzades en aquest projecte

Components de maquinari

  • Seeeduino V4.2
  • Base Shield V2
  • Grove - Sensor de moviment PIR ajustable
  • Grove - Sensor de volum
  • Grove - Tira LED WS2813 RGB impermeable - 60 LED / m - 1m

Aplicacions de programari i serveis en línia

IDE Arduino

Pas 2: connexió de maquinari

Connexió de maquinari
Connexió de maquinari

Connecteu el sensor PIR, el sensor de volum i la tira LED al port D2, A0 i D6 de Base Shield per separat. Connecteu Base Shield a Seeduino, tot fet.

Pas 3: programació de programari

Les biblioteques que segueixen han d’instal·lar-se abans de programar-les; descarregueu-les i importeu-les manualment al vostre IDE Arduino:

  • Led_Strip
  • MsTimer2
  • Arduino_Vector

Per tal de fer el codi més concís, l’hem empaquetat. La classe CheerLight és la classe d'aplicació d'aquest projecte.

aplicació de classe:: CheerLight

: public application:: interface:: IApplication {public: void setup (void); bucle buit (buit); void setPIRSensorPin (pin uint8_t); void setLoudnessSensorPin (pin uint8_t); void measureSensors (void); void changeAnimation (void * args); void changeSpeed (void * args); void changeColor (void * args); aplicació estàtica:: CheerLight * getInstance (void); protected: driver:: LEDStrip _ledStrip; controlador:: PIRSensor _pirSensor; controlador:: LoudnessSensor _loudnessSensor; uint8_t _animació; middleware:: Delegat _detectedDelegat; middleware:: Delegat _absoluteLoudnessDelegate; middleware:: Delegate _relativeLoudnessDelegate; CheerLight (buit); aplicació estàtica:: CheerLight _instance; };

La classe CheerLight va ser dissenyada per Singleton Patterns, el que significa que només hi ha una instància, podeu trucar a CheerLight:: getInstance () a aquesta instància. Si la connexió dels vostres sensors és diferent a la connexió de maquinari, podeu canviar-les trucant als mètodes setPIRSensorPin () i setLoudnessSensorPin ().

Imatge
Imatge

Es recomana trucar al mètode MeasureSensors () en la interrupció del temporitzador perquè els sensors es mesurin a temps, però no cal trucar manualment als mètodes changeAnimation (), changeSpeed () o changeColor (). Es trucaran mitjançant delegats quan es mesurin els sensors.

Què és un delegat?

Com tots sabem, podem declarar un punter de funció i fer-lo apuntar a una funció en C:

void func1 (buit);

void (* pFunc) (void) = func1;

i utilitzeu-lo per anomenar la funció a la qual apuntava

pFunc ();

Però hi ha diferències en C ++, si intenteu compilar el codi següent:

classe A {

públic: void func1 (void); }; void (* pFunc) (void) = & A:: func1;

el compilador informarà d'un error de conversió de tipus, aquí teniu l'exemple correcte:

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

Quan provem d'utilitzar-lo per trucar a aquest mètode, tornarem a produir un error. La raó d’aquest error és que un objecte ha de cridar un mètode objecte. Per tant, creem un objecte per anomenar-lo:

A a;

a. * pFunc ();

Aquesta vegada no hi ha problema. Per tant, hi ha classe de delegat a Delegate.h.

plantilla

middleware de classe:: Delegat: middleware públic:: interfície:: IDelegat {public: Delegat (objecte T *, buit (mètode T:: *) (buit *)); void invoke (void * args); protegit: T * _objecte; void (mètode T:: * _) (void *); }; plantilla middleware en línia:: Delegat:: Delegat (objecte T *, void (mètode T:: *) (void *)): _objecte (objecte), _method (mètode) {} plantilla middleware nul en línia: Delegate:: invoke (void * args) {(_object -> * _ method) (args); }

Com que la classe Delegat és una classe de plantilla, el que significa que Delegat és diferent a Delegat, com fer-los apuntar amb un punter tenen el mateix tipus? La resposta és interfície, de manera que hi ha una interfície IDelegate a IDelegate.h.

middleware de classe:: interface:: IDelegate {

públic: invocar el buit virtual (void * args) = 0; };

A la classe PIR Sensor i Loudness Sensor, hi ha una variable anomenada _delegates que s’utilitza per emmagatzemar el punter de delegats i hi ha un mètode anomenat invokeAllDelegates () que s’utilitza per invocar tots els delegats de _delegates, s’anomenarà mètode measure ().

NOTA: Mètodes de delegació, com changeAnimation (), changeSpeed () i changeColor () es cridaran a la interrupció del temporitzador 2, així que NO utilitzeu delay () ni cap altra funció basada en la interrupció.

Recomanat: