תוכן עניינים:

אור המוזיקה של חג המולד: 4 שלבים
אור המוזיקה של חג המולד: 4 שלבים

וִידֵאוֹ: אור המוזיקה של חג המולד: 4 שלבים

וִידֵאוֹ: אור המוזיקה של חג המולד: 4 שלבים
וִידֵאוֹ: ככה זה כשיש לך חברה רוסיה 2024, נוֹבֶמבֶּר
Anonim
אור המוזיקה של חג המולד
אור המוזיקה של חג המולד

חג מולד שמח! האם אתה רוצה שיהיה לך עץ חג המולד שיכול לתקשר איתך?

שלב 1: דברים המשמשים בפרויקט זה

רכיבי חומרה

  • Seeeduino V4.2
  • מגן בסיס V2
  • Grove - חיישן תנועה PIR מתכוונן
  • Grove - חיישן עוצמה
  • Grove - רצועת LED WS2813 RGB עמיד למים - 60 LED/m - 1m

אפליקציות תוכנה ושירותים מקוונים

Arduino IDE

שלב 2: חיבור חומרה

חיבור חומרה
חיבור חומרה

חבר חיישן PIR, חיישן עוצמה ורצועת LED ליציאת D2, A0 ו- D6 של Base Shield בנפרד. חבר את מגן הבסיס לסדואינו, הכל נעשה.

שלב 3: תכנות תוכנה

הספריות להלן צריכות להתקין לפני התכנות, אנא הורד וייבא אותן ל- IDE שלך Arduino באופן ידני:

  • רצועת לד
  • MsTimer2
  • Arduino_Vector

על מנת להפוך את הקוד לתמציתי יותר, ארזנו אותו. מחלקת CheerLight היא מחלקת היישומים של פרויקט זה.

יישום בכיתה:: CheerLight

: יישום ציבורי:: ממשק:: IApplication {public: void setup (void); לולאת חלל (חלל); setPIRSensorPin חלל (סיכה uint8_t); void setLoudnessSensorPin (uint8_t pin); void measureSensors (void); void changeAnimation (void * args); void changeSpeed (void * args); שינוי חלל צבע (void * args); יישום סטטי:: CheerLight * getInstance (void); מוגן: נהג:: LEDStrip _ledStrip; נהג:: PIRSensor _pirSensor; נהג:: LoudnessSensor _loudnessSensor; uint8_t _animation; תוכנת ביניים:: נציג _detectedDelegate; תוכנת ביניים:: נציג _absoluteLoudnessDelegate; תוכנות ביניים:: נציג _relativeLoudnessDelegate; CheerLight (חלל); יישום סטטי:: CheerLight _instance; };

מחלקת CheerLight תוכננה על ידי Singleton Patterns, מה שאומר שיש רק מופע אחד לכך, אתה יכול לקרוא ל- CheerLight:: getInstance () לאותו מופע. אם החיבור של החיישנים שלך שונה לחיבור חומרה, תוכל לשנות אותם על ידי קריאה לשיטות setPIRSensorPin () ו- setLoudnessSensorPin ().

תמונה
תמונה

אנו ממליצים לקרוא לשיטת MeasureSensors () בפסיעת טיימר בכדי לבצע חיישנים שנמדדים בזמן, אך אין צורך בשיחות שינויים ב- Animation (), ChangeSpeed () או ChangeColor () באופן ידני. הם יקראו באמצעות נציגים כאשר נמדדים חיישנים.

מהו נציג?

כפי שכולנו יודעים, אנו יכולים להכריז על מצביע פונקציות ולגרום לו להצביע על פונקציה ב- C:

חלל func1 (חלל);

void (*pFunc) (void) = func1;

ולהשתמש בו כדי לקרוא לפונקציה שאליה הצביע

pFunc ();

אך ישנם הבדלים ב- C ++, אם אתה מנסה לאסוף את הקוד למטה:

כיתה א {

ציבורי: void func1 (void); }; void (*pFunc) (void) = & A:: func1;

המהדר ידווח על שגיאת המרת סוג, להלן הדוגמה הנכונה:

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

כאשר אנו מנסים להשתמש בו כדי לקרוא לשיטה זו, שגיאה שוב. הסיבה לשגיאה זו היא שחייבים לקרוא לשיטת אובייקט על ידי אובייקט. אז אנו יוצרים אובייקט שקוראים לו:

א א;

a.*pFunc ();

הפעם אין בעיה. אז יש שיעור Delegate ב- Delegate.h.

תבנית

תוכנת ביניים בכיתה:: נציג: תוכנת ביניים ציבורית:: ממשק:: IDelegate {public: Delegate (T *object, void (T:: *method) (void *)); void invoke (void * args); מוגן: T * _object; void (T:: *_ שיטה) (void *); }; תבנית תוכנה מוטבעת באמצע:: נציג:: נציג (T *אובייקט, חלל (T:: *שיטה) (חלל *)): _ אובייקט (אובייקט), _ שיטה (שיטה) {} תבנית אינהלנטית של חלל תוכנה:: נציג:: להפעיל (void * args) {(_object-> * _ method) (args); }

מכיוון שמעמד Delegate הוא מחלקת תבניות, מה שאומר ש- Delegate הוא הבדל ל- Delegate, כיצד לגרום להם להצביע על -ידי המצביע בעלי אותו סוג? התשובה היא ממשק, כך שיש ממשק IDelegate ב- IDelegate.h.

תוכנה בינונית:: ממשק:: IDelegate {

ציבורי: הפעלת וירטואלית של void (void * args) = 0; };

במחלקה של חיישן PIR וחיישן עוצמה, יש משתנה בשם _ delegates המשמש לאחסון מצביע של נציגים, ויש שיטה בשם invokeAllDelegates () המשמשת לקריאת כל הנציגים ב- _ delegates, היא תקרא במידה () שיטה.

הערה: שיטות נציג, כגון changeAnimation (), changeSpeed () ו- changeColor () ייקראו ב- timer2 interrupt, לכן אל תשתמש בו ב- delay () או בפונקציה אחרת המבוססת על הפרעות.

מוּמלָץ: