Სარჩევი:

საშობაო მუსიკა Cheer Light: 4 ნაბიჯი
საშობაო მუსიკა Cheer Light: 4 ნაბიჯი

ვიდეო: საშობაო მუსიკა Cheer Light: 4 ნაბიჯი

ვიდეო: საშობაო მუსიკა Cheer Light: 4 ნაბიჯი
ვიდეო: Mariah Carey - All I Want for Christmas Is You (Make My Wish Come True Edition) 2024, ნოემბერი
Anonim
საშობაო მუსიკა Cheer Light
საშობაო მუსიკა Cheer Light

Შობას გილოცავთ! გსურთ გქონდეთ ნაძვის ხე, რომელსაც შეუძლია თქვენთან ურთიერთობა?

ნაბიჯი 1: ნივთები, რომლებიც გამოიყენება ამ პროექტში

აპარატურის კომპონენტები

  • Seeeduino V4.2
  • ბაზის ფარი V2
  • გროვი - რეგულირებადი PIR მოძრაობის სენსორი
  • გროვი - ხმამაღალი სენსორი
  • Grove - WS2813 RGB LED Strip წყალგაუმტარი - 60 LED/m - 1 მ

პროგრამული უზრუნველყოფის პროგრამები და ონლაინ სერვისები

Arduino IDE

ნაბიჯი 2: აპარატურის კავშირი

აპარატურის კავშირი
აპარატურის კავშირი

ცალკე დაუკავშირეთ PIR სენსორი, ხმამაღალი სენსორი და LED ზოლები ბაზის ფარის პორტში D2, A0 და D6. შეაერთეთ ბაზის ფარი Seeduino– ში, ყველაფერი დასრულებულია.

ნაბიჯი 3: პროგრამული უზრუნველყოფის პროგრამირება

ქვემოთ ჩამოთვლილი ბიბლიოთეკები უნდა დაინსტალირდეს პროგრამირებამდე, გთხოვთ გადმოწეროთ და შეიტანოთ ისინი თქვენს Arduino IDE– ში ხელით:

  • Led_Strip
  • MsTimer2
  • არდუინო_ვექტორი

იმისათვის, რომ კოდი იყოს უფრო ლაკონური, ჩვენ შეფუთული გვაქვს. CheerLight კლასი არის ამ პროექტის აპლიკაციის კლასი.

კლასის აპლიკაცია:: CheerLight

: public application:: interface:: IApplication {public: void setup (void); ბათილი მარყუჟი (ბათილია); void setPIRSensorPin (uint8_t pin); void setLoudnessSensorPin (uint8_t pin); ბათილი ღონისძიება სენსორები (ბათილია); void change ანიმაცია (void * args); void changeSpeed (void * args); void changeColor (void * 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 () იმ ინსტანციისთვის. თუ თქვენი სენსორების კავშირი განსხვავდება აპარატურასთან, შეგიძლიათ შეცვალოთ ისინი setPIRSensorPin () და setLoudnessSensorPin () მეთოდების გამოძახებით.

გამოსახულება
გამოსახულება

ჩვენ გირჩევთ ქრონომეტრის შეფერხების ღონისძიება სენსორების გაზომვისას მათ დელეგატების საშუალებით დაურეკავთ.

რა არის დელეგატი?

როგორც ყველამ ვიცით, ჩვენ შეგვიძლია გამოვაცხადოთ ფუნქციის მაჩვენებელი და დავანიშნოთ ის ფუნქციაზე C:

void func1 (ბათილია);

void (*pFunc) (void) = func1;

და გამოიყენეთ იგი იმ ფუნქციის გამოსაძახებლად, რომელზეც ის მიუთითებდა

pFunc ();

მაგრამ არსებობს განსხვავებები C ++ - ში, თუ თქვენ ცდილობთ შეადგინოთ კოდი ქვემოთ:

კლასი A {

საჯარო: void func1 (void); }; void (*pFunc) (void) = & A:: func1;

შემდგენელი გამოაქვეყნებს ტიპის კონვერტაციის შეცდომას, აქ არის სწორი მაგალითი:

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

როდესაც ჩვენ ვცდილობთ გამოვიყენოთ ის ამ მეთოდის გამოსაძახებლად, შეცდომა კვლავ ხდება. ამ შეცდომის მიზეზი ის არის, რომ ობიექტი-მეთოდი უნდა იყოს გამოძახებული ობიექტის მიერ. ჩვენ ვქმნით ობიექტს, რომელსაც უნდა ვუწოდოთ:

Აა;

a.*pFunc ();

ამჯერად პრობლემა არ არის. ასე რომ, არსებობს დელეგატის კლასი Delegate.h.

შაბლონი

კლასის middleware:: დელეგატი: public middleware:: ინტერფეისი:: IDelegate {საჯარო: დელეგატი (T *ობიექტი, ბათილი (T:: *მეთოდი) (ბათილია *)); void invoke (void * args); დაცულია: T * _ ობიექტი; სიცარიელე (T:: *_ მეთოდი) (ბათილია *); }; შაბლონი inline middleware:: დელეგირება:: დელეგირება (T *ობიექტი, ბათილი (T:: *მეთოდი) (ბათილია *)): _ ობიექტი (ობიექტი), _ მეთოდი (მეთოდი) {} შაბლონი inline void middleware:: Delegate:: invoke (void * args) {(_ ობიექტი-> * _ მეთოდი) (args); }

იმის გამო, რომ დელეგატის კლასი არის შაბლონური კლასი, რაც ნიშნავს დელეგატი არის განსხვავება დელეგატთან, როგორ ვაქციოთ ისინი მაჩვენებლით იყოს იგივე ტიპის? პასუხი არის ინტერფეისი, ამიტომ არის IDelegate ინტერფეისი IDelegate.h- ში.

კლასის middleware:: ინტერფეისი:: IDelegate {

საჯარო: ვირტუალური სიცარიელის გამოძახება (ბათილად * args) = 0; };

PIR სენსორისა და ხმამაღალი სენსორის კლასში არის ცვლადი სახელწოდებით _ დელეგატები, რომლებიც გამოიყენება დელეგატების მაჩვენებლის შესანახად და აქვს მეთოდი სახელად invokeAllDelegates (), რომელიც გამოიყენება დელეგატების ყველა დელეგატის გამოსაძახებლად, მას უწოდებენ ღონისძიების () მეთოდს.

შენიშვნა: დელეგირების მეთოდები, როგორიცაა changeAnimation (), changeSpeed () და changeColor () გამოიძახება timer2 interrupt- ში, ასე რომ არ გამოიყენოთ დაგვიანებით () ან სხვა შეფერხებაზე დაფუძნებული ფუნქცია.

გირჩევთ: