Table des matières:

Musique de Noël Cheer Light : 4 étapes
Musique de Noël Cheer Light : 4 étapes

Vidéo: Musique de Noël Cheer Light : 4 étapes

Vidéo: Musique de Noël Cheer Light : 4 étapes
Vidéo: Magical Christmas Scenes & Music Ambience w/ Christmas Lights & Snow Falling 2024, Novembre
Anonim
Musique de Noël Cheer Light
Musique de Noël Cheer Light

Joyeux Noël! Vous souhaitez avoir un sapin de Noël qui puisse interagir avec vous ?

Étape 1: Éléments utilisés dans ce projet

Composants matériels

  • Seeduino V4.2
  • Bouclier de base V2
  • Grove - Détecteur de mouvement PIR réglable
  • Grove - Capteur d'intensité sonore
  • Grove - Bande LED RGB WS2813 Etanche - 60 LED/m - 1m

Applications logicielles et services en ligne

IDE Arduino

Étape 2: connexion matérielle

Connexion matérielle
Connexion matérielle

Connectez le capteur PIR, le capteur de volume et la bande LED aux ports D2, A0 et D6 de la protection de base séparément. Branchez Base Shield à Seeduino, tout est fait.

Étape 3: Programmation du logiciel

Les bibliothèques suivantes doivent être installées avant la programmation, veuillez les télécharger et les importer manuellement dans votre IDE Arduino:

  • Led_Strip
  • MsTimer2
  • Arduino_Vector

Afin de rendre le code plus concis, nous l'avons empaqueté. La classe CheerLight est la classe d'application de ce projet.

application de classe::CheerLight

: application publique::interface::IApplication { public: void setup(void); boucle vide (vide); void setPIRSensorPin (pin uint8_t); void setLoudnessSensorPin (pin uint8_t); void mesureCapteurs (void); void changeAnimation(void * args); void changeSpeed(void * args); void changeColor(void * args); application statique::CheerLight * getInstance(void); protected: driver::LEDStrip _ledStrip; pilote::PIRSensor _pirSensor; pilote::LoudnessSensor _loudnessSensor; uint8_t _animation; middleware::Delegate _detectedDelegate; middleware::Delegate _absoluteLoudnessDelegate; middleware::Delegate _relativeLoudnessDelegate; CheerLight(vide); application statique::CheerLight _instance; };

La classe CheerLight a été conçue par Singleton Patterns, ce qui signifie qu'il n'y a qu'une seule instance pour elle, vous pouvez appeler CheerLight::getInstance() pour cette instance. Si la connexion de vos capteurs est différente de la connexion matérielle, vous pouvez les modifier en appelant les méthodes setPIRSensorPin() et setLoudnessSensorPin().

Image
Image

Nous recommandons d'appeler la méthode measureSensors() dans l'interruption de la minuterie pour que les capteurs soient mesurés à temps, mais l'appel manuel des méthodes changeAnimation(), changeSpeed() ou changeColor() n'est pas nécessaire. Ils seront appelés via les Délégués lors de la mesure des capteurs.

Qu'est-ce qu'un délégué ?

Comme nous le savons tous, nous pouvons déclarer un pointeur de fonction et le faire pointer vers une fonction en C:

void func1(void);

void (*pFunc)(void) = func1;

et l'utiliser pour appeler la fonction qu'il a pointée

pFunc();

Mais il existe des différences en C++, si vous essayez de compiler le code suivant:

Classe A {

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

le compilateur rapportera une erreur de conversion de type, voici le bon exemple:

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

Lorsque nous essayons de l'utiliser pour appeler cette méthode, erreur à nouveau. La raison de cette erreur est qu'une méthode objet doit être appelée par un objet. Nous créons donc un objet pour l'appeler:

Un un;

a.*pFunc();

Cette fois pas de problème. Il y a donc la classe Delegate dans Delegate.h.

modèle

class middleware::Delegate: public middleware::interface::IDelegate { public: Delegate(T * object, void (T::*method)(void *)); void invoquer (void * args); protégé: T * _objet; 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); }

Étant donné que la classe Delegate est une classe de modèle, ce qui signifie que Delegate est différent de Delegate, comment les faire pointer par un pointeur ayant le même type? La réponse est interface, il y a donc une interface IDelegate dans IDelegate.h.

middleware de classe::interface::IDelegate {

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

Dans la classe PIR Sensor et Loudness Sensor, il y a une variable nommée _delegates utilisée pour stocker le pointeur des délégués, et il y a une méthode nommée invokeAllDelegates() utilisée pour appeler tous les délégués dans _delegates, elle sera appelée dans la méthode measure().

REMARQUE: les méthodes déléguées, telles que changeAnimation(), changeSpeed() et changeColor() seront appelées dans l'interruption timer2, donc n'utilisez PAS delay() ou une autre fonction basée sur une interruption.

Conseillé: