Мазмуну:

Christmas Music Cheer Light: 4 кадам
Christmas Music Cheer Light: 4 кадам

Video: Christmas Music Cheer Light: 4 кадам

Video: Christmas Music Cheer Light: 4 кадам
Video: ##Cheer Dance Performance (MLZS ARA) on the occasion of annual sports day Chore by Mr Manish & Monty 2024, Ноябрь
Anonim
Christmas Music Cheer Light
Christmas Music Cheer Light

Рождество майрамы менен! Сиз менен баарлаша турган жаңы жылдык балаты болгуңуз келеби?

1 -кадам: Бул долбоордо колдонулган нерселер

Аппараттык компоненттер

  • Seeeduino V4.2
  • Негизги калкан V2
  • Grove - жөнгө салынуучу PIR Motion Sensor
  • Grove - Үндүн сенсору
  • Grove - WS2813 RGB LED тилкеси суу өткөрбөйт - 60 LED/m - 1m

Программалык камсыздоо жана онлайн кызматтары

Arduino IDE

2 -кадам: Аппараттык туташуу

Аппараттык туташуу
Аппараттык туташуу

PIR Sensor, Loudness Sensor жана LED тилкесин Base Shieldдин D2, A0 жана D6 портуна өзүнчө туташтырыңыз. Seeduino үчүн Base Shield плагин, баары жасалды.

3 -кадам: Программалык камсыздоо

Төмөнкү китепканалар программалоодон мурун орнотулушу керек, аларды жүктөп алып, Arduino IDEге кол менен импорттоңуз:

  • Led_Strip
  • MsTimer2
  • Arduino_Vector

Кодду кыскаыраак кылуу үчүн, биз аны пакеттедик. CheerLight классы - бул долбоордун колдонмо классы.

класс колдонмосу:: CheerLight

: коомдук тиркеме:: интерфейс:: IApplication {public: void setup (void); боштук цикл (боштук); жараксыз setPIRSensorPin (uint8_t пин); жараксыз setLoudnessSensorPin (uint8_t пин); жараксыз чараSensors (боштук); void changeAnimation (void * args); void changeSpeed (void * args); void changeColor (void * args); статикалык колдонмо:: CheerLight * getInstance (жараксыз); корголгон: айдоочу:: LEDStrip _ledStrip; айдоочу:: PIRSensor _pirSensor; айдоочу:: LoudnessSensor _loudnessSensor; uint8_t _animation; middleware:: Delegate _detectedDelegate; middleware:: Delegate _absoluteLoudnessDelegate; middleware:: Delegate _relatіLoudnessDelegate; CheerLight (жараксыз); статикалык колдонмо:: CheerLight _instance; };

CheerLight классы Singleton Patterns тарабынан иштелип чыккан, демек ал үчүн бир гана мисал бар, сиз ошол инстанцияга CheerLight:: getInstance () деп чалсаңыз болот. Эгерде сенсорлоруңуздун туташуусу Аппараттык туташуудан айырмасы болсо, анда аларды setPIRSensorPin () жана setLoudnessSensorPin () ыкмаларына чалуу менен өзгөртө аласыз.

Сүрөт
Сүрөт

Биз сенсорлорду өз убагында өлчөө үчүн, таймердеги үзгүлтүккө чакыруу өлчөө Sensors () ыкмасын сунуштайбыз, бирок changeAnimation (), changeSpeed () же changeColor () ыкмаларын кол менен чакыруунун кажети жок. Сенсорлор өлчөнгөндө, алар делегаттар аркылуу чакырылат.

Делегат деген эмне?

Баарыбызга белгилүү болгондой, биз функция көрсөткүчүн жарыялай алабыз жана аны C функциясына көрсөтө алабыз:

void func1 (жараксыз);

void (*pFunc) (void) = func1;

жана аны көрсөткөн функцияны чакыруу үчүн колдонуңуз

pFunc ();

Бирок C ++ тилинде айырмачылыктар бар, эгер сиз төмөндөгү кодду түзүүгө аракет кылсаңыз:

класс А {

коомдук: void func1 (жараксыз); }; void (*pFunc) (void) = & A:: func1;

компилятор бир түрдөгү ката жөнүндө кабарлайт, бул жерде туура мисал:

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

Биз ошол ыкманы чакыруу үчүн колдонууга аракет кылганыбызда, кайра ката кетиребиз. Бул катанын себеби, объект-метод бир объект тарабынан чакырылышы керек. Ошентип, биз аны чакыруу үчүн объект түзөбүз:

A a;

a.*pFunc ();

Бул жолу көйгөй жок. Ошентип, Delegate.hде Delegate классы бар.

шаблон

класс орто программасы:: Делегат: коомдук орто программалык камсыздоо:: интерфейс:: IDelegate {коомдук: Делегат (T *объектиси, жараксыздыгы (T:: *ыкмасы) (жараксыз *)); void invoke (void * args); корголгон: T * _объект; жараксыз (T:: *_ ыкмасы) (жараксыз *); }; шаблондун ортоңку программасы:: Делегат:: Делегат (T *объектиси, жараксыздыгы (T:: *методу) (жараксыздыгы *)): _объект (объект), _ метод (метод) {} шаблон киргизилген боштуктун орто программасы:: Делегат:: чакыруу (void * args) {(_object-> * _ метод) (args); }

Делегат класс шаблон класс болгондуктан, Делегаттын Делегаттан айырмасы бар дегенди билдирет, аларды кантип бирдей типтеги көрсөткүч менен көрсөтүүгө болот? Жооп интерфейс, ошондуктан IDelegate.hде IDelegate интерфейси бар.

класс орто программасы:: интерфейс:: IDelegate {

коомдук: виртуалдык боштукту чакыруу (void * args) = 0; };

PIR Sensor жана Loudness Sensor классында Делегаттардын көрсөткүчүн сактоо үчүн колдонулган _delegates деген өзгөрмөсү бар жана _delegates -те бардык делегаттарды чакыруу үчүн колдонулган invokeAllDelegates () деген методу бар, бул чара () ыкмасы деп аталат.

ЭСКЕРТҮҮ: ChangeAnimation (), changeSpeed () жана changeColor () сыяктуу өкүлчүлүк ыкмалары timer2 үзгүлтүккө чакырылат, андыктан delay () же башка үзгүлтүккө негизделген функцияны колдонбоңуз.

Сунушталууда: