สารบัญ:

ไฟคริสต์มาสเพลงเชียร์: 4 ขั้นตอน
ไฟคริสต์มาสเพลงเชียร์: 4 ขั้นตอน

วีดีโอ: ไฟคริสต์มาสเพลงเชียร์: 4 ขั้นตอน

วีดีโอ: ไฟคริสต์มาสเพลงเชียร์: 4 ขั้นตอน
วีดีโอ: เพลงเชียร์ลีดเดอร์ กีฬาสี เต็มวง Version Cover !!! น้องดาว 2024, พฤศจิกายน
Anonim
ไฟคริสต์มาสเพลงเชียร์
ไฟคริสต์มาสเพลงเชียร์

สุขสันต์วันคริสต์มาส! คุณต้องการมีต้นคริสต์มาสที่สามารถโต้ตอบกับคุณได้หรือไม่?

ขั้นตอนที่ 1: สิ่งที่ใช้ในโครงการนี้

ส่วนประกอบฮาร์ดแวร์

  • Seeduino V4.2
  • เกราะฐาน V2
  • Grove - เซ็นเซอร์ตรวจจับความเคลื่อนไหว PIR แบบปรับได้
  • Grove - เซ็นเซอร์ความดัง
  • Grove - WS2813 RGB LED Strip กันน้ำได้ - 60 LED/m - 1m

แอพซอฟต์แวร์และบริการออนไลน์

Arduino IDE

ขั้นตอนที่ 2: การเชื่อมต่อฮาร์ดแวร์

การเชื่อมต่อฮาร์ดแวร์
การเชื่อมต่อฮาร์ดแวร์

เชื่อมต่อเซ็นเซอร์ PIR, เซ็นเซอร์ความดัง และแถบ LED เข้ากับพอร์ต D2, A0 และ D6 ของ Base Shield เสียบปลั๊ก Base Shield กับ Seeduino เสร็จแล้ว

ขั้นตอนที่ 3: การเขียนโปรแกรมซอฟต์แวร์

ไลบรารีที่ตามมาจำเป็นต้องติดตั้งก่อนเขียนโปรแกรม โปรดดาวน์โหลดและนำเข้าไปยัง Arduino IDE ของคุณด้วยตนเอง:

  • Led_Strip
  • MsTimer2
  • Arduino_Vector

เพื่อให้โค้ดกระชับขึ้น เราได้ทำแพ็กเกจไว้ คลาส CheerLight เป็นคลาสแอปพลิเคชันของโปรเจ็กต์นี้

การสมัครเรียน::CheerLight

: แอปพลิเคชันสาธารณะ:: อินเทอร์เฟซ:: IApplication { สาธารณะ: การตั้งค่าเป็นโมฆะ (เป็นโมฆะ); วงโมฆะ(เป็นโมฆะ); เป็นโมฆะ setPIRSensorPin (uint8_t pin); เป็นโมฆะ setLoudnessSensorPin (พิน uint8_t); โมฆะวัดเซ็นเซอร์ (เป็นโมฆะ); โมฆะ changeAnimation (โมฆะ * args); โมฆะ changeSpeed (โมฆะ * args); โมฆะ changeColor(โมฆะ * args); แอปพลิเคชันแบบคงที่::CheerLight * getInstance(เป็นโมฆะ); ป้องกัน: ไดรเวอร์::LEDStrip _ledStrip; ไดรเวอร์::PIRSensor _pirSensor; ไดรเวอร์::LoudnessSensor _loudnessSensor; uint8_t _แอนิเมชั่น; มิดเดิลแวร์::ผู้รับมอบสิทธิ์ _detectedDelegate; มิดเดิลแวร์::ผู้รับมอบสิทธิ์ _absoluteLoudnessDelegate; มิดเดิลแวร์::ผู้รับมอบสิทธิ์ _relativeLoudnessDelegate; CheerLight(โมฆะ); แอปพลิเคชันแบบคงที่::CheerLight _instance; };

คลาส CheerLight ได้รับการออกแบบโดย Singleton Patterns ซึ่งหมายความว่ามีเพียงอินสแตนซ์เดียวเท่านั้น คุณสามารถเรียก CheerLight::getInstance() ไปยังอินสแตนซ์นั้นได้ หากการเชื่อมต่อของเซ็นเซอร์ต่างจากการเชื่อมต่อฮาร์ดแวร์ คุณสามารถเปลี่ยนได้โดยเรียกใช้เมธอด setPIRSensorPin() และ setLoudnessSensorPin()

ภาพ
ภาพ

เราขอแนะนำให้เรียกวิธี MeasureSensors() ในการขัดจังหวะตัวจับเวลาเพื่อให้เซ็นเซอร์วัดได้ทันเวลา แต่ไม่จำเป็นต้องเรียกเมธอด changeAnimation(), changeSpeed() หรือ changeColor() ด้วยตนเอง พวกเขาจะถูกเรียกผ่านผู้รับมอบสิทธิ์เมื่อทำการวัดเซ็นเซอร์

ผู้แทนคืออะไร?

อย่างที่เราทราบกันดีว่า เราสามารถประกาศตัวชี้ฟังก์ชันและกำหนดให้ชี้ไปที่ฟังก์ชันใน C:

โมฆะ func1(โมฆะ);

เป็นโมฆะ (*pFunc)(เป็นโมฆะ) = func1;

และเรียกใช้ฟังก์ชันที่ชี้ไปที่

pFunc();

แต่มีความแตกต่างใน C++ หากคุณพยายามคอมไพล์โค้ดดังต่อไปนี้:

คลาส A {

สาธารณะ: โมฆะ func1(โมฆะ); }; โมฆะ (*pFunc)(โมฆะ) = &A::func1;

คอมไพเลอร์จะรายงานข้อผิดพลาดในการแปลงประเภท นี่คือตัวอย่างที่ถูกต้อง:

เป็นโมฆะ (A::*pFunc)(void) = &A::func1;

เมื่อเราลองใช้มันเรียกวิธีการนั้นผิดพลาดอีกครั้ง สาเหตุของข้อผิดพลาดนั้นคืออ็อบเจ็กต์ต้องเรียกวิธีการอ็อบเจ็กต์ ดังนั้นเราจึงสร้างวัตถุเพื่อเรียกมันว่า:

เอ เอ;

ก.*pFunc();

คราวนี้ไม่มีปัญหา จึงมีคลาส Delegate ใน Delegate.h

แม่แบบ

มิดเดิลแวร์ระดับ::ผู้รับมอบสิทธิ์: มิดเดิลแวร์สาธารณะ::อินเทอร์เฟซ:: IDelegate { สาธารณะ: ผู้รับมอบสิทธิ์ (วัตถุ T * เป็นโมฆะ (T::* วิธี) (โมฆะ *)); โมฆะเรียก(โมฆะ * args); ป้องกัน: T * _object; เป็นโมฆะ (T::*_method)(เป็นโมฆะ *); }; เทมเพลตอินไลน์มิดเดิลแวร์::Delegate::Delegate(T * object, void (T::*method)(void *)): _object(object), _method(method) { } template inline void middleware::Delegate::invoke(เป็นโมฆะ * args) { (_object->*_method)(args); }

เนื่องจากคลาส Delegate เป็นคลาสเทมเพลต ซึ่งหมายความว่า Delegate แตกต่างจาก Delegate จะทำให้ตัวชี้มีประเภทเดียวกันได้อย่างไร คำตอบคืออินเทอร์เฟซ ดังนั้นจึงมีอินเทอร์เฟซ IDelegate ใน IDelegate.h

มิดเดิลแวร์ระดับ::อินเทอร์เฟซ::Idelegate {

สาธารณะ: เรียกใช้โมฆะเสมือน (เป็นโมฆะ * args) = 0; };

ในคลาสของ PIR Sensor และ Loudness Sensor มีตัวแปรชื่อ _delegates ที่ใช้เก็บตัวชี้ของ Delegates และมีวิธีชื่อ invokeAllDelegates() ที่ใช้เรียก Delegates ทั้งหมดใน _delegates ซึ่งจะถูกเรียกใน method วัด ()

หมายเหตุ: วิธีการของผู้รับมอบสิทธิ์ เช่น changeAnimation(), changeSpeed() และ changeColor() จะถูกเรียกในการขัดจังหวะ timer2 ดังนั้นอย่าใช้ delay() หรือฟังก์ชันอื่น ๆ ที่อิงตามการขัดจังหวะ

แนะนำ: