INHOUDSOPGAWE:

Christmas Music Cheer Light: 4 stappe
Christmas Music Cheer Light: 4 stappe

Video: Christmas Music Cheer Light: 4 stappe

Video: Christmas Music Cheer Light: 4 stappe
Video: Chris Stapleton - Starting Over (Official Music Video) 2024, November
Anonim
Kersfees Musiek Cheer Light
Kersfees Musiek Cheer Light

Geseënde Kersfees! Wil u 'n kersboom hê wat met u kan kommunikeer?

Stap 1: Dinge wat in hierdie projek gebruik word

Hardeware komponente

  • Seeeduino V4.2
  • Base Shield V2
  • Grove - Verstelbare PIR -bewegingsensor
  • Grove - Luidheidssensor
  • Grove - WS2813 RGB LED Strip Waterproof - 60 LED/m - 1m

Sagteware -programme en aanlyndienste

Arduino IDE

Stap 2: Hardewareverbinding

Hardewareverbinding
Hardewareverbinding

Koppel PIR -sensor, luidheidssensor en LED -strook afsonderlik aan die poort D2, A0 en D6 van Base Shield. Koppel die basisskerm aan Seeduino, alles klaar.

Stap 3: sagteware programmering

Die volgende biblioteke moet geïnstalleer word voordat u dit programmeer; laai dit dan af en voer dit handmatig in na u Arduino IDE:

  • Led_Strip
  • MsTimer2
  • Arduino_Vektor

Om die kode meer bondig te maak, het ons dit verpak. CheerLight -klas is die toepassingsklas van hierdie projek.

klas aansoek:: CheerLight

: openbare toepassing:: koppelvlak:: IApplication {publiek: leemte opstelling (leeg); leemte -lus (leegte); leegte setPIRSensorPin (uint8_t pin); void setLoudnessSensorPin (uint8_t pin); leemte maatSensors (leeg); leegte veranderAnimasie (leemte * args); void changeSpeed (void * args); leemte veranderingKleur (leemte * args); statiese toepassing:: CheerLight * getInstance (nietig); beskerm: bestuurder:: LEDStrip _ledStrip; bestuurder:: PIRSensor _pirSensor; bestuurder:: LoudnessSensor _loudnessSensor; uint8_t _animasie; middelware:: Afgevaardigde _detectedDelegate; middelware:: Afgevaardigde _absoluteLoudnessDelegate; middelware:: Afgevaardigde _relativeLoudnessDelegate; CheerLight (leeg); statiese toepassing:: CheerLight _instance; };

CheerLight -klas is ontwerp deur Singleton Patterns, wat beteken dat daar slegs een voorbeeld is; u kan CheerLight:: getInstance () na daardie instansie skakel. As die verbinding van u sensors verskil van die hardewareverbinding, kan u dit verander deur setPIRSensorPin () en setLoudnessSensorPin () -metodes te skakel.

Beeld
Beeld

Ons beveel aan dat u meetSensors () -metode in timer -onderbreking aanroep om sensors betyds te laat meet, maar om veranderingAnimasie (), changeSpeed () of changeColor () metodes handmatig op te roep, is nie nodig nie. Hulle sal via afgevaardigdes gebel word wanneer sensors gemeet word.

Wat is 'n afgevaardigde?

Soos ons almal weet, kan ons 'n funksiewyser verklaar en dit na 'n funksie in C wys:

void func1 (void);

void (*pFunc) (void) = func1;

en gebruik dit om die funksie te noem waarop dit gewys het

pFunc ();

Maar daar is verskille in C ++ as u die volgende kode probeer saamstel:

klas A {

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

die samesteller sal 'n tipe omskakelingsfout aanmeld, hier is die regte voorbeeld:

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

Weer 'n fout as ons dit probeer gebruik om die metode te noem. Die rede vir die fout is dat 'n objekmetode deur 'n voorwerp genoem moet word. Ons skep dus 'n voorwerp om dit te noem:

A a;

a.*pFunc ();

Hierdie keer geen probleem nie. Daar is dus 'n Afgevaardigde -klas in Afgevaardigde.h.

sjabloon

klas middelware:: Afgevaardigde: openbare middelware:: koppelvlak:: IDelegate {publiek: Afgevaardigde (T *voorwerp, leeg (T:: *metode) (leegte *)); leegte aanroep (void * args); beskerm: T * _object; leegte (T:: *_ metode) (leemte *); }; sjabloon inlyn middelware:: Afgevaardigde:: Afgevaardigde (T *voorwerp, leegte (T:: *metode) (leegte *)): _object (voorwerp), _method (metode) {} sjabloon inlyn leegte middelware:: Afgevaardigde:: oproep (void * args) {(_object-> * _ method) (args); }

Omdat afgevaardigde -klas 'n sjabloonklas is, wat beteken dat afgevaardigde verskil van afgevaardigde is, hoe het hulle dieselfde tipe om dit deur wyser te wys? Die antwoord is koppelvlak, so daar is IDelegate -koppelvlak in IDelegate.h.

klas middelware:: koppelvlak:: IDelegate {

publiek: virtuele leemte aanroep (void * args) = 0; };

In die klas van PIR Sensor en Loudness Sensor het daar 'n veranderlike met die naam _ afgevaardigdes wat gebruik word om aanwyser van afgevaardigdes te stoor, en daar is 'n metode genaamd invokeAllDelegates () wat gebruik word om alle afgevaardigdes in _ afgevaardigdes aan te roep, dit word in maat () metode genoem.

OPMERKING: Afgevaardigde metodes, soos changeAnimation (), changeSpeed () en changeColor () word in timer2 interrupt genoem, dus gebruik NIE vertraging () of 'n ander interrupt-gebaseerde funksie daarin nie.

Aanbeveel: