Inhoudsopgave:
- Stap 1: Dingen die in dit project worden gebruikt
- Stap 2: Hardwareverbinding
- Stap 3: Softwareprogrammering
- Stap 4: Bediening
Video: Kerstmuziek Cheer Light: 4 stappen
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:17
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
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.
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:
Pull the Light - Light Module met Neopixel & Pull Up Switch - Ajarnpa
Trek aan de licht - lichtmodule met behulp van Neopixel & optrekschakelaar: kenmerken van de lichtmodule Arduino Uno Hardware & behuizing gekocht van internet Neopixel & Stroomvoorziening geleend van School of Informatics & Productuitvoering Lichtmodule aangestuurd door voeding Alle functies aangestuurd via
Arduino Christmas Cheer!: 5 stappen (met afbeeldingen)
Arduino Christmas Cheer!: Dit is het seizoen om Arduino's op feestelijke plaatsen te plakken, en wat is een betere plek dan een kerstboom! In dit project gaan we een kerstboom maken die een heleboel verschillende kerstliedjes kan zingen en oplichten in combinatie met de mu
$ 20 Holiday Cheer Box: 5 stappen (met afbeeldingen)
$ 20 Holiday Cheer Box: dit project laat je zien hoe je een doos bouwt die een willekeurig geluid speelt wanneer de knop wordt ingedrukt. In dit geval heb ik het gebruikt om een doos te bouwen die ik tijdens de vakantie strategisch rond het kantoor kan plaatsen. Als mensen op de knop drukken, horen ze een
Ikea Light Hack (flexin Your Light): 5 stappen
Ikea Light Hack (flexin Your Light): Toen ik besloot de verlichting op mijn bureau te verbeteren, wendde ik me tot Ikea. Ik heb de Ikea Jansjo (http://www.ikea.com/us/en/catalog/products/10128748) en de Ikea Lack (http://www.ikea.com/us/en/catalog/products/60124272 ) en gooide de bon per ongeluk weg
Light Frame (voor Tekjocks Photography Light Box): 3 stappen
Light Frame (voor Tekjocks Photography Light Box): Hier is het vervolg op mijn Photography Light Box. Ik ga hier niet verder op ingaan, want het komt erop aan welke maat slangen je krijgt en welke maat hardware je nodig hebt. Dit wordt dus een zeer eenvoudige zelfstudie. ik zal post