Mündəricat:

Milad Musiqisi Cheer Light: 4 addım
Milad Musiqisi Cheer Light: 4 addım

Video: Milad Musiqisi Cheer Light: 4 addım

Video: Milad Musiqisi Cheer Light: 4 addım
Video: Мне стыдно 4. Шоу постыдных историй. В гостях Аскар Ильясов, Мадина Байболова и Джамбул Кульдеев 2024, Noyabr
Anonim
Milad musiqisi şən işıq
Milad musiqisi şən işıq

Milad bayramınız mübarək! Sizinlə ünsiyyət qura biləcək bir Milad ağacına sahib olmaq istəyirsinizmi?

Addım 1: Bu Layihədə İstifadə Edilən Şeylər

Avadanlıq komponentləri

  • Seeeduino V4.2
  • Əsas qalxan V2
  • Grove - Ayarlanabilir PIR Hərəkət Sensoru
  • Grove - Səs Sensoru
  • Grove - Suya davamlı WS2813 RGB LED Şeridi - 60 LED/m - 1m

Proqram proqramları və onlayn xidmətlər

Arduino IDE

Addım 2: Avadanlıq Bağlantısı

Avadanlıq Bağlantısı
Avadanlıq Bağlantısı

PIR Sensor, Loudness Sensor və LED şeridi ayrı olaraq Base Shield -in D2, A0 və D6 portuna qoşun. Seeduino'ya Baza Qalxanı bağlayın, hamısı hazırdır.

Addım 3: Proqramlaşdırma

Aşağıdakı kitabxanaların proqramlaşdırmadan əvvəl yükləməsi lazımdır, zəhmət olmasa onları Arduino IDE -yə əl ilə yükləyin və idxal edin:

  • Led_Strip
  • MsTimer2
  • Arduino_Vector

Kodu daha qısa etmək üçün onu qablaşdırdıq. CheerLight sinfi bu layihənin tətbiq sinifidir.

sinif tətbiqi:: CheerLight

: ictimai tətbiq:: interfeys:: IApplication {public: void setup (void); boşluq döngəsi (boşluq); boşluq setPIRSensorPin (uint8_t pin); boşluq setLoudnessSensorPin (uint8_t pin); boşluq ölçüsüSensorlar (boş); void changeAnimation (void * args); void changeSpeed (void * args); void changeColor (void * args); statik tətbiq:: CheerLight * getInstance (etibarsız); qorunan: sürücü:: LEDStrip _ledStrip; sürücü:: PIRSensor _pirSensor; sürücü:: LoudnessSensor _loudnessSensor; uint8_t _ canlandırma; ara proqram:: Delegate _detectedDelegate; ara proqram:: Delegate _absoluteLoudnessDelegate; ara proqram:: Delegate _relationLoudnessDelegate; CheerLight (boş); statik tətbiq:: CheerLight _instance; };

CheerLight sinfi Singleton Patterns tərəfindən hazırlanmışdır, yəni bunun üçün yalnız bir nümunə var, o nümunəyə CheerLight:: getInstance () deyə bilərsiniz. Sensorlarınızın bağlantısı Hardware Connection -dan fərqlənirsə, onları setPIRSensorPin () və setLoudnessSensorPin () metodlarına zəng edərək dəyişə bilərsiniz.

Şəkil
Şəkil

Sensorların vaxtında ölçülməsi üçün ölçmə fasiləsində ölçmə sensoru () metoduna zəng etməyi məsləhət görürük, lakin changeAnimation (), changeSpeed () və ya changeColor () metodlarını əl ilə çağırmaq lazım deyil. Sensorlar ölçüləndə nümayəndələr vasitəsilə çağırılacaqlar.

Nümayəndə nədir?

Hamımızın bildiyimiz kimi, bir funksiya göstəricisi elan edə bilərik və onu C -də bir funksiyaya işarə edə bilərik:

void func1 (boş);

void (*pFunc) (void) = func1;

və göstərdiyi funksiyanı çağırmaq üçün istifadə edin

pFunc ();

Aşağıdakı kodu tərtib etməyə çalışarsanız, C ++ da fərqlər var:

sinif A {

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

tərtibçi bir növ dönüşüm səhvini bildirəcək, burada doğru nümunədir:

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

Bu metodu çağırmaq üçün istifadə etməyə çalışdığımız zaman yenidən səhv edirik. Bu səhvin səbəbi, bir obyekt metodunun bir obyekt tərəfindən çağrılmasıdır. Buna görə zəng etmək üçün bir obyekt yaradırıq:

A a;

a.*pFunc ();

Bu dəfə heç bir problem yoxdur. Beləliklə Delegate.h -də Delegate sinfi var.

şablon

sinif ara proqramı:: Delege: ümumi ara proqram:: interfeys:: IDelegate {public: Delegate (T *object, void (T:: *method) (void *)); void invoke (void * args); qorunan: T * _object; void (T:: *_ metodu) (boş *); }; şablon inline ara proqram:: Delegate:: Delegate (T *obyekt, void (T:: *metodu) (void *)): _object (obyekt), _method (metod) {} şablon daxili boşluq ara proqramı:: Delegate:: invoke (void * args) {(_object-> * _ metodu) (args); }

Delegate sinfi bir şablon sinif olduğu üçün Delegenin Delegenin fərqi olduğu üçün eyni tipli göstərici ilə necə göstərilməsini təmin etmək olar? Cavab interfeysdir, buna görə IDelegate.h -də IDelegate interfeysi var.

sinif orta proqram:: interfeys:: IDelegate {

public: virtual void invoke (void * args) = 0; };

PIR Sensor və Loudness Sensor sinifində, Delegatların göstəricisini saxlamaq üçün istifadə olunan _delegates adlı bir dəyişən var və bütün Delegeleri _delegates -ə çağırmaq üçün istifadə olunan invokeAllDelegates () adlı bir metod var, buna tədbir () metodu deyilir.

Qeyd: changeAnimation (), changeSpeed () və changeColor () kimi səlahiyyətli metodlar timer2 ara verilişində çağırılacaq, buna görə də gecikmə () və ya digər kəsilməyə əsaslanan funksiyanı QULLANMAYIN.

Tövsiyə: