สารบัญ:
- ขั้นตอนที่ 1: สิ่งที่ใช้ในโครงการนี้
- ขั้นตอนที่ 2: การเชื่อมต่อฮาร์ดแวร์
- ขั้นตอนที่ 3: การเขียนโปรแกรมซอฟต์แวร์
- ขั้นตอนที่ 4: การใช้งาน
วีดีโอ: ไฟคริสต์มาสเพลงเชียร์: 4 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:06
สุขสันต์วันคริสต์มาส! คุณต้องการมีต้นคริสต์มาสที่สามารถโต้ตอบกับคุณได้หรือไม่?
ขั้นตอนที่ 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() หรือฟังก์ชันอื่น ๆ ที่อิงตามการขัดจังหวะ
แนะนำ:
การออกแบบเกมในการสะบัดใน 5 ขั้นตอน: 5 ขั้นตอน
การออกแบบเกมในการสะบัดใน 5 ขั้นตอน: การตวัดเป็นวิธีง่ายๆ ในการสร้างเกม โดยเฉพาะอย่างยิ่งเกมปริศนา นิยายภาพ หรือเกมผจญภัย
การตรวจจับใบหน้าบน Raspberry Pi 4B ใน 3 ขั้นตอน: 3 ขั้นตอน
การตรวจจับใบหน้าบน Raspberry Pi 4B ใน 3 ขั้นตอน: ในคำแนะนำนี้ เราจะทำการตรวจจับใบหน้าบน Raspberry Pi 4 ด้วย Shunya O/S โดยใช้ Shunyaface Library Shunyaface เป็นห้องสมุดจดจำใบหน้า/ตรวจจับใบหน้า โปรเจ็กต์นี้มีจุดมุ่งหมายเพื่อให้เกิดความเร็วในการตรวจจับและจดจำได้เร็วที่สุดด้วย
วิธีการติดตั้งปลั๊กอินใน WordPress ใน 3 ขั้นตอน: 3 ขั้นตอน
วิธีการติดตั้งปลั๊กอินใน WordPress ใน 3 ขั้นตอน: ในบทช่วยสอนนี้ ฉันจะแสดงขั้นตอนสำคัญในการติดตั้งปลั๊กอิน WordPress ให้กับเว็บไซต์ของคุณ โดยทั่วไป คุณสามารถติดตั้งปลั๊กอินได้สองวิธี วิธีแรกคือผ่าน ftp หรือผ่าน cpanel แต่ฉันจะไม่แสดงมันเพราะมันสอดคล้องกับ
การลอยแบบอะคูสติกด้วย Arduino Uno ทีละขั้นตอน (8 ขั้นตอน): 8 ขั้นตอน
การลอยแบบอะคูสติกด้วย Arduino Uno ทีละขั้นตอน (8 ขั้นตอน): ตัวแปลงสัญญาณเสียงล้ำเสียง L298N Dc ตัวเมียอะแดปเตอร์จ่ายไฟพร้อมขา DC ตัวผู้ Arduino UNOBreadboardวิธีการทำงาน: ก่อนอื่น คุณอัปโหลดรหัสไปยัง Arduino Uno (เป็นไมโครคอนโทรลเลอร์ที่ติดตั้งดิจิตอล และพอร์ตแอนะล็อกเพื่อแปลงรหัส (C++)
เครื่อง Rube Goldberg 11 ขั้นตอน: 8 ขั้นตอน
เครื่อง 11 Step Rube Goldberg: โครงการนี้เป็นเครื่อง 11 Step Rube Goldberg ซึ่งออกแบบมาเพื่อสร้างงานง่ายๆ ในรูปแบบที่ซับซ้อน งานของโครงการนี้คือการจับสบู่ก้อนหนึ่ง