Sisällysluettelo:
2025 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2025-01-13 06:57
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
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ä.
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ä.