Satura rādītājs:

Ziemassvētku mūzikas uzmundrināšanas gaisma: 4 soļi
Ziemassvētku mūzikas uzmundrināšanas gaisma: 4 soļi

Video: Ziemassvētku mūzikas uzmundrināšanas gaisma: 4 soļi

Video: Ziemassvētku mūzikas uzmundrināšanas gaisma: 4 soļi
Video: Ziemassvētku briedis - ZIEMASSVĒTnieKI 2024, Novembris
Anonim
Ziemassvētku mūzikas uzmundrināšanas gaisma
Ziemassvētku mūzikas uzmundrināšanas gaisma

Priecīgus Ziemassvētkus! Vai vēlaties, lai Ziemassvētku eglīte varētu ar jums mijiedarboties?

1. darbība. Šajā projektā izmantotās lietas

Aparatūras komponenti

  • Seeeduino V4.2
  • Bāzes vairogs V2
  • Grove - regulējams PIR kustības sensors
  • Grove - skaļuma sensors
  • Grove - WS2813 RGB LED sloksne Ūdensizturīga - 60 LED/m - 1 m

Programmatūras lietotnes un tiešsaistes pakalpojumi

Arduino IDE

2. darbība. Aparatūras savienojums

Aparatūras savienojums
Aparatūras savienojums

Pievienojiet PIR sensoru, skaļuma sensoru un LED sloksni atsevišķi Base Shield ligzdai D2, A0 un D6. Pievienojiet bāzes vairogu Seeduino, viss ir izdarīts.

3. solis: programmatūras programmēšana

Tālāk norādītajām bibliotēkām ir jāinstalē pirms programmēšanas, lūdzu, lejupielādējiet un importējiet tās savā Arduino IDE manuāli:

  • Led_Strip
  • MsTimer2
  • Arduino_Vector

Lai kods būtu kodolīgāks, mēs to esam iesaiņojuši. CheerLight klase ir šī projekta pielietojuma klase.

klases pieteikums:: CheerLight

: publiska lietojumprogramma:: saskarne:: IApplication {public: void setup (void); tukša cilpa (tukša); void setPIRSensorPin (taustiņš uint8_t); void setLoudnessSensorPin (uint8_t pin); anulēts pasākumsSensors (anulēts); void changeAnimation (void * args); void changeSpeed (void * args); void changeColor (void * args); statiska lietojumprogramma:: CheerLight * getInstance (anulēts); aizsargāts: draiveris:: LEDStrip _ledStrip; vadītājs:: PIRSensor _pirSensor; draiveris:: LoudnessSensor _loudnessSensor; uint8_t _animācija; starpprogrammatūra:: Deleģēt _detectedDelegate; starpprogrammatūra:: Deleģēt _absoluteLoudnessDelegate; starpprogrammatūra:: Deleģēt _relativeLoudnessDelegate; CheerLight (tukšs); statiska lietojumprogramma:: CheerLight _instance; };

CheerLight klasi izstrādāja Singleton Patterns, kas nozīmē, ka tam ir tikai viens gadījums, uz šo gadījumu varat izsaukt CheerLight:: getInstance (). Ja jūsu sensoru savienojums atšķiras no aparatūras savienojuma, varat tos mainīt, izsaucot metodes setPIRSensorPin () un setLoudnessSensorPin ().

Attēls
Attēls

Mēs iesakām izsaukt metodi meetSensors (), lai taimeris pārtrauktu, lai sensori tiktu mērīti savlaicīgi, bet izsaucot changeAnimation (), changeSpeed () vai changeColor () metodes manuāli nav nepieciešamas. Mērot sensorus, viņi tiks izsaukti, izmantojot delegātus.

Kas ir delegāts?

Kā mēs visi zinām, mēs varam deklarēt funkciju rādītāju un likt tam norādīt uz funkciju C:

void func1 (anulēts);

tukšs (*pFunc) (tukšs) = func1;

un izmantojiet to, lai izsauktu funkciju, uz kuru tas norādīja

pFunc ();

Bet C ++ ir atšķirības, ja mēģināt apkopot kodu šādi:

A klase {

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

kompilators ziņos par tipa pārveidošanas kļūdu, šeit ir īstais piemērs:

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

Mēģinot to izmantot, lai izsauktu šo metodi, atkal rodas kļūda. Šīs kļūdas iemesls ir tāds, ka objektam ir jāizsauc objekta metode. Tātad mēs izveidojam objektu, lai to sauktu:

A a;

a.*pFunc ();

Šoreiz nekādu problēmu. Tātad Delegate.h ir Delegate klase.

veidne

klases starpprogrammatūra:: Deleģēt: publiska starpprogrammatūra:: interfeiss:: IDelegate {public: Delegate (T *objekts, anulēts (T:: *metode) (void *)); void invoke (void * args); aizsargāts: T * _objekts; void (T:: *_ metode) (void *); }; veidne inline starpprogrammatūra:: Deleģēt:: Deleģēt (T *objekts, anulēts (T:: *metode) (void *)): _objekts (objekts), _metode (metode) {} veidne inline void starpprogrammatūra:: Deleģēt:: izsaukt (void * args) {(_objekts-> * _ metode) (args); }

Tā kā delegātu klase ir veidņu klase, kas nozīmē, ka delegāts ir atšķirība no delegāta, kā padarīt tos norādītus ar rādītāju vienāda veida? Atbilde ir interfeiss, tāpēc IDelegate.h ir IDelegate interfeiss.

klases starpprogrammatūra:: interfeiss:: IDelegate {

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

PIR sensora un skaļuma sensora klasē ir mainīgais ar nosaukumu _delegates, ko izmanto, lai saglabātu delegātu rādītāju, un ir metode ar nosaukumu invokeAllDelegates (), ko izmanto, lai izsauktu visus delegātus _delegates, tā tiks saukta par meet () metodi.

PIEZĪME. Deleģēšanas metodes, piemēram, changeAnimation (), changeSpeed () un changeColor (), tiks izsauktas taimera 2 pārtraukumā, tāpēc NELIETOJIET tajā kavēšanos () vai citu uz pārtraukšanu balstītu funkciju.

Ieteicams: