Índice:

Luz de alegria da música de Natal: 4 etapas
Luz de alegria da música de Natal: 4 etapas

Vídeo: Luz de alegria da música de Natal: 4 etapas

Vídeo: Luz de alegria da música de Natal: 4 etapas
Vídeo: Coreografia- Natal, tempo de alegria 2024, Novembro
Anonim
Christmas Music Cheer Light
Christmas Music Cheer Light

Feliz Natal! Quer ter uma árvore de natal que possa interagir com você?

Etapa 1: Coisas usadas neste projeto

Componentes de hardware

  • Seeeduino V4.2
  • Escudo de Base V2
  • Grove - Sensor de Movimento PIR Ajustável
  • Grove - Sensor de Loudness
  • Grove - Faixa LED WS2813 RGB à prova d'água - 60 LED / m - 1m

Aplicativos de software e serviços online

IDE Arduino

Etapa 2: Conexão de Hardware

Conexão de Hardware
Conexão de Hardware

Conecte o sensor PIR, o sensor de intensidade e a faixa de LED às portas D2, A0 e D6 da blindagem da base separadamente. Conecte a Base Shield ao Seeduino, tudo pronto.

Etapa 3: Programação de software

As bibliotecas a seguir precisam ser instaladas antes de programar, baixe e importe-as para o seu Arduino IDE manualmente:

  • Led_Strip
  • MsTimer2
  • Arduino_Vector

Para tornar o código mais conciso, nós o empacotamos. A classe CheerLight é a classe de aplicativo deste projeto.

aplicação de classe:: CheerLight

: public application:: interface:: IApplication {public: void setup (void); loop vazio (vazio); void setPIRSensorPin (uint8_t pin); void setLoudnessSensorPin (uint8_t pin); void measureSensors (void); void changeAnimation (void * args); void changeSpeed (void * args); void changeColor (void * args); aplicativo estático:: CheerLight * getInstance (void); protegido: driver:: LEDStrip _ledStrip; driver:: PIRSensor _pirSensor; driver:: LoudnessSensor _loudnessSensor; uint8_t _animation; middleware:: Delegate _detectedDelegate; middleware:: Delegate _absoluteLoudnessDelegate; middleware:: Delegate _relativeLoudnessDelegate; CheerLight (vazio); aplicativo estático:: CheerLight _instance; };

A classe CheerLight foi projetada por Singleton Patterns, o que significa que há apenas uma instância para ela, você pode chamar CheerLight:: getInstance () para essa instância. Se a conexão de seus sensores for diferente da conexão de hardware, você pode alterá-los chamando os métodos setPIRSensorPin () e setLoudnessSensorPin ().

Imagem
Imagem

Recomendamos chamar o método measureSensors () na interrupção do cronômetro para tornar os sensores medidos oportunos, mas chamar os métodos changeAnimation (), changeSpeed () ou changeColor () manualmente não são necessários. Eles serão chamados por meio de Delegados quando os sensores forem medidos.

O que é um delegado?

Como todos sabemos, podemos declarar um ponteiro de função e fazer com que ele aponte para uma função em C:

void func1 (void);

void (* pFunc) (void) = func1;

e usá-lo para chamar a função apontada

pFunc ();

Mas existem diferenças em C ++, se você tentar compilar o código a seguir:

classe A {

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

o compilador relatará um erro de conversão de tipo, aqui está o exemplo certo:

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

Quando tentamos usá-lo para chamar esse método, erramos novamente. A razão para esse erro é que um método-objeto deve ser chamado por um objeto. Então, criamos um objeto para chamá-lo:

A a;

a. * pFunc ();

Desta vez não há problema. Portanto, há a classe Delegate em Delegate.h.

modelo

classe middleware:: Delegate: public middleware:: interface:: IDelegate {public: Delegate (objeto T *, void (método T:: *) (void *)); void invoke (void * args); protegido: T * _object; void (método T:: * _) (void *); }; template embutido middleware:: Delegate:: Delegate (T * objeto, void (T:: * método) (void *)): _object (objeto), _method (método) {} template embutido void middleware:: Delegate:: invoke (void * args) {(_object -> * _ método) (args); }

Como a classe Delegate é uma classe de modelo, o que significa que Delegate é uma diferença para Delegate, como fazer com que sejam apontados por um ponteiro do mesmo tipo? A resposta é interface, portanto, há interface IDelegate em IDelegate.h.

class middleware:: interface:: IDelegate {

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

Na classe PIR Sensor e Loudness Sensor, há uma variável chamada _delegates usada para armazenar o ponteiro de Delegates, e há um método chamado invokeAllDelegates () usado para invocar todos os Delegates em _delegates, ele será chamado no método measure ().

NOTA: Métodos de delegação, como changeAnimation (), changeSpeed () e changeColor () serão chamados na interrupção timer2, então NÃO use delay () ou outra função baseada em interrupção nela.

Recomendado: