İçindekiler:

Noel Müziği Tezahürat Işığı: 4 Adım
Noel Müziği Tezahürat Işığı: 4 Adım

Video: Noel Müziği Tezahürat Işığı: 4 Adım

Video: Noel Müziği Tezahürat Işığı: 4 Adım
Video: Çılgın ben!Yılbaşı kutlicem🎄🎅 2024, Kasım
Anonim
Noel Müziği Tezahürat Işığı
Noel Müziği Tezahürat Işığı

Mutlu Noeller! Sizinle etkileşime girebilecek bir Noel ağacına sahip olmak ister misiniz?

Adım 1: Bu Projede Kullanılanlar

Donanım bileşenleri

  • Seeduino V4.2
  • Temel Kalkan V2
  • Grove - Ayarlanabilir PIR Hareket Sensörü
  • Grove - Ses Yüksekliği Sensörü
  • Grove - WS2813 RGB LED Şerit Su Geçirmez - 60 LED/m - 1m

Yazılım uygulamaları ve çevrimiçi hizmetler

Arduino IDE'si

2. Adım: Donanım Bağlantısı

Donanım Bağlantısı
Donanım Bağlantısı

PIR Sensörü, Ses Yüksekliği Sensörü ve LED şeridi Base Shield'in D2, A0 ve D6 bağlantı noktalarına ayrı ayrı bağlayın. Base Shield'ı Seeduino'ya takın, hepsi bitti.

Adım 3: Yazılım Programlama

Aşağıdaki kitaplıkların programlamadan önce yüklenmesi gerekir, lütfen bunları manuel olarak indirin ve Arduino IDE'nize aktarın:

  • LED şerit
  • MsTimer2
  • Arduino_Vektör

Kodu daha özlü hale getirmek için paketledik. CheerLight sınıfı bu projenin uygulama sınıfıdır.

sınıf uygulaması::CheerLight

: public application::interface::IApplication { public: void setup(void); boşluk döngüsü(boşluk); geçersiz setPIRSensorPin(uint8_t pin); geçersiz setLoudnessSensorPin(uint8_t pin); void MeasureSensors(void); void changeAnimation(void * argümanlar); void changeSpeed(void * argümanlar); geçersiz changeColor(void * argümanlar); statik uygulama::CheerLight * getInstance(void); korumalı: sürücü::LEDStrip _ledStrip; sürücü::PIRSensor _pirSensor; sürücü::LoudnessSensor _loudnessSensor; uint8_t _animasyon; ara katman yazılımı::Delegate _detectedDelegate; ara katman yazılımı::Delegate _absoluteLoudnessDelegate; ara katman yazılımı::Delegate _relativeLoudnessDelegate; CheerLight(boş); statik uygulama::CheerLight _instance; };

CheerLight sınıfı Singleton Patterns tarafından tasarlanmıştır, bu onun için yalnızca bir örnek olduğu anlamına gelir, o örneğe CheerLight::getInstance() öğesini çağırabilirsiniz. Sensörlerinizin bağlantısı Donanım Bağlantısından farklıysa, bunları setPIRSensorPin() ve setLoudnessSensorPin() yöntemlerini çağırarak değiştirebilirsiniz.

resim
resim

Sensörlerin zamanında ölçülmesini sağlamak için zamanlayıcı kesmesinde MeasureSensors() yöntemini çağırmanızı öneririz, ancak changeAnimation(), changeSpeed() veya changeColor() yöntemlerini manuel olarak çağırmak gerekli değildir. Sensörler ölçüldüğünde Delegeler aracılığıyla çağrılacaklardır.

Delege nedir?

Hepimizin bildiği gibi, bir işlev işaretçisi bildirebilir ve C'deki bir işlevi işaret etmesini sağlayabiliriz:

void func1(void);

void (*pFunc)(void) = func1;

ve işaret ettiği işlevi çağırmak için kullanın

pFunc();

Ancak aşağıdaki kodu derlemeye çalışırsanız, C++'da farklılıklar vardır:

a sınıfı {

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

derleyici bir tür dönüştürme hatası bildirir, işte doğru örnek:

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

Bu yöntemi çağırmak için kullanmayı denediğimizde tekrar hata veriyor. Bu hatanın nedeni, bir nesne yönteminin bir nesne tarafından çağrılması gerektiğidir. Böylece onu çağırmak için bir nesne yaratıyoruz:

bir;

a.*pFunc();

Bu sefer sorun yok. Yani Delegate.h'de Delegate sınıfı var.

şablon

class ara katman yazılımı::Delegate: public ara katman yazılımı::interface::IDelegate { public: Delege(T * nesne, void (T::*method)(void *)); void invoke(void * argümanlar); korumalı: T * _object; void (T::*_method)(void *); }; şablon satır içi ara katman yazılımı:: Temsilci:: Temsilci(T * nesne, geçersiz (T::*yöntem)(geçersiz *)): _nesne(nesne), _method(yöntem) { } şablon satır içi geçersiz ara katman yazılımı::Delegate::invoke(void * argümanlar) { (_object->*_method)(args); }

Delege sınıfı bir şablon sınıfı olduğundan, bu, Delegenin Delegeden farkı olduğu anlamına gelir, aynı tipte işaretçi tarafından işaret edilmeleri nasıl sağlanır? Cevap arayüzdür, yani IDelegate.h'de IDelegate arayüzü vardır.

sınıf ara katman yazılımı::interface::IDelegate {

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

PIR Sensor ve Loudness Sensor'ın sınıfında, Delegelerin işaretçisini depolamak için kullanılan _delegates adında bir değişken ve _delegates içindeki tüm Delegeleri çağırmak için kullanılan invokeAllDelegates() adında bir yöntemi var, Measure() yönteminde çağrılacak.

NOT: changeAnimation(), changeSpeed() ve changeColor() gibi temsilci yöntemleri timer2 kesmesinde çağrılır, bu nedenle içinde delay() veya diğer kesme tabanlı işlevleri KULLANMAYIN.

Önerilen: