Sadržaj:

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

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

Video: Božićna glazba Cheer Light: 4 koraka
Video: My Favourite Time of year - The Florin street Band - Original Christmas Songs 2024, Studeni
Anonim
Božićna glazba Cheer Light
Božićna glazba Cheer Light

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

Korak 1: Stvari korištene u ovom projektu

Hardverske komponente

  • Seeeduino V4.2
  • Osnovni štit 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

Veza hardvera
Veza hardvera

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

Korak 3: Programiranje softvera

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

  • LED traka
  • Gđa Timer 2
  • Arduino_Vector

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

klasa aplikacija: CheerLight

: javna aplikacija:: sučelje:: IApplication {public: void setup (void); void petlja (void); void setPIRSensorPin (uint8_t pin); void setLoudnessSensorPin (uint8_t pin); void mjeračiSenzori (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 _animacija; middleware:: Delegate _detectedDelegate; middleware:: Delegate _absoluteLoudnessDelegate; middleware:: Delegate _relativeLoudnessDelegate; CheerLight (ništavno); statička primjena:: 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ših senzora različita od Hardverske veze, možete ih promijeniti pozivanjem metoda setPIRSensorPin () i setLoudnessSensorPin ().

Slika
Slika

Preporučujemo pozivanje metode mjeraSensors () u vremenskom prekidu kako bi se senzori izmjerili pravovremeno, ali ručno pozivanje metoda changeAnimation (), changeSpeed () ili changeColor () nije potrebno. Pozvat će ih putem delegata kada se izmjere senzori.

Što 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 ();

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

razred A {

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

prevoditelj će prijaviti pogrešku pretvorbe tipa, evo pravog primjera:

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

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

A a;

a.*pFunc ();

Ovaj put bez 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); }

Budući da je klasa delegata predložak, što znači da je delegat razlika u odnosu na delegata, kako ih natjerati da pokazivač imaju isti tip? Odgovor je sučelje, pa postoji IDelegate sučelje u IDelegate.h.

klasa middleware:: sučelje:: IDelegate {

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

U klasi PIR Sensor i Loudness Sensor postoji varijabla pod nazivom _delegates koja se koristi za spremanje pokazivača na delegate, a postoji i metoda zvana 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čeni: