Բովանդակություն:

Սուրբ Christmasննդյան երաժշտություն Ուրախ լույս. 4 քայլ
Սուրբ Christmasննդյան երաժշտություն Ուրախ լույս. 4 քայլ

Video: Սուրբ Christmasննդյան երաժշտություն Ուրախ լույս. 4 քայլ

Video: Սուրբ Christmasննդյան երաժշտություն Ուրախ լույս. 4 քայլ
Video: Գեղեցիկ խոսքեր 2024, Նոյեմբեր
Anonim
Սուրբ Christmasննդյան երաժշտություն Ուրախ լույս
Սուրբ Christmasննդյան երաժշտություն Ուրախ լույս

Շնորհավոր Սուրբ Ծնունդ! Անկանու՞մ եք ունենալ տոնածառ, որը կարող է շփվել ձեզ հետ:

Քայլ 1: Այս նախագծում օգտագործվող բաները

Սարքավորման բաղադրիչներ

  • Seeeduino V4.2
  • Base Shield V2
  • Grove - կարգավորելի PIR շարժման ցուցիչ
  • Grove - Բարձրության սենսոր
  • Grove - WS2813 RGB LED Strip Անջրանցիկ - 60 LED/մ - 1 մ

Softwareրագրային ապահովման ծրագրեր և առցանց ծառայություններ

Arduino IDE

Քայլ 2: Սարքաշարի միացում

Սարքաշարի միացում
Սարքաշարի միացում

Միացրեք PIR տվիչը, բարձրության տվիչը և LED ժապավենը Base Shield- ի D2, A0 և D6 նավահանգստին առանձին: Միացրեք Base Shield- ը Seeduino- ին, ամեն ինչ արված է:

Քայլ 3: Softwareրագրային ապահովման ծրագրավորում

Followingրագրավորումից առաջ անհրաժեշտ է տեղադրել ներքևում գտնվող գրադարանները: Խնդրում ենք դրանք ներբեռնել և ձեռքով ներմուծել ձեր Arduino IDE:

  • Led_Strip
  • MsTimer2
  • Arduino_Vector

Կոդը ավելի հակիրճ դարձնելու համար մենք փաթեթավորել ենք այն: CheerLight դասը այս ծրագրի կիրառման դասն է:

դասի կիրառում:: CheerLight

: public application:: interface:: IApplication {public: void setup (void); դատարկ հանգույց (դատարկ); անվավեր setPIRSensorPin (uint8_t pin); void setLoudnessSensorPin (uint8_t քորոց); դատարկությունՍենսորներ (անվավեր); void changeAnimation (դատարկ * args); void changeSpeed (դատարկ * args); void changeColor (դատարկ * args); ստատիկ կիրառում:: CheerLight * getInstance (անվավեր); պաշտպանված ՝ վարորդ:: LEDStrip _ledStrip; վարորդ:: PIRSensor _pirSensor; վարորդ:: LoudnessSensor _loudnessSensor; uint8_t _իմիմացիա; middleware:: Delegate _detectedDelegate; middleware:: Delegate _absoluteLoudnessDelegate; middleware:: Delegate _relativeLoudnessDelegate; CheerLight (անվավեր); ստատիկ կիրառում:: CheerLight _instance; };

CheerLight դասը նախագծվել է Singleton Patterns- ի կողմից, ինչը նշանակում է, որ դրա համար կա միայն մեկ օրինակ, այդ օրինակին կարող եք զանգահարել CheerLight:: getInstance (): Եթե ձեր Սենսորների կապը տարբերվում է Hardware Connection- ից, կարող եք դրանք փոխել ՝ զանգահարելով setPIRSensorPin () և setLoudnessSensorPin () մեթոդներին:

Պատկեր
Պատկեր

Մենք խորհուրդ ենք տալիս timeSensors () մեթոդը ժամանակաչափի մեջ դնել `սենսորները ժամանակին չափելու համար, սակայն ձեռքով զանգահարել changeAnimation (), changeSpeed () կամ changeColor () մեթոդներին: Երբ սենսորները չափվեն, դրանք կզանգահարվեն պատվիրակների միջոցով:

Ի՞նչ է պատվիրակը:

Ինչպես բոլորս գիտենք, մենք կարող ենք հայտարարել ֆունկցիայի ցուցիչ և այն մատնանշել C- ում գործառույթի վրա.

դատարկ func1 (դատարկ);

դատարկ (*pFunc) (դատարկ) = func1;

և օգտագործել այն `նշելու այն գործառույթը, որին մատնանշել է

pFunc ();

Բայց կան տարբերություններ C ++ - ում, եթե փորձեք կազմել ներքևում նշված կոդը.

դաս A {

հրապարակային ՝ void func1 (void); }; դատարկ (*pFunc) (դատարկ) = & A:: func1;

կազմողը կհաղորդի տիպի փոխակերպման սխալի մասին, ահա ճիշտ օրինակը.

դատարկ (A::*pFunc) (դատարկ) = & A:: func1;

Երբ փորձում ենք օգտագործել այն այդ մեթոդը կանչելու համար, նորից սխալ: Այդ սխալի պատճառն այն է, որ օբյեկտ-մեթոդը պետք է կոչվի օբյեկտի կողմից: Այսպիսով, մենք ստեղծում ենք մի օբյեկտ, որը կոչում ենք այն.

Ա ա;

ա.*pFunc ();

Այս անգամ խնդիր չկա: Այսպիսով, Delegate.h- ում կա Delegate դասարան:

կաղապար

class middleware:: Delegate: public middleware:: interface:: IDelegate {public: Delegate (T *object, void (T:: *method) (void *)); դատարկ անվանել (դատարկ * args); պաշտպանված ՝ T * _ օբյեկտ; դատարկ (T:: *_ մեթոդ) (անվավեր *); }; կաղապար inline middleware:: Delegate:: Delegate (T *object, void (T:: *method) (void *)): _object (object), _method (method) {} template inline void middleware:: Delegate:: invoke (դատարկ * args) {(_object-> * _ մեթոդը) (args); }

Քանի որ պատվիրակի դասը կաղապարային դաս է, ինչը նշանակում է, որ պատվիրակը տարբերություն է պատվիրակի նկատմամբ, ինչպե՞ս անել, որ դրանք սլաքով նշվեն նույն տիպի: Պատասխանը ինտերֆեյս է, ուստի IDelegate.h- ում կա IDelegate ինտերֆեյս:

class middleware:: interface:: IDelegate {

հրապարակային ՝ վիրտուալ դատարկության կանչ (դատարկ * args) = 0; };

PIR Sensor- ի և Loudness Sensor- ի դասում կա _ պատվիրակներ անունով փոփոխական, որն օգտագործվում է պատվիրակների ցուցիչը պահելու համար, և կա invokeAllDelegates () անունով մեթոդ, որն օգտագործվում է _ պատվիրակների բոլոր պատվիրակներին կանչելու համար, այն կոչվելու է չափման () մեթոդ:

Ո NOTՇԱԴՐՈԹՅՈՆ. Պատվիրակելու մեթոդներ, ինչպիսիք են changeAnimation (), changeSpeed () և changeColor (), կանչվելու են timer2 ընդհատման մեջ, այնպես որ մի օգտագործեք հետաձգում () կամ այլ ընդհատումների վրա հիմնված գործառույթ:

Խորհուրդ ենք տալիս: