Sadržaj:

Božićna muzika Cheer Light: 4 koraka
Božićna muzika Cheer Light: 4 koraka

Video: Božićna muzika Cheer Light: 4 koraka

Video: Božićna muzika Cheer Light: 4 koraka
Video: Fireplace 10 hours full HD 2024, Novembar
Anonim
Božićna muzika Cheer Light
Božićna muzika Cheer Light

Sretan božić! Želite li imati božićno drvce koje može komunicirati s vama?

Korak 1: Stvari koje se koriste u ovom projektu

Hardverske komponente

  • Seeeduino V4.2
  • Base Shield V2
  • Grove - Podesivi PIR senzor pokreta
  • Grove - Senzor glasnoće
  • Grove - WS2813 RGB LED traka Vodootporna - 60 LED/m - 1m

Softverske aplikacije i mrežne usluge

Arduino IDE

Korak 2: Povezivanje hardvera

Hardverska veza
Hardverska veza

Povežite PIR senzor, senzor glasnoće i LED traku odvojeno na priključke D2, A0 i D6 Base Shield -a. Uključite osnovni štit u Seeduino, sve je gotovo.

Korak 3: Programiranje softvera

Biblioteke koje slijede trebaju se instalirati prije programiranja, preuzmite ih i uvezite ručno u svoj Arduino IDE:

  • Led_Strip
  • MsTimer2
  • Arduino_Vector

Kako bismo kôd učinili sažetijim, zapakirali smo ga. Klasa CheerLight je klasa aplikacije ovog projekta.

klasa aplikacija: CheerLight

: javna aplikacija:: sučelje:: IApplication {javno: void setup (void); void loop (void); void setPIRSensorPin (uint8_t pin); void setLoudnessSensorPin (uint8_t pin); senzori void mjera (void); void changeAnimation (void * args); void changeSpeed (void * args); void changeColor (void * args); statička aplikacija:: CheerLight * getInstance (void); zaštićeno: upravljački program:: LEDStrip _ledStrip; upravljački program:: PIRSensor _pirSensor; driver:: LoudnessSensor _loudnessSensor; uint8_t _animation; middleware:: Delegate _detectedDelegate; middleware:: Delegate _absoluteLoudnessDelegate; middleware:: Delegate _relativeLoudnessDelegate; CheerLight (void); statička aplikacija:: CheerLight _instance; };

Klasu CheerLight dizajnirali su Singleton Patterns, što znači da postoji samo jedna instanca za nju, koju možete pozvati CheerLight:: getInstance () u tu instancu. Ako je veza vašeg senzora drugačija od veze s hardverom, možete ih promijeniti pozivanjem metoda setPIRSensorPin () i setLoudnessSensorPin ().

Image
Image

Preporučujemo pozivanje metode mjeraSensors () u prekidu tajmera kako bi se senzori izmjerili pravovremeno, ali pozivanje metoda changeAnimation (), changeSpeed () ili changeColor () ručno nije potrebno. Oni će biti pozvani preko delegata kada se izmjere senzori.

Šta je delegat?

Kao što svi znamo, možemo deklarirati pokazivač funkcije i učiniti da pokazuje na funkciju u C:

void func1 (void);

void (*pFunc) (void) = func1;

i upotrijebite ga za pozivanje funkcije na koju je ukazao

pFunc ();

Ali postoje razlike u C ++, ako pokušate kompajlirati kôd slijedeći:

klasa A {

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

kompajler će prijaviti grešku konverzije tipa, evo pravog primjera:

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

Kada pokušamo koristiti to za pozivanje te metode, opet greška. Razlog za tu grešku je taj što objekt-metod mora pozvati objekt. Stoga stvaramo objekt koji će ga nazvati:

Aa;

a.*pFunc ();

Ovaj put nema problema. Dakle, postoji klasa Delegate u Delegate.h.

predložak

class middleware:: Delegate: javni middleware:: sučelje:: IDelegate {public: Delegate (T *objekt, void (T:: *metoda) (void *)); void invoke (void * args); zaštićeno: T * _objekt; void (T:: *_ metoda) (void *); }; predložak inline middleware:: Delegate:: Delegate (T *objekt, void (T:: *metoda) (void *)): _object (objekt), _method (metoda) {} predložak inline void middleware:: Delegate:: invoke (void * args) {(_object-> * _ method) (args); }

Pošto je klasa delegata klasa predloška, što znači da je delegat razlika u odnosu na delegata, kako ih natjerati da budu pokazivači na isti tip? Odgovor je sučelje, pa postoji IDelegate sučelje u IDelegate.h.

class middleware:: sučelje:: IDelegate {

javno: pozivanje virtualne praznine (void * args) = 0; };

U klasi PIR senzora i senzora glasnoće postoji varijabla pod nazivom _delegates koja se koristi za spremanje pokazivača na delegate, a postoji i metoda pod nazivom invokeAllDelegates () koja se koristi za dozivanje svih delegata u _delegates, bit će pozvana u metodi mjera ().

NAPOMENA: Metode delegiranja, kao što su changeAnimation (), changeSpeed () i changeColor () bit će pozvane u prekidu timer2, stoga NEMOJTE koristiti delay () ili neku drugu funkciju zasnovanu na prekidima.

Preporučuje se: