Turinys:

Kalėdų muzikos džiaugsmo šviesa: 4 žingsniai
Kalėdų muzikos džiaugsmo šviesa: 4 žingsniai

Video: Kalėdų muzikos džiaugsmo šviesa: 4 žingsniai

Video: Kalėdų muzikos džiaugsmo šviesa: 4 žingsniai
Video: Записки дурнушки_Рассказ_Слушать 2024, Lapkritis
Anonim
Kalėdų muzikos linksmybių šviesa
Kalėdų muzikos linksmybių šviesa

Linksmų Kalėdų! Ar norite turėti Kalėdų eglutę, kuri galėtų su jumis bendrauti?

1 žingsnis: šiame projekte naudojami dalykai

Techninės įrangos komponentai

  • Seeeduino V4.2
  • Pagrindo skydas V2
  • Grove - reguliuojamas PIR judesio jutiklis
  • Grove - garsumo jutiklis
  • Grove - WS2813 RGB LED juostelė Atsparus vandeniui - 60 LED/m - 1 m

Programinės įrangos programos ir internetinės paslaugos

„Arduino IDE“

2 žingsnis: aparatinės įrangos prijungimas

Techninės įrangos ryšys
Techninės įrangos ryšys

Prijunkite PIR jutiklį, garsumo jutiklį ir LED juostelę prie „Base Shield“jungties D2, A0 ir D6 atskirai. Prijunkite „Base Shield“prie „Seeduino“, viskas padaryta.

3 žingsnis: programinės įrangos programavimas

Toliau pateiktas bibliotekas reikia įdiegti prieš programavimą, atsisiųskite ir importuokite jas į „Arduino IDE“rankiniu būdu:

  • Led_Strip
  • MsTimer2
  • Arduino_Vektorius

Kad kodas būtų glaustesnis, mes jį supakavome. „CheerLight“klasė yra šio projekto taikymo klasė.

klasės taikymas:: „CheerLight“

: viešoji programa:: sąsaja:: IApplication {public: void setup (void); tuštumos kilpa (void); void setPIRSensorPin (uint8_t kaištis); void setLoudnessSensorPin (uint8_t kaištis); niekinė priemonėJutikliai (negalioja); void changeAnimation (void * args); void changeSpeed (void * args); void changeColor (void * args); statinė programa:: „CheerLight“* getInstance (negalioja); apsaugota: tvarkyklė:: LEDStrip _ledStrip; vairuotojas:: PIRSensor _pirSensor; vairuotojas:: LoudnessSensor _loudnessSensor; uint8_t _animacija; tarpinė programinė įranga:: Delegate _detectedDelegate; tarpinė programinė įranga:: Deleguoti _absoluteLoudnessDelegate; tarpinė programinė įranga:: Delegate _relativeLoudnessDelegate; „CheerLight“(negalioja); statinė programa:: CheerLight _instance; };

„CheerLight“klasę sukūrė „Singleton Patterns“, o tai reiškia, kad yra tik vienas egzempliorius, į tą egzempliorių galite paskambinti „CheerLight:: getInstance ()“. Jei jūsų jutiklių ryšys skiriasi nuo aparatinės įrangos ryšio, galite juos pakeisti paskambinę setPIRSensorPin () ir setLoudnessSensorPin () metodais.

Vaizdas
Vaizdas

Mes rekomenduojame iškviesti laikmačio metodą meetSensors (), kad jutikliai būtų išmatuoti laiku, tačiau skambinti changeAnimation (), changeSpeed () arba changeColor () metodai rankiniu būdu nėra būtini. Jie bus iškviesti per delegatus, kai bus išmatuoti jutikliai.

Kas yra Delegatas?

Kaip visi žinome, mes galime paskelbti funkcijų žymeklį ir nukreipti jį į funkciją C:

void func1 (negalioja);

void (*pFunc) (void) = func1;

ir naudokite jį, kad iškviestumėte funkciją, kurią nurodė

pFunc ();

Tačiau C ++ yra skirtumų, jei bandysite sudaryti kodą taip:

A klasė {

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

kompiliatorius praneš apie tipo konversijos klaidą, čia yra tinkamas pavyzdys:

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

Kai bandome jį naudoti tam metodui iškviesti, vėl klaida. Šios klaidos priežastis yra ta, kad objektas-metodas turi būti iškviestas objektu. Taigi mes sukuriame objektą, kurį pavadinsime:

A a;

a.*pFunc ();

Šį kartą jokių problemų. Taigi Delegate klasėje yra Delegate.h.

šabloną

klasės tarpinė programinė įranga:: Deleguoti: viešoji tarpinė programinė įranga:: sąsaja:: IDelegate {public: Delegate (T *objektas, negaliojantis (T:: *metodas) (void *)); void invoke (void * args); apsaugotas: T * _objektas; void (T:: *_ metodas) (void *); }; šablono vidinė tarpinė programinė įranga:: Deleguoti:: Deleguoti (T *objektas, negaliojantis (T:: *metodas) (negaliojantis *)): _objektas (objektas), _metodas (metodas) {} šablonas inline void tarpinė programa:: Deleguoti:: invoke (void * args) {(_objektas-> * _ metodas) (args); }

Kadangi „Delegate“klasė yra šablonų klasė, o tai reiškia, kad „Delegate“yra skirtumas tarp „Delegate“, kaip padaryti, kad juos nurodytų rodyklė, būtų tokio paties tipo? Atsakymas yra sąsaja, todėl IDelegate.h yra IDelegate sąsaja.

klasės tarpinė programa:: sąsaja:: IDelegate {

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

PIR jutiklio ir garsumo jutiklio klasėje yra kintamasis, pavadintas _delegates, naudojamas delegatų rodyklės saugojimui, ir yra metodas, vadinamas invokeAllDelegates (), naudojamas iškviesti visus delegatus _delegates, jis bus vadinamas mato () metodu.

PASTABA: Deleguoti metodus, tokius kaip changeAnimation (), changeSpeed () ir changeColor (), bus iškviesti timer2 interrupt, todėl NENAUDOKITE jame delay () ar kitos pertraukimu pagrįstos funkcijos.

Rekomenduojamas: