Indholdsfortegnelse:

Christmas Music Cheer Light: 4 trin
Christmas Music Cheer Light: 4 trin

Video: Christmas Music Cheer Light: 4 trin

Video: Christmas Music Cheer Light: 4 trin
Video: Train - Shake Up Christmas (Official Video) 2024, November
Anonim
Julemusik Cheer Light
Julemusik Cheer Light

Glædelig jul! Vil du have et juletræ, der kan interagere med dig?

Trin 1: Ting, der bruges i dette projekt

Hardware komponenter

  • Seeeduino V4.2
  • Base Shield V2
  • Grove - Justerbar PIR -bevægelsessensor
  • Grove - Loudness Sensor
  • Grove - WS2813 RGB LED Strip Vandtæt - 60 LED/m - 1m

Software -apps og onlinetjenester

Arduino IDE

Trin 2: Hardwareforbindelse

Hardwareforbindelse
Hardwareforbindelse

Tilslut PIR -sensor, lydstyrkesensor og LED -strimmel separat til Base Shields port D2, A0 og D6. Sæt Base Shield til Seeduino, alt færdigt.

Trin 3: Software programmering

Bibliotekerne, der følger ned, skal installeres før programmering. Download og importer dem manuelt til din Arduino IDE:

  • Led_Strip
  • MsTimer2
  • Arduino_Vektor

For at gøre koden mere kortfattet, har vi pakket den. CheerLight -klassen er applikationsklassen for dette projekt.

klasse applikation:: CheerLight

: public application:: interface:: IApplication {public: void setup (void); void loop (void); void setPIRSensorPin (uint8_t pin); void setLoudnessSensorPin (uint8_t pin); void measureSensors (void); void changeAnimation (void * args); void changeSpeed (void * args); void changeColor (void * args); statisk applikation:: CheerLight * getInstance (void); beskyttet: driver:: LEDStrip _ledStrip; driver:: PIRSensor _pirSensor; driver:: LoudnessSensor _loudnessSensor; uint8_t _animation; middleware:: Delegate _detectedDelegate; middleware:: Delegate _absoluteLoudnessDelegate; middleware:: Delegate _relativeLoudnessDelegate; CheerLight (tomrum); statisk applikation:: CheerLight _instance; };

CheerLight -klassen blev designet af Singleton Patterns, hvilket betyder, at der kun er én forekomst til den, du kan kalde CheerLight:: getInstance () til den forekomst. Hvis dine sensorers forbindelse er forskellig fra hardware -forbindelse, kan du ændre dem ved at kalde setPIRSensorPin () og setLoudnessSensorPin () -metoder.

Billede
Billede

Vi anbefaler, at man kalder MeasureSensors () -metoden i timerafbrydelse for at få sensorer målt rettidigt, men manuelt er det ikke nødvendigt at kalde changeAnimation (), ChangeSpeed () eller ChangeColor () -metoder. De vil blive kaldt via delegerede, når sensorer måles.

Hvad er en delegeret?

Som vi alle ved, kan vi erklære en funktionsmarkør og få den til at pege på en funktion i C:

void func1 (void);

void (*pFunc) (void) = func1;

og brug den til at kalde den funktion, den pegede på

pFunc ();

Men der er forskelle i C ++, hvis du prøver at kompilere koden nedenfor:

klasse A {

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

kompilatoren rapporterer en typekonverteringsfejl, her er det rigtige eksempel:

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

Når vi prøver at bruge den til at kalde den metode, fejl igen. Grunden til denne fejl er, at en objekt-metode skal kaldes af et objekt. Så vi opretter et objekt for at kalde det:

A a;

a.*pFunc ();

Denne gang ikke noget problem. Så der er delegeret klasse i Delegate.h.

skabelon

class middleware:: Delegate: public middleware:: interface:: IDelegate {public: Delegate (T *object, void (T:: *method) (void *)); void påkalde (void * args); beskyttet: T * _objekt; void (T:: *_ metode) (void *); }; template inline middleware:: Delegate:: Delegate (T *object, void (T:: *method) (void *)): _object (object), _method (method) {} template inline void middleware:: Delegate:: invoke (void * args) {(_object-> * _ method) (args); }

Fordi delegeret klasse er en skabelonklasse, hvilket betyder, at delegeret er forskel på delegeret, hvordan har de samme type til at få dem til at pege med markøren? Svaret er interface, så der er IDelegate interface i IDelegate.h.

klasse mellemware:: grænseflade:: IDelegate {

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

I klassen PIR Sensor og Loudness Sensor har der en variabel, der hedder _delegater, der bruges til at gemme markøren af delegerede, og der har en metode ved navn invokeAllDelegates (), der bruges til at påberåbe alle delegerede i _delegater, den vil blive kaldt i mål () metode.

BEMÆRK: Delegerede metoder, såsom changeAnimation (), changeSpeed () og changeColor () vil blive kaldt i timer2 interrupt, så brug IKKE delay () eller anden interrupt-baseret funktion i den.

Anbefalede: