ضوء بهجة موسيقى الكريسماس: 4 خطوات
ضوء بهجة موسيقى الكريسماس: 4 خطوات
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 ، لذلك لا تستخدم التأخير () أو أي وظيفة أخرى قائمة على المقاطعة.