Spisu treści:
- Krok 1: Rzeczy użyte w tym projekcie
- Krok 2: Połączenie sprzętowe
- Krok 3: Programowanie oprogramowania
- Krok 4: Operacja
Wideo: Świąteczna muzyka Cheer Light: 4 kroki
2024 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2024-01-30 11:31
Wesołych Świąt! Czy chcesz mieć choinkę, która może wchodzić w interakcje z tobą?
Krok 1: Rzeczy użyte w tym projekcie
Komponenty sprzętowe
- Seeeduino V4.2
- Tarcza podstawowa V2
- Grove - Regulowany czujnik ruchu PIR
- Grove - czujnik głośności
- Grove - Taśma LED RGB WS2813 Wodoodporna - 60 LED/m - 1m
Aplikacje i usługi online
IDE Arduino
Krok 2: Połączenie sprzętowe
Podłącz czujnik PIR, czujnik głośności i pasek LED do portów D2, A0 i D6 osłony podstawy oddzielnie. Podłącz osłonę podstawy do Seeduino, wszystko gotowe.
Krok 3: Programowanie oprogramowania
Poniższe biblioteki muszą zostać zainstalowane przed programowaniem, pobierz je i zaimportuj ręcznie do swojego Arduino IDE:
- Pasek ledowy
- MsTimer2
- Arduino_Vector
Aby kod był bardziej zwięzły, spakowaliśmy go. Klasa CheerLight to klasa aplikacji tego projektu.
Aplikacja klasy::CheerLight
: public application::interface::IApplication { public: void setup(void); pusta pętla(pusta); 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); aplikacja statyczna::CheerLight * getInstance(void); chroniony: driver::LEDStrip _ledStrip; sterownik::PIRSensor _pirSensor; driver::LoudnessSensor _loudnessSensor; uint8_t _animacja; oprogramowanie pośredniczące::Delegate _detectedDelegate; oprogramowanie pośredniczące::Delegate _absoluteLoudnessDelegate; oprogramowanie pośredniczące::Delegate _relativeLoudnessDelegate; CheerLight (unieważnione); aplikacja statyczna::CheerLight _instance; };
Klasa CheerLight została zaprojektowana przez Singleton Patterns, co oznacza, że istnieje tylko jedna instancja dla tej instancji, możesz wywołać CheerLight::getInstance() do tej instancji. Jeśli połączenie Twoich czujników różni się od połączenia sprzętowego, możesz je zmienić, wywołując metody setPIRSensorPin() i setLoudnessSensorPin().
Zalecamy wywołanie metody MeasureSensors() w przerwaniu czasowym, aby czujniki były mierzone w odpowiednim czasie, ale ręczne wywoływanie metod changeAnimation(), changeSpeed() lub changeColor() nie jest konieczne. Będą one wywoływane przez delegatów podczas pomiaru czujników.
Kim jest delegat?
Jak wszyscy wiemy, możemy zadeklarować wskaźnik do funkcji i sprawić, by wskazywał na funkcję w C:
void func1(unieważniony);
nieważne (*pFunc)(nieważne) = func1;
i użyj go, aby wywołać wskazaną funkcję
pFunc();
Ale są różnice w C++, jeśli spróbujesz skompilować kod w następujący sposób:
klasa A {
public: void func1(void); }; nieważne (*pFunc)(nieważne) = &A::func1;
kompilator zgłosi błąd konwersji typu, oto właściwy przykład:
void (A::*pFunc)(void) = &A::func1;
Kiedy próbujemy użyć go do wywołania tej metody, ponownie błąd. Powodem tego błędu jest to, że obiekt-metoda musi być wywołana przez obiekt. Więc tworzymy obiekt, aby go nazwać:
A;
a.*pFunc();
Tym razem nie ma problemu. Tak więc w Delegate.h jest klasa Delegate.
szablon
class middleware::Delegate: public middleware::interface::IDelegate { public: Delegate(T * obiekt, void (T::*method)(void *)); void invoke(void * argumenty); chroniony: T * _object; nieważne (T::*_metoda)(nieważne *); }; wbudowane oprogramowanie pośredniczące szablonu::Delegate::Delegate(T * obiekt, void (T::*method)(void *)): _object(object), _method(method) { } wbudowane oprogramowanie pośredniczące szablonu::Delegate::invoke(void * argumenty) { (_object->*_metoda)(argumenty); }
Ponieważ klasa Delegate jest klasą szablonową, co oznacza, że Delegate jest różnicą w stosunku do Delegate, jak sprawić, by były wskazywane przez wskaźnik, miały ten sam typ? Odpowiedzią jest interfejs, więc w IDelegate.h jest interfejs IDelegate.
class middleware::interface::IDelegate {
public: virtual void invoke(void * args) = 0; };
W klasie PIR Sensor i Loudness Sensor znajduje się zmienna o nazwie _delegates służąca do przechowywania wskaźnika Delegates oraz metoda o nazwie invokeAllDelegates() służąca do wywoływania wszystkich delegatów w _delegates, zostanie ona wywołana w metodzie Measure().
UWAGA: Metody delegujące, takie jak changeAnimation(), changeSpeed() i changeColor() będą wywoływane w przerwaniu timera2, więc NIE używaj w nim delay() ani innej funkcji opartej na przerwaniu.
Zalecana:
Świąteczna listwa oświetleniowa LED: 3 kroki
LED Christmas Light Strip: Chciałem stworzyć zabawny i świąteczny projekt Arduino na święta Bożego Narodzenia, więc postanowiłem stworzyć własne diody LED do samodzielnego montażu. Ten projekt wymaga maszyny do lutowania, więc miej to na uwadze
Większa i ulepszona świąteczna gwiazda Neopixel Attiny85: 3 kroki (ze zdjęciami)
Większa i ulepszona gwiazda świąteczna Neopixel Attiny85: W zeszłym roku zrobiłem małą gwiazdę świąteczną wydrukowaną w 3D, patrz https://www.instructables.com/id/Christmas-Star-LE… W tym roku zrobiłem większą gwiazdę z pasma 50 Neopikseli (5V WS2811). Ta większa gwiazda miała więcej wzorów (wciąż dodaję i poprawiam
Kontrolowana przez Wi-Fi dekoracja świąteczna: 4 kroki
Kontrolowana przez Wi-Fi dekoracja okna z oświetleniem bożonarodzeniowym: Kontroluj pasek świetlny LED z telefonu lub komputera - mnóstwo zabawnych świątecznych wzorów świetlnych
Świąteczna ozdoba PCB: 3 kroki (ze zdjęciami)
Świąteczna ozdoba PCB: Cześć wszystkim! Nadchodzi ta pora roku i sezon wymiany prezentów jest już prawie nad nami. Osobiście lubię robić rzeczy i dzielić się nimi z rodziną. W tym roku postanowiłem zrobić świąteczne ozdoby przy użyciu Atting85 i niektórych WS2812C 20
ARDUINO LED LIGHT MUZYKA REAKTYWNA: 4 kroki
ARDUINO LED LIGHT MUSIC REACTIVE: Witam, jeśli kochasz światła ledowe z muzyką, jest to dla ciebie świetna instrukcja. Bardzo łatwe