Talaan ng mga Nilalaman:

Christmas Music Cheer Light: 4 na Hakbang
Christmas Music Cheer Light: 4 na Hakbang

Video: Christmas Music Cheer Light: 4 na Hakbang

Video: Christmas Music Cheer Light: 4 na Hakbang
Video: Hakbang sa Kinabukasan (2023 Tanauan City Integrated High School Moving Up and Graduation Song) 2024, Nobyembre
Anonim
Christmas Music Cheer Light
Christmas Music Cheer Light

Maligayang Pasko! Nais mo bang magkaroon ng isang Christmas tree na maaaring makipag-ugnay sa iyo?

Hakbang 1: Mga Bagay na Ginamit sa Project na Ito

Mga bahagi ng hardware

  • Seeeduino V4.2
  • Base Shield V2
  • Grove - Adjustable PIR Motion Sensor
  • Grove - Sensor ng Loudness
  • Grove - WS2813 RGB LED Strip Waterproof - 60 LED / m - 1m

Mga software app at serbisyong online

Arduino IDE

Hakbang 2: Koneksyon sa Hardware

Koneksyon sa Hardware
Koneksyon sa Hardware

Ikonekta ang PIR Sensor, Loudness Sensor at LED strip sa port ng Base Shield na D2, A0 at D6 nang magkahiwalay. Plug Base Shield kay Seeduino, tapos na ang lahat.

Hakbang 3: Programming ng Software

Kailangang mag-install ang mga sumusunod na aklatan bago mag-program, mangyaring i-download at i-import ang mga ito sa iyong Arduino IDE nang manu-mano:

  • Led_Strip
  • MsTimer2
  • Arduino_Vector

Upang mas gawing maikli ang code, na-pack na namin ito. Ang CheerLight class ay ang application class ng proyektong ito.

aplikasyon ng klase:: CheerLight

: pampublikong aplikasyon:: interface:: IApplication {public: void setup (void); walang bisa loop (walang bisa); void setPIRSensorPin (uint8_t pin); void setLoudnessSensorPin (uint8_t pin); walang bisa na panukalaSensor (walang bisa); walang bisa na pagbabagoAnimation (walang bisa * args); walang bisa na ChangeSpeed (walang bisa * args); walang bisa na ChangeColor (walang bisa * args); static application:: CheerLight * getInstance (walang bisa); protektado: driver:: LEDStrip _ledStrip; driver:: PIRSensor _pirSensor; driver:: LoudnessSensor _loudnessSensor; uint8_t _animation; middleware:: Delegate _detectedDelegate; middleware:: Magtalaga ng _absoluteLoudnessDelegate; middleware:: Magtalaga ng _relativeLoudnessDelegate; CheerLight (walang bisa); static application:: CheerLight _instance; };

Ang klase ng CheerLight ay dinisenyo ng Mga Singleton Pattern, na nangangahulugang mayroon lamang isang halimbawa para dito, maaari kang tumawag sa CheerLight:: getInstance () sa pagkakataong iyon. Kung ang koneksyon ng iyong Sensors ay magkakaiba sa Hardware Connection, maaari mong baguhin ang mga ito sa pamamagitan ng pagtawag sa mga pamamaraan ng setPIRSensorPin () at setLoudnessSensorPin ().

Larawan
Larawan

Inirekomenda namin ang paraan ng pagtawag sa mga panukalangSensor () sa timer na makagambala upang gumawa ng mga sensor na sinusukat nang napapanahon, ngunit ang pagtawag sa pagbabago ngAnimasyon (), manu-manong mga pagbabago naSpeed () o mga pamamaraan ng ChangeColor () na manu-mano ay hindi kinakailangan. Tatawagan sila sa pamamagitan ng mga Delegado kapag sinusukat ang mga sensor.

Ano ang isang Delegado?

Tulad ng alam nating lahat, maaari nating ideklara ang isang pointer ng pag-andar at ituro ito sa isang pagpapaandar sa C:

walang bisa func1 (walang bisa);

walang bisa (* pFunc) (walang bisa) = func1;

at gamitin ito upang tawagan ang pagpapaandar na itinuro nito

pFunc ();

Ngunit may mga pagkakaiba sa C ++, kung susubukan mong mag-compile ng sumusunod na code:

klase A {

pampubliko: void func1 (void); }; walang bisa (* pFunc) (walang bisa) = & A:: func1;

ang nag-uulat ay mag-uulat ng isang uri ng error sa conversion, narito ang tamang halimbawa:

walang bisa (A:: * pFunc) (walang bisa) = & A:: func1;

Kapag sinubukan naming gamitin ito upang tawagan ang pamamaraang iyon, muling magkamali. Ang dahilan para sa error na iyon ay ang isang object-method na dapat tawagan ng isang object. Gumagawa kami ng isang object upang tawagan ito:

Isang a;

a. * pFunc ();

This time walang problema. Kaya't mayroong klase ng Delegate sa Delegate.h.

template

class middleware:: Delegate: public middleware:: interface:: IDelegate {public: Delegate (T * object, void (T:: * method) (void *)); walang bisa na pag-uusap (walang bisa * args); protektado: T * _object; walang bisa (T:: * _ paraan) (walang bisa *); }; template inline middleware:: Delegate:: Delegate (T * object, void (T:: * method) (void *)): _object (object), _method (method) {} template inline void middleware:: Delegate:: invoke (void * args) {(_object -> * _ paraan) (args); }

Dahil ang klase ng Delegate ay isang klase ng template, na nangangahulugang ang Delegado ay pagkakaiba sa Delegate, kung paano sila maituro ng pointer na may parehong uri? Ang sagot ay interface, kaya mayroong interface ng IDelegate sa IDelegate.h.

class middleware:: interface:: IDelegate {

pampubliko: virtual void invoke (void * args) = 0; };

Sa klase ng PIR Sensor at Loudness Sensor, mayroong isang variable na pinangalanang _delegates na ginamit upang mag-imbak ng pointer ng Delegates, at mayroong isang pamamaraan na pinangalanang invokeAllDelegates () na ginamit upang ipatawag ang lahat ng mga Delegado sa _delegates, tatawagin ito sa sukat () na pamamaraan.

TANDAAN: Ang mga pamamaraan ng pagdelegado, tulad ng changeAnimation (), changeSpeed () at ChangeColor () ay tatawagan sa timer2 na makagambala, kaya HUWAG gumamit ng pagkaantala () o iba pang pag-andar batay sa nakagambala dito.

Inirerekumendang: