جدول المحتويات:

ضوء بهجة موسيقى الكريسماس: 4 خطوات
ضوء بهجة موسيقى الكريسماس: 4 خطوات

فيديو: ضوء بهجة موسيقى الكريسماس: 4 خطوات

فيديو: ضوء بهجة موسيقى الكريسماس: 4 خطوات
فيديو: ترنيمة الكريسماس بالحركات دقت الاجراس فريق افا نيقولا كنيسة مارمرقص مطرنية سمالوط 2024, شهر نوفمبر
Anonim
عيد الميلاد موسيقى الهتاف الخفيفة
عيد الميلاد موسيقى الهتاف الخفيفة

عيد ميلاد مجيد! هل ترغب في الحصول على شجرة عيد الميلاد يمكنها التفاعل معك؟

الخطوة 1: الأشياء المستخدمة في هذا المشروع

مكونات الأجهزة

  • Seeeduino V4.2
  • قاعدة درع V2.0
  • جروف - مستشعر حركة PIR قابل للتعديل
  • جروف - مستشعر جهارة الصوت
  • Grove - WS2813 RGB LED Strip مقاوم للماء - 60 LED / m - 1m

تطبيقات البرمجيات والخدمات عبر الإنترنت

اردوينو IDE

الخطوة 2: توصيل الأجهزة

اتصال الأجهزة
اتصال الأجهزة

قم بتوصيل مستشعر PIR ومستشعر ارتفاع الصوت وشريط LED بمنفذ Base Shield D2 و A0 و D6 بشكل منفصل. قم بتوصيل Base Shield بـ Seeduino ، كل ذلك انتهى.

الخطوة الثالثة: برمجة البرمجيات

تحتاج المكتبات التالية إلى التثبيت قبل البرمجة ، يرجى تنزيلها واستيرادها إلى Arduino IDE يدويًا:

  • Led_Strip
  • MsTimer2
  • اردوينو فيكتور

من أجل جعل الكود أكثر إيجازًا ، قمنا بتعبئته. فئة CheerLight هي فئة التطبيق لهذا المشروع.

تطبيق فئة:: CheerLight

: public application:: interface:: IApplication {public: void setup (void)؛ حلقة باطلة (باطلة) ؛ مجموعة باطلة PIRSensorPin (uint8_t pin) ؛ باطل setLoudnessSensorPin (uint8_t pin) ؛ قياس باطل تغيير باطل تغيير سرعة باطلة (صفحات * باطلة) ؛ تغيير لون باطل (باطل * أرغس) ؛ تطبيق ثابت:: CheerLight * getInstance (باطل) ؛ محمي: سائق:: LEDStrip _ledStrip ؛ سائق:: PIRSensor _pirSensor ؛ سائق:: LoudnessSensor _loudnessSensor ؛ uint8_t _animation ؛ برمجية وسيطة:: مفوض _detectedDelegate؛ الوسيطة:: مفوض _absoluteLoudnessDelegate ؛ الوسيطة:: مندوب _relativeLoudnessDelegate ؛ CheerLight (باطل) ؛ تطبيق ثابت:: CheerLight _instance ؛ } ؛

تم تصميم فئة CheerLight بواسطة Singleton Patterns ، مما يعني أنه يوجد مثيل واحد فقط لها ، يمكنك استدعاء CheerLight:: getInstance () لهذا المثال. إذا كان اتصال أجهزة الاستشعار لديك مختلفًا عن اتصال الأجهزة ، فيمكنك تغييرها عن طريق استدعاء أساليب setPIRSensorPin () و setLoudnessSensorPin ().

صورة
صورة

نوصي باستدعاء طريقة MeasSensors () في مقاطعة المؤقت لجعل المستشعرات تقاس في الوقت المناسب ، لكن استدعاء طرق changeAnimation () أو changeSpeed () أو changeColor () يدويًا ليست ضرورية. سيتم الاتصال بهم عبر المندوبين عند قياس أجهزة الاستشعار.

ما هو المندوب؟

كما نعلم جميعًا ، يمكننا أن نعلن عن مؤشر دالة ونجعله يشير إلى دالة في لغة C:

func1 باطل (باطل) ؛

باطل (* pFunc) (باطل) = func1 ؛

واستخدمها لاستدعاء الوظيفة التي أشارت إليها

pFunc () ،

ولكن هناك اختلافات في C ++ ، إذا حاولت تجميع الكود التالي لأسفل:

فئة أ {

عام: func1 باطل (باطل) ؛ } ؛ void (* pFunc) (void) = & A:: func1؛

سيقوم المترجم بالإبلاغ عن خطأ تحويل نوع ، وهنا المثال الصحيح:

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

عندما نحاول استخدامه لاستدعاء تلك الطريقة ، حدث خطأ مرة أخرى. سبب هذا الخطأ هو أنه يجب استدعاء طريقة الكائن بواسطة كائن. لذلك أنشأنا كائنًا نسميه:

أ أ ؛

أ. * pFunc () ؛

هذه المرة لا مشكلة. لذلك هناك فئة المندوبين في المندوب. h.

نموذج

البرامج الوسيطة للفئة:: المندوب: البرنامج الوسيط العام:: الواجهة:: IDelegate {public: التفويض (T * object، void (T:: * method) (void *))؛ استدعاء باطل (void * args) ؛ محمي: T * _object ؛ باطل (T:: * _ طريقة) (باطل *) ؛ } ؛ البرمجيّة الوسيطة المضمنة للقالب:: المندوب:: المندوب (كائن T * ، باطل (طريقة T:: *) (void *)): _object (كائن) ، _method (طريقة) {} نموذج مضمّن وسيط باطل:: مفوض:: استدعاء (* void * args) {(_object -> * _ method) (args) ؛ }

نظرًا لأن فئة المندوبين عبارة عن فئة قالب ، مما يعني أن المندوب هو اختلاف عن المندوب ، فكيف يمكن الإشارة إليها بمؤشر لها نفس النوع؟ الجواب هو الواجهة ، لذلك هناك واجهة IDelegate في IDelegate.h.

class middleware:: interface:: IDelegate {

عام: استدعاء الفراغ الظاهري (باطل * أرغس) = 0 ؛ } ؛

في فئة مستشعر PIR ومستشعر ارتفاع الصوت ، يوجد متغير يسمى _delegates يُستخدم لتخزين مؤشر المندوبين ، وهناك طريقة تسمى invokeAllDelegates () تُستخدم لاستدعاء جميع المندوبين في _delegates ، وسيتم استدعاؤها في طريقة القياس ().

ملاحظة: سيتم استدعاء أساليب التفويض ، مثل changeAnimation () و changeSpeed () و changeColor () في المقاطعة timer2 ، لذلك لا تستخدم التأخير () أو أي وظيفة أخرى قائمة على المقاطعة.

موصى به: