Inhoudsopgave:

Kerstmuziek Cheer Light: 4 stappen
Kerstmuziek Cheer Light: 4 stappen

Video: Kerstmuziek Cheer Light: 4 stappen

Video: Kerstmuziek Cheer Light: 4 stappen
Video: Kerstliedjes 2024🎄Top kerstliedjes Afspeellijst 2024🎅🏼Beste kerstliedjes aller tijden🎄Christmas 2024 2024, November
Anonim
Kerstmuziek Cheer Light
Kerstmuziek Cheer Light

Vrolijk Kerstfeest! Wilt u een kerstboom die met u kan communiceren?

Stap 1: Dingen die in dit project worden gebruikt

Hardware onderdelen

  • Seeeduino V4.2
  • Basisschild V2
  • Grove - Instelbare PIR-bewegingssensor
  • Grove - Loudness-sensor
  • Grove - WS2813 RGB LED Strip Waterdicht - 60 LED/m - 1m

Software-apps en online services

Arduino IDE

Stap 2: Hardwareverbinding

Hardwareverbinding
Hardwareverbinding

Sluit de PIR-sensor, Loudness-sensor en LED-strip afzonderlijk aan op poort D2, A0 en D6 van Base Shield. Sluit Base Shield aan op Seeduino, klaar.

Stap 3: Softwareprogrammering

De volgende bibliotheken moeten vóór het programmeren worden geïnstalleerd, download en importeer ze handmatig naar uw Arduino IDE:

  • Loden strip
  • MsTimer2
  • Arduino_Vector

Om de code beknopter te maken, hebben we deze verpakt. CheerLight-klasse is de toepassingsklasse van dit project.

klasse toepassing::CheerLight

: publieke applicatie::interface::IApplication { public: void setup (void); lege lus (leegte); void setPIRSensorPin(uint8_t pin); void setLoudnessSensorPin (uint8_t pin); ongeldige maatregelSensoren (nietig); void changeAnimation (void * args); void changeSpeed (void * args); void changeColor (void * args); statische toepassing::CheerLight * getInstance(void); beschermd: stuurprogramma::LEDStrip _ledStrip; stuurprogramma::PIRSensor _pirSensor; stuurprogramma::LoudnessSensor _loudnessSensor; uint8_t _animatie; middleware::Delegate _detectedDelegate; middleware::Delegate _absoluteLoudnessDelegate; middleware::Delegate _relativeLoudnessDelegate; CheerLight (leegte); statische toepassing::CheerLight _instance; };

De CheerLight-klasse is ontworpen door Singleton Patterns, wat betekent dat er maar één instantie voor is, u kunt CheerLight::getInstance() naar die instantie aanroepen. Als de verbinding van uw sensoren verschilt van de hardwareverbinding, kunt u deze wijzigen door de methoden setPIRSensorPin() en setLoudnessSensorPin() aan te roepen.

Afbeelding
Afbeelding

We raden aan om de methode measureSensors() in timer interrupt aan te roepen om sensoren tijdig te laten meten, maar de methode changeAnimation(), changeSpeed() of changeColor() handmatig aanroepen is niet nodig. Ze worden via Afgevaardigden gebeld als er sensoren zijn gemeten.

Wat is een afgevaardigde?

Zoals we allemaal weten, kunnen we een functieaanwijzer declareren en deze naar een functie in C laten wijzen:

void func1(void);

void (*pFunc)(void) = func1;

en gebruik het om de functie aan te roepen waarnaar het verwijst

pFunc();

Maar er zijn verschillen in C++, als je de volgende code probeert te compileren:

klasse A, eerste klasse {

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

de compiler zal een typeconversiefout rapporteren, hier is het juiste voorbeeld:

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

Wanneer we het proberen te gebruiken om die methode aan te roepen, treedt er opnieuw een fout op. De reden voor die fout is dat een object-methode moet worden aangeroepen door een object. Dus we maken een object om het te noemen:

een een;

a.*pFunc();

Dit keer geen probleem. Er is dus een Delegate-klasse in Delegate.h.

sjabloon

class middleware::Delegate: public middleware::interface::IDelegate { public: Delegate(T * object, void (T::*method)(void *)); void aanroepen (void * args); beveiligd: T * _object; void (T::*_method)(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); }

Omdat de gedelegeerde klasse een sjabloonklasse is, wat betekent dat gedelegeerde een verschil is met gedelegeerde, hoe kan ik ze laten wijzen door een aanwijzer van hetzelfde type? Het antwoord is interface, dus er is een IDelegate-interface in IDelegate.h.

klasse middleware::interface::IDelegate {

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

In de klasse PIR Sensor en Loudness Sensor is er een variabele met de naam _delegates die wordt gebruikt om de aanwijzer van Delegates op te slaan, en er is een methode met de naam invokeAllDelegates() die wordt gebruikt om alle Delegates in _delegates aan te roepen, deze wordt aangeroepen in de methode measure().

OPMERKING: Delegeermethoden, zoals changeAnimation(), changeSpeed() en changeColor() worden aangeroepen in timer2 interrupt, dus gebruik GEEN delay() of een andere op interrupt gebaseerde functie erin.

Aanbevolen: