Innehållsförteckning:

Christmas Music Cheer Light: 4 steg
Christmas Music Cheer Light: 4 steg

Video: Christmas Music Cheer Light: 4 steg

Video: Christmas Music Cheer Light: 4 steg
Video: A CHRISTMAS CHEERS 4 2024, November
Anonim
Julmusik Cheer Light
Julmusik Cheer Light

God Jul! Vill du ha en julgran som kan interagera med dig?

Steg 1: Saker som används i detta projekt

Hårdvarukomponenter

  • Seeeduino V4.2
  • Bassköld V2
  • Grove - Justerbar PIR -rörelsesensor
  • Grove - Loudness Sensor
  • Grove - WS2813 RGB LED Strip Vattentät - 60 LED/m - 1m

Programvaruappar och onlinetjänster

Arduino IDE

Steg 2: Maskinvaruanslutning

Maskinvaruanslutning
Maskinvaruanslutning

Anslut PIR -sensor, Loudness -sensor och LED -remsa till Base Shields port D2, A0 och D6 separat. Anslut basskyddet till Seeduino, allt klart.

Steg 3: Programvaruprogrammering

Biblioteken som följer ned måste installeras innan du programmerar, ladda ner och importera dem till din Arduino IDE manuellt:

  • Led_Strip
  • MsTimer2
  • Arduino_Vector

För att göra koden mer kortfattad har vi förpackat den. CheerLight -klassen är applikationsklassen för detta projekt.

klassapplikation:: 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); skyddad: förare:: 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 designades av Singleton Patterns, vilket innebär att det bara finns en instans för den, du kan ringa CheerLight:: getInstance () till den instansen. Om dina sensorers anslutning skiljer sig från maskinvaruanslutning kan du ändra dem genom att ange setPIRSensorPin () och setLoudnessSensorPin () -metoder.

Bild
Bild

Vi rekommenderar att anropa MeasureSensors () -metod vid timeravbrott för att göra sensorer uppmätta i tid, men det är inte nödvändigt att ringa changeAnimation (), changeSpeed () eller changeColor () -metoder manuellt. De kommer att kallas via delegater när sensorer mäts.

Vad är en delegat?

Som vi alla vet kan vi deklarera en funktionspekare och få den att peka på en funktion i C:

void func1 (void);

void (*pFunc) (void) = func1;

och använd den för att kalla funktionen den pekade på

pFunc ();

Men det finns skillnader i C ++ om du försöker kompilera koden nedan:

klass A {

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

kompilatorn kommer att rapportera ett typkonverteringsfel, här är det rätta exemplet:

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

När vi försöker använda den för att kalla den metoden, fel igen. Orsaken till det felet är att en objektmetod måste anropas av ett objekt. Så vi skapar ett objekt för att kalla det:

A a;

a.*pFunc ();

Den här gången inga problem. Så det finns delegatklass i Delegate.h.

mall

klass mellanvara:: Delegate: public middleware:: interface:: IDelegate {public: Delegate (T *object, void (T:: *method) (void *)); void påkalla (void * args); skyddad: T * _object; void (T:: *_ metod) (void *); }; mall 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); }

Eftersom delegatklassen är en mallklass, vilket innebär att delegat är skillnad mot delegat, hur kan man få dem att peka med pekaren av samma typ? Svaret är gränssnitt, så det finns IDelegate -gränssnitt i IDelegate.h.

klass mellanvara:: gränssnitt:: IDelegate {

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

I klassen PIR Sensor och Loudness Sensor har det en variabel med namnet _delegates som används för att lagra pekare på delegater, och det finns en metod som heter invokeAllDelegates () som används för att påkalla alla delegater i _delegates, den kommer att kallas i mått () -metod.

OBS! Delegerade metoder, såsom changeAnimation (), changeSpeed () och changeColor () kommer att kallas in timer2 interrupt, så använd INTE delay () eller annan avbrottsbaserad funktion i den.

Rekommenderad: