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, Desembre
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: