Πίνακας περιεχομένων:

Χριστουγεννιάτικη μουσική Cheer Light: 4 Βήματα
Χριστουγεννιάτικη μουσική Cheer Light: 4 Βήματα

Βίντεο: Χριστουγεννιάτικη μουσική Cheer Light: 4 Βήματα

Βίντεο: Χριστουγεννιάτικη μουσική Cheer Light: 4 Βήματα
Βίντεο: 3 Hours of Christmas Music | Traditional Instrumental Christmas Songs Playlist | Piano & Orchestra 2024, Νοέμβριος
Anonim
Χριστουγεννιάτικη μουσική Cheer Light
Χριστουγεννιάτικη μουσική Cheer Light

Καλά Χριστούγεννα! Θέλετε να έχετε ένα χριστουγεννιάτικο δέντρο που να μπορεί να αλληλεπιδράσει μαζί σας;

Βήμα 1: Πράγματα που χρησιμοποιούνται σε αυτό το έργο

Συστατικά υλικού

  • Seeeduino V4.2
  • Base Shield V2
  • Grove - Ρυθμιζόμενος αισθητήρας κίνησης PIR
  • Grove - Loudness Sensor
  • Grove - WS2813 RGB LED Strip Waterproof - 60 LED/m - 1m

Εφαρμογές λογισμικού και διαδικτυακές υπηρεσίες

Arduino IDE

Βήμα 2: Σύνδεση υλικού

Σύνδεση υλικού
Σύνδεση υλικού

Συνδέστε τον αισθητήρα PIR, τον αισθητήρα έντασης και τη λωρίδα LED στη θύρα D2, A0 και D6 της Base Shield ξεχωριστά. Συνδέστε το Base Shield στο Seeduino, όλα είναι έτοιμα.

Βήμα 3: Προγραμματισμός λογισμικού

Οι βιβλιοθήκες που ακολουθούν πρέπει να εγκατασταθούν πριν από τον προγραμματισμό. Κάντε λήψη και εισαγάγετε τις στο Arduino IDE με μη αυτόματο τρόπο:

  • Led_Strip
  • MsTimer2
  • Arduino_Vector

Για να κάνουμε τον κώδικα πιο συνοπτικό, τον έχουμε συσκευάσει. Η κατηγορία CheerLight είναι η κατηγορία εφαρμογών αυτού του έργου.

εφαρμογή τάξης:: CheerLight

: public application:: interface:: IApplication {public: void setup (void); void loop (void)? void setPIRSensorPin (uint8_t pin); void setLoudnessSensorPin (uint8_t pin); μέτρηση κενού Αισθητήρες (κενό); void changeAnimation (void * args)? void changeSpeed (void * args)? void changeColor (void * args)? στατική εφαρμογή:: CheerLight * getInstance (άκυρο). προστατευμένο: οδηγός:: LEDStrip _ledStrip; πρόγραμμα οδήγησης:: PIRSensor _pirSensor; πρόγραμμα οδήγησης:: LoudnessSensor _loudnessSensor; uint8_t _animation; middleware:: Delegate _detectedDelegate; middleware:: Delegate _absoluteLoudnessDelegate; middleware:: Delegate _relativeLoudnessDelegate; CheerLight (άκυρο) στατική εφαρμογή:: CheerLight _instance? };

Η τάξη CheerLight σχεδιάστηκε από τα Singleton Patterns, πράγμα που σημαίνει ότι υπάρχει μόνο ένα παράδειγμα για αυτό, μπορείτε να καλέσετε το CheerLight:: getInstance () σε αυτήν την περίπτωση. Εάν η σύνδεση των Αισθητήρων είναι διαφορετική από τη Σύνδεση υλικού, μπορείτε να τους αλλάξετε καλώντας μεθόδους setPIRSensorPin () και setLoudnessSensorPin ().

Εικόνα
Εικόνα

Συνιστούμε τη μέθοδο callSensors () σε διακοπή χρονοδιακόπτη για να μετρηθούν οι αισθητήρες εγκαίρως, αλλά οι μέθοδοι κλήσης changeAnimation (), changeSpeed () ή changeColor () δεν είναι απαραίτητες. Θα κληθούν μέσω εκπροσώπων όταν μετρηθούν οι αισθητήρες.

Τι είναι το Delegate;

Όπως όλοι γνωρίζουμε, μπορούμε να δηλώσουμε έναν δείκτη συνάρτησης και να τον κάνουμε να δείξει μια συνάρτηση στο C:

void func1 (void)?

void (*pFunc) (void) = func1;

και χρησιμοποιήστε το για να καλέσετε τη συνάρτηση που έδειξε

pFunc ();

Υπάρχουν όμως διαφορές στο C ++, αν προσπαθήσετε να συντάξετε τον παρακάτω κώδικα:

τάξη Α {

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

ο μεταγλωττιστής θα αναφέρει ένα σφάλμα μετατροπής τύπου, εδώ είναι το σωστό παράδειγμα:

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

Όταν προσπαθούμε να το χρησιμοποιήσουμε για να καλέσουμε αυτήν τη μέθοδο, κάνουμε ξανά σφάλμα. Ο λόγος για αυτό το σφάλμα είναι ότι μια μέθοδος αντικειμένου πρέπει να κληθεί από ένα αντικείμενο. Έτσι δημιουργούμε ένα αντικείμενο για να το ονομάσουμε:

Α α?

a.*pFunc ();

Αυτή τη φορά κανένα πρόβλημα. Υπάρχει λοιπόν τάξη Delegate στο Delegate.h.

πρότυπο

class middleware:: Delegate: public middleware:: interface:: IDelegate {public: Delegate (αντικείμενο T *, κενό (μέθοδος T:: *) (άκυρο *)); void invoke (void * args)? προστατευμένο: T * _object; κενό (μέθοδος T:: *_) (κενό *); }; πρότυπο 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); }

Επειδή η κλάση Delegate είναι μια κατηγορία προτύπου, που σημαίνει ότι ο Delegate είναι η διαφορά από τον Delegate, πώς να τις επισημάνω με δείκτη να έχουν τον ίδιο τύπο; Η απάντηση είναι διεπαφή, οπότε υπάρχει IDelegate interface στο IDelegate.h.

class middleware:: interface:: IDelegate {

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

Στην κλάση PIR Sensor και Loudness Sensor, υπάρχει μια μεταβλητή που ονομάζεται _ delegates που χρησιμοποιείται για την αποθήκευση του δείκτη των Delegates, και υπάρχει μια μέθοδος που ονομάζεται invokeAllDelegates () που χρησιμοποιείται για την κλήση όλων των Delegates στο _delegates, θα ονομάζεται μέτρο μέτρησης ().

ΣΗΜΕΙΩΣΗ: Εκχωρήστε μεθόδους, όπως changeAnimation (), changeSpeed () και changeColor () θα κληθούν στο timer2 interrupt, οπότε ΜΗΝ χρησιμοποιήσετε καθυστέρηση () ή άλλη λειτουργία που βασίζεται σε διακοπή σε αυτήν.

Συνιστάται: