جدول المحتويات:
2025 مؤلف: John Day | [email protected]. آخر تعديل: 2025-01-13 06:56
عيد ميلاد مجيد! هل ترغب في الحصول على شجرة عيد الميلاد يمكنها التفاعل معك؟
الخطوة 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 ، لذلك لا تستخدم التأخير () أو أي وظيفة أخرى قائمة على المقاطعة.