Sisällysluettelo:

Joulumusiikin piristysvalo: 4 vaihetta
Joulumusiikin piristysvalo: 4 vaihetta

Video: Joulumusiikin piristysvalo: 4 vaihetta

Video: Joulumusiikin piristysvalo: 4 vaihetta
Video: Rauhallinen klassinen joulumusiikkipiano, rentouttava joulumusiikki työskentelyyn, nukkumiseen 2024, Marraskuu
Anonim
Joulun musiikki Cheer Light
Joulun musiikki Cheer Light

Hyvää joulua! Haluatko joulukuusi, joka voi olla vuorovaikutuksessa kanssasi?

Vaihe 1: Tässä projektissa käytetyt asiat

Laitteiston osat

  • Seeeduino V4.2
  • Pohjakilpi V2
  • Grove - Säädettävä PIR -liiketunnistin
  • Grove - Loudness -anturi
  • Grove - WS2813 RGB LED -nauha Vedenpitävä - 60 LED/m - 1 m

Ohjelmistosovellukset ja verkkopalvelut

Arduino IDE

Vaihe 2: Laitteistoyhteys

Laitteistoyhteys
Laitteistoyhteys

Liitä PIR -anturi, voimakkuusanturi ja LED -nauha Base Shieldin portteihin D2, A0 ja D6 erikseen. Liitä Base Shield Seeduinoon, kaikki tehty.

Vaihe 3: Ohjelmointi

Seuraavat kirjastot on asennettava ennen ohjelmointia, lataa ja tuo ne Arduino IDE -laitteeseen manuaalisesti:

  • LED-nauha
  • MsTimer2
  • Arduino_Vektori

Jotta koodi olisi lyhyempi, olemme pakanneet sen. CheerLight -luokka on tämän projektin sovellusluokka.

luokkasovellus:: CheerLight

: julkinen sovellus:: käyttöliittymä:: IApplication {public: void setup (void); tyhjä silmukka (tyhjä); mitätön setPIRSensorPin (nasta uint8_t); void setLoudnessSensorPin (uint8_t -nasta); mitätön mittausanturit (mitätön); void changeAnimation (void * args); void changeSpeed (void * args); void changeColor (void * args); staattinen sovellus:: CheerLight * getInstance (mitätön); suojattu: kuljettaja:: LEDStrip _ledStrip; ohjain:: PIRSensor _pirSensor; ohjain:: LoudnessSensor _loudnessSensor; uint8_t _animaatio; väliohjelmisto:: Delegoi _detectedDelegate; väliohjelmisto:: Delegoi _absoluteLoudnessDelegate; väliohjelmisto:: Delegoi _relativeLoudnessDelegate; CheerLight (mitätön); staattinen sovellus:: CheerLight _instance; };

CheerLight -luokan on suunnitellut Singleton Patterns, mikä tarkoittaa, että sille on vain yksi esiintymä. Voit kutsua CheerLight:: getInstance () tähän tapaukseen. Jos anturien yhteys eroaa laitteistoyhteydestä, voit muuttaa niitä kutsumalla setPIRSensorPin () - ja setLoudnessSensorPin () -menetelmiä.

Kuva
Kuva

Suosittelemme kutsumaan meetSensors () -menetelmää ajastimessa keskeyttämään, jotta anturit mitataan ajoissa, mutta changeAnimation () -, changeSpeed () - tai changeColor () -menetelmiä ei tarvita manuaalisesti. Heille soitetaan edustajien kautta, kun antureita mitataan.

Mikä on valtuutettu?

Kuten me kaikki tiedämme, voimme julistaa funktio -osoittimen ja asettaa sen osoittamaan funktion C: ssä:

void func1 (mitätön);

mitätön (*pFunc) (mitätön) = func1;

ja käytä sitä kutsuaksesi toiminnon, johon se viittasi

pFunc ();

Mutta C ++: ssa on eroja, jos yrität koota seuraavan koodin:

luokka A {

julkinen: void func1 (mitätön); }; void (*pFunc) (void) = & A:: func1;

kääntäjä ilmoittaa tyyppimuunnosvirheen, tässä on oikea esimerkki:

mitätön (A::*pFunc) (mitätön) = & A:: func1;

Kun yritämme käyttää sitä kutsumaan tätä menetelmää, virhe toistuu. Syy tähän virheeseen on, että objektin on kutsuttava objektimenetelmä. Luomme siis objektin kutsumaan sitä:

A a;

a.*pFunc ();

Tällä kertaa ei ongelmaa. Joten Delegate -luokassa on Delegate -luokka. H.

sapluuna

luokan väliohjelmisto:: Delegoi: julkinen väliohjelmisto:: käyttöliittymä:: IDelegate {public: Delegate (T *object, void (T:: *method) (void *)); void invoke (void * args); suojattu: T * _objekti; mitätön (T:: *_ menetelmä) (mitätön *); }; malli sisäinen väliohjelmisto:: Delegoi:: Delegoi (T *objekti, mitätön (T:: *menetelmä) (void *)): _objekti (objekti), _metodi (menetelmä) {} malli inline void väliohjelma:: Delegoi:: kutsu (void * args) {(_objekti-> * _ menetelmä) (args); }

Koska Delegate -luokka on malliluokka, mikä tarkoittaa, että Delegate on ero Delegate -ryhmään, kuinka saada heidät osoittamaan osoittimella saman tyyppisiä? Vastaus on käyttöliittymä, joten IDelegate -käyttöliittymä on IDelegate.h -sivustossa.

luokan väliohjelmisto:: käyttöliittymä:: IDelegate {

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

PIR -anturin ja Loudness -anturin luokassa on muuttuja nimeltä _delegates, jota käytetään delegaattien osoittimen tallentamiseen, ja on olemassa menetelmä nimeltä invokeAllDelegates (), jota käytetään kutsumaan kaikki _delegates -edustajat, sitä kutsutaan mitta () -menetelmäksi.

HUOMAUTUS: Delegoida menetelmiä, kuten changeAnimation (), changeSpeed () ja changeColor (), kutsutaan timer2 keskeytyksessä, joten ÄLÄ käytä viivettä () tai muita keskeytyspohjaisia toimintoja siinä.

Suositeltava: