Cuprins:

Lumina de Crăciun pentru muzică de Crăciun: 4 pași
Lumina de Crăciun pentru muzică de Crăciun: 4 pași

Video: Lumina de Crăciun pentru muzică de Crăciun: 4 pași

Video: Lumina de Crăciun pentru muzică de Crăciun: 4 pași
Video: Oana Font - Se deschid vămile iară ❄ 2024, Iulie
Anonim
Crăciun Muzică Cheer Light
Crăciun Muzică Cheer Light

Craciun Fericit! Vrei să ai un pom de Crăciun care să poată interacționa cu tine?

Pasul 1: Lucruri utilizate în acest proiect

Componente hardware

  • Seeeduino V4.2
  • Scutul de bază V2
  • Grove - Senzor de mișcare PIR reglabil
  • Grove - Senzor de sunet
  • Grove - WS2813 RGB LED Strip Waterproof - 60 LED / m - 1m

Aplicații software și servicii online

IDE Arduino

Pasul 2: Conexiune hardware

Conexiune hardware
Conexiune hardware

Conectați senzorul PIR, senzorul de sunet și banda LED la portul D2, A0 și D6 al bazei Shield. Conectați Scutul de bază la Seeduino, gata.

Pasul 3: Programare software

Bibliotecile care urmează trebuie instalate înainte de programare, vă rugăm să le descărcați și să le importați manual în ID-ul dvs. Arduino:

  • Led_Strip
  • MsTimer2
  • Arduino_Vector

Pentru a face codul mai concis, l-am ambalat. Clasa CheerLight este clasa de aplicație a acestui proiect.

aplicație de clasă:: CheerLight

: public application:: interface:: IApplication {public: void setup (void); bucla de gol (nul); void setPIRSensorPin (pin uint8_t); void setLoudnessSensorPin (uint8_t pin); void measureSensors (nul); void changeAnimation (void * args); void changeSpeed (void * args); void changeColor (void * args); aplicație statică:: CheerLight * getInstance (nul); protejat: driver:: LEDStrip _ledStrip; driver:: PIRSensor _pirSensor; driver:: LoudnessSensor _loudnessSensor; uint8_t _animare; middleware:: Delegate _detectedDelegate; middleware:: Delegate _absoluteLoudnessDelegate; middleware:: Delegate _relativeLoudnessDelegate; CheerLight (nul); aplicație statică:: CheerLight _instance; };

Clasa CheerLight a fost proiectată de Singleton Patterns, ceea ce înseamnă că există o singură instanță pentru aceasta, puteți apela CheerLight:: getInstance () la acea instanță. Dacă conexiunea senzorilor dvs. diferă de conexiunea hardware, le puteți schimba apelând metodele setPIRSensorPin () și setLoudnessSensorPin ().

Imagine
Imagine

Vă recomandăm să apelați metoda MeasureSensors () în întreruperea temporizatorului pentru a face senzorii măsurați în timp util, dar apelarea manuală a metodelor changeAnimation (), changeSpeed () sau changeColor () nu este necesară. Acestea vor fi apelate prin delegați atunci când senzorii sunt măsurați.

Ce este un delegat?

După cum știm cu toții, putem declara un indicator de funcție și îl putem face să indice o funcție în C:

void func1 (void);

void (* pFunc) (void) = func1;

și folosiți-l pentru a apela funcția către care a arătat

pFunc ();

Dar există diferențe în C ++, dacă încercați să compilați codul următor:

clasa a {

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

compilatorul va raporta o eroare de conversie de tip, iată exemplul potrivit:

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

Când încercăm să o folosim pentru a apela metoda respectivă, greșim din nou. Motivul acestei erori este că o metodă obiect trebuie să fie apelată de un obiect. Deci, creăm un obiect pentru a-l numi:

A a;

a. * pFunc ();

De data aceasta nicio problemă. Deci, există clasa Delegate în Delegate.h.

șablon

middleware de clasă:: Delegate: middleware public:: interfață:: IDelegate {public: Delegate (obiect T *, void (metoda T:: *) (void *)); void invoke (void * args); protejat: T * _obiect; void (metoda T:: * _) (void *); }; middleware șablon inline:: Delegat:: Delegat (obiect T *, nul (metoda T:: *) (void *)): _object (obiect), _metodă (metodă) {} șablon inline nul middleware:: Delegat:: invocă (void * args) {(_object -> * _ method) (args); }

Deoarece clasa delegat este o clasă șablon, ceea ce înseamnă că delegatul este diferența față de delegat, cum să le faci să fie îndreptate prin pointer să aibă același tip? Răspunsul este interfață, deci există o interfață IDelegate în IDelegate.h.

middleware de clasă:: interfață:: IDelegate {

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

În clasa PIR Sensor și Loudness Sensor, există o variabilă numită _delegates folosită pentru a stoca pointerul delegaților și există o metodă numită invokeAllDelegates () utilizată pentru a invoca toți delegații din _delegates, va fi numită metoda măsură ().

NOTĂ: metodele de delegare, cum ar fi changeAnimation (), changeSpeed () și changeColor () vor fi apelate în întreruperea timer2, deci NU utilizați delay () sau altă funcție bazată pe întreruperi în ea.

Recomandat: