فهرست مطالب:

موسیقی کریسمس Cheer Light: 4 مرحله
موسیقی کریسمس Cheer Light: 4 مرحله

تصویری: موسیقی کریسمس Cheer Light: 4 مرحله

تصویری: موسیقی کریسمس Cheer Light: 4 مرحله
تصویری: Magical Christmas Scenes & Music Ambience w/ Christmas Lights & Snow Falling 2024, نوامبر
Anonim
موسیقی کریسمس Cheer Light
موسیقی کریسمس Cheer Light

کریسمس مبارک! آیا می خواهید درخت کریسمس داشته باشید که بتواند با شما ارتباط برقرار کند؟

مرحله 1: موارد مورد استفاده در این پروژه

اجزای سخت افزاری

  • Seeeduino V4.2
  • Base Shield V2
  • Grove - سنسور حرکت PIR قابل تنظیم
  • گروو - سنسور بلندی صدا
  • Grove - WS2813 RGB LED Strip ضد آب - 60 LED/m - 1m

برنامه های نرم افزاری و خدمات آنلاین

آردوینو IDE

مرحله 2: اتصال سخت افزار

اتصال سخت افزار
اتصال سخت افزار

سنسور PIR ، سنسور صدا و نوار LED را جداگانه به درگاه D2 ، A0 و D6 Base Shield وصل کنید. Base Shield را به Seeduino وصل کنید ، تمام شد.

مرحله 3: برنامه نویسی نرم افزار

کتابخانه های زیر باید قبل از برنامه نویسی نصب شوند ، لطفاً آنها را بارگیری و به صورت دستی در Arduino IDE خود وارد کنید:

  • Led_Strip
  • MsTimer2
  • آردوینو_وکتور

به منظور مختصرتر کردن کد ، ما آن را بسته بندی کرده ایم. کلاس CheerLight کلاس کاربردی این پروژه است.

کلاس کاربردی:: CheerLight

: public application:: interface:: IApplication {public: void setup (void)؛ حلقه خالی (خالی) ؛ void setPIRSensorPin (پین uint8_t) ؛ void setLoudnessSensorPin (uint8_t pin) ؛ اندازه خالی سنسورها (خلأ) ؛ void changeAnimation (void * args)؛ void changeSpeed (void * args)؛ void changeColor (void * args) ؛ برنامه استاتیک:: CheerLight * getInstance (void) ؛ protected: driver:: 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 () تغییر دهید.

تصویر
تصویر

ما برای اندازه گیری به موقع سنسورها ، متد () masëSensors () را در وقفه تایمر توصیه می کنیم ، اما فراخوانی دستی متدهای changeAnimation () ، changeSpeed () یا changeColor () ضروری نیست. هنگام اندازه گیری سنسورها ، آنها از طریق نمایندگان فراخوانی می شوند.

نماینده چیست؟

همانطور که همه می دانیم ، می توانیم اشاره گر تابع را اعلام کرده و آن را به یک تابع در C نشان دهیم:

void func1 (void)؛

void (*pFunc) (void) = func1؛

و از آن برای فراخوانی تابعی که به آن اشاره کرده است استفاده کنید

pFunc ()؛

اما اگر سعی کنید کد زیر را کامپایل کنید ، تفاوت هایی در C ++ وجود دارد:

کلاس A {

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

کامپایلر خطای تبدیل نوع را گزارش می کند ، در اینجا مثال مناسب است:

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

وقتی سعی می کنیم از آن برای فراخوانی آن روش استفاده کنیم ، دوباره خطا می شود. دلیل این خطا این است که یک شیء متد باید توسط یک شی فراخوانی شود. بنابراین ما یک شی ایجاد می کنیم تا آن را صدا کنیم:

A a؛

a.*pFunc ()؛

اینبار مشکلی نیست بنابراین کلاس Delegate در Delegate.h وجود دارد.

قالب

class middleware:: Delegate: public middleware:: interface:: IDelegate {public: Delegate (T *object، void (T:: *method) (void *))؛ void invoke (void * args)؛ محافظت شده: T * _object؛ void (T:: *_ method) (void *)؛ }؛ middleware template inline:: 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 در IDelegate.h وجود دارد.

class middleware:: interface:: IDelegate {

public: فراخوانی خلاء مجازی (void * args) = 0؛ }؛

در کلاس PIR Sensor و Loudness Sensor ، متغیری به نام _delegates وجود دارد که برای ذخیره اشاره گر Delegates استفاده می شود ، و متدی به نام invokeAllDelegates () برای فراخوانی همه Delegates در _delegates وجود دارد ، که در متد () اندازه گیری می شود.

توجه: روشهای تفویض ، مانند changeAnimation () ، changeSpeed () و changeColor () در وقفه timer2 فراخوانی می شوند ، بنابراین از تاخیر () یا سایر عملکردهای مبتنی بر وقفه در آن استفاده نکنید.

توصیه شده: