Përmbajtje:

Muzika e Krishtlindjeve Gëzoni Dritën: 4 Hapa
Muzika e Krishtlindjeve Gëzoni Dritën: 4 Hapa

Video: Muzika e Krishtlindjeve Gëzoni Dritën: 4 Hapa

Video: Muzika e Krishtlindjeve Gëzoni Dritën: 4 Hapa
Video: Женщина-лев - Драма - Полный английский фильм - HD 2024, Nëntor
Anonim
Muzikë e Krishtlindjeve Gëzoni Dritë
Muzikë e Krishtlindjeve Gëzoni Dritë

Gëzuar Krishtlindjet! Dëshironi të keni një pemë të Krishtlindjes që mund të ndërveprojë me ju?

Hapi 1: Gjërat e përdorura në këtë projekt

Komponentët e harduerit

  • Seeeduino V4.2
  • Mburoja e Bazës V2
  • Grove - Sensor lëvizës PIR i rregullueshëm
  • Grove - Sensori i zhurmës
  • Grove - WS2813 RGB Rrip LED i papërshkueshëm nga uji - 60 LED/m - 1m

Aplikacionet softuerike dhe shërbimet online

Arduino IDE

Hapi 2: Lidhja e harduerit

Lidhja e harduerit
Lidhja e harduerit

Lidhni sensorin PIR, sensorin e zhurmës dhe shiritin LED në portën D2, A0 dhe D6 të Base Shield veç e veç. Plug Base Shield në Seeduino, gjithçka është bërë.

Hapi 3: Programimi i softuerit

Bibliotekat e mëposhtme duhet të instalohen para programimit, ju lutemi shkarkoni dhe importoni ato në Arduino IDE tuaj me dorë:

  • Led_Strip
  • MsTimer2
  • Arduino_Vektor

Për ta bërë kodin më konciz, ne e kemi paketuar atë. Klasa CheerLight është klasa e aplikimit të këtij projekti.

aplikimi i klasës:: CheerLight

: public application:: interface:: IApplication {public: void setup (void); lak void (i pavlefshëm); void setPIRSensorPin (uint8_t pin); void setLoudnessSensorPin (uint8_t pin); masë e pavlefshme Sensorë (të pavlefshëm); ndryshim i pavlefshëmAnimacion (i pavlefshëm * args); ndryshim i pavlefshëm Shpejtësia (zbrazëti * args); ndryshim i pavlefshëm Ngjyra (zbrazëti * args); aplikim statik:: CheerLight * getInstance (i pavlefshëm); mbrojtur: shoferi:: LEDStrip _ledStrip; shoferi:: PIRSensor _pirSensor; shoferi:: LoudnessSensor _loudnessSensor; uint8_t _animacion; middleware:: Delegate _detectedDelegate; middleware:: Delegate _absoluteLoudnessDelegate; middleware:: Delegate _relativeLoudnessDelegate; CheerLight (e pavlefshme); aplikim statik:: CheerLight _stance; };

Klasa CheerLight u krijua nga Singleton Patterns, që do të thotë se ka vetëm një shembull për të, ju mund të telefononi CheerLight:: getInstance () në atë shembull. Nëse lidhja e Sensorëve tuaj është e ndryshme nga Lidhja e Pajisjeve, ju mund t'i ndryshoni ato duke thirrur metodat setPIRSensorPin () dhe setLoudnessSensorPin ().

Imazhi
Imazhi

Ne rekomandojmë thirrjen e metodës masëSensore () në ndërprerjen e kohëmatësit për t'i bërë sensorët të maten në kohë, por thirrja e metodave të ndryshimitAnimation (), ndryshimit të shpejtësisë () ose ndryshimit të ngjyrës () nuk është e nevojshme. Ata do të thirren nëpërmjet Delegatëve kur maten sensorët.

Çfarë është një Delegat?

Siç e dimë të gjithë, ne mund të deklarojmë një tregues të funksionit dhe ta bëjmë atë të tregojë një funksion në C:

void func1 (void);

i pavlefshëm (*pFunc) (i pavlefshëm) = func1;

dhe përdorni atë për të thirrur funksionin që tregoi

pFunc ();

Por ka dallime në C ++, nëse përpiqeni të përpiloni kodin e mëposhtëm:

klasa A {

publike: void func1 (void); }; i pavlefshëm (*pFunc) (i pavlefshëm) = & A:: func1;

përpiluesi do të raportojë një gabim të konvertimit të tipit, këtu është shembulli i duhur:

i pavlefshëm (A::*pFunc) (i pavlefshëm) = & A:: func1;

Kur përpiqemi ta përdorim për ta thirrur atë metodë, gabim përsëri. Arsyeja për atë gabim është se një metodë objekt duhet të thirret nga një objekt. Pra, ne krijojmë një objekt për ta quajtur atë:

A a;

a.*pFunc ();

Këtë herë nuk ka problem. Pra ka klasë Delegate në Delegate.h.

shabllon

middleware i klasës:: Delegati: public middleware:: ndërfaqja:: IDelegate {public: Delegate (T *object, void (T:: *method) (void *)); void thirrje (pavlefshme * args); mbrojtur: T * _object; i pavlefshëm (T:: *_ metoda) (i pavlefshëm *); }; template inline middleware:: Delegate:: Delegate (T *object, void (T:: *method) (void *)): _object (object), _metoda (metoda) {} template inline void middleware:: Delegate:: invoke (void * args) {(_object-> * _ method) (args); }

Për shkak se klasa Delegate është një klasë model, që do të thotë se Delegati është ndryshim nga Delegati, si t'i bëjmë ato të tregohen me tregues të kenë të njëjtin lloj? Përgjigja është ndërfaqe, kështu që ka ndërfaqe IDelegate në IDelegate.h.

klasa middleware:: ndërfaqja:: IDelegate {

publike: thirrje e zbrazëtisë virtuale (zbrazëti * args) = 0; };

Në klasën e PIR Sensor dhe Loudness Sensor, ekziston një variabël e quajtur _ delegatët e përdorur për të ruajtur treguesin e Delegatëve, dhe ka një metodë të quajtur invokeAllDelegates () e përdorur për të thirrur të gjithë Delegatët në _ delegatët, ajo do të quhet në masë () metodë.

SH NOTNIM: Metodat e delegimit, të tilla si changeAnimation (), changeSpeed () dhe changeColor () do të thirren në ndërprerjen e timer2, kështu që NUK përdorni vonesë () ose funksion tjetër të bazuar në ndërprerje në të.

Recommended: