جدول المحتويات:
- الخطوة 1: قبل أن نبدأ
- الخطوة 2: الأجزاء المطلوبة
- الخطوة الثالثة: التوصيل وبناء الأجهزة
- الخطوة 4: إنشاء باستخدام 50 وحدة ضوئية
- الخطوة 5: Arduino Coding & Wiring
- الخطوة 6: النتيجة وصنع الفيلم
فيديو: اسحب الضوء - وحدة الإضاءة باستخدام مفتاح Neopixel والسحب لأعلى: 6 خطوات (بالصور)
2024 مؤلف: John Day | [email protected]. آخر تعديل: 2024-01-30 07:39
ميزات وحدة الضوء
- اردوينو اونو
- تم شراء الأجهزة والحاوية من الإنترنت
- Neopixel & Power Supply مستعار من مدرسة المعلوماتية وتصميم المنتجات
- يتم التحكم في وحدة الإضاءة بواسطة مزود الطاقة
- يتم التحكم في جميع الوظائف من خلال تفاعل المستخدمين
- أنواع الرسوم المتحركة لشريط Neopixel: نوع المطر ، نوع الدش ، نوع البرق ، نوع البوب ، النوع غير المنتظم
- يتم توصيل مفتاح السحب بشريط Neopixel وتتغير الرسوم المتحركة عند سحب شريط Neopixel
الخطوة 1: قبل أن نبدأ
مرحبًا Instructables and Makers.
بدأنا مشروع التصميم التفاعلي من حيث ما سيحدث إذا شعرنا بمشاعر المطر من خلال الرسوم المتحركة للضوء. اعتقدت أنه سيتم تعظيم حساسية المستخدم من خلال واجهة تسحب الضوء مباشرة.
لئلا يحصل على العمل
الخطوة 2: الأجزاء المطلوبة
بناء على وحدة إضاءة واحدة
*** تم استخدام Neopixels و Power Supply بدعم من قسمنا. ***
الإلكترونيات:
- اردوينو اونو
- 3 أسلاك ملونة (أسود ، أحمر ، أي لون)
- موصل 3pin (رابط للشراء)
- اسحب المفتاح 1 (رابط الشراء)
- تقلص الأنبوب
- WS2812b شريط LED قابل للإضافة مع 74 LED (شريط Neopixel) * 2
- مصدر الطاقة (5 فولت 350 أمبير) 1
*** هناك حاجة إلى 50 مجموعة لكل من Arduino و Pull Switch و NeoPixels. ***
المعدات:
- شريط أكريليك 2 طن (10 مم * 1000 مم) 1
- لوح أكريليك 5 طن (60 مم * 60 مم) 1
- Foemax 10t (1200 مم * 1800 مم) 1
- رذاذ أسود
- الكابل التعادل
- سلسلة
- لوح صلب
- لوحة الشبكة
الخطوة الثالثة: التوصيل وبناء الأجهزة
أولاً ، نحتاج إلى قطع الأكريليك لعمل وحدة إضاءة واحدة.
- كوسيلة لتجربة الرسوم المتحركة للضوء ، قم بصياغة وحدة إضاءة مثبتة عن طريق إرفاق 74 مصباح LED على شكل شريط نيوبكسل على شريط أكريليك بسمك 2 مم بمساحة 1M. لقد أنتجنا نوعين من وحدات الإضاءة: النموذجية الخطية واللولبية.
- بالنسبة للأنواع الخطية ، يمكن الاحتفاظ بشرائط neopixel الحالية وتأمينها ، لكن الأنواع الحلزونية تتطلب تشغيلًا يدويًا. يتم تقسيم كل مصباح من مصابيح LED 74 إلى قطع ، متصلة بمادة أكريليك حلزونية ، ومربوطة معًا بالرصاص.
قم بتوصيل شريط Neopixel بالأكريليك وقم بتأمين كل شريط لمنع انتشاره بالحرارة ، أو اربطه بخيط صيد رفيع. في حالة النوع الخطي ، تم تثبيت الكرة المطلوب سحبها في نهاية الوحدة لتصميم المظهر الجمالي وانتهينا من كرة البينج بونج برذاذ أسود. ثم قاموا بحفر حفرة صغيرة في كرة البينج بونج وربطوها بحبل. الجزء التالي الأكثر أهمية ، التبديل و neopixel ، متصلان كما هو موضح. ثم يتم تثبيت المفتاح على رف السقف.
في حالة النوع الحلزوني ، هناك خطر يتمثل في أن السحب المباشر للوحدة اللولبية يمكن أن يكسر الأكريليك تحت الضغط ، لذلك تم فصل قسم السحب (الإدخال) والوحدة (الإخراج). لتعظيم سقوط الضوء ، تم تثبيت الوحدات عموديًا على السقف ، وتم تثبيت الوحدات الخطية في الهواء ، وتم تثبيت اللوالب مباشرة على السقف. وقمنا بتوصيل كرة بينج بونج والمفتاح بخط الصيد حتى يمكن تشغيلها.
قطع الأكريليك كما هو موضح في الرسم أعلاه مطلوب لتأمين المفتاح إلى الرف. يبلغ سمك المفتاح ذو الشكل المربع 6 سم حوالي 5 مم ، مع وضع المفتاح في المنتصف وإدخال رابط الكابل من خلال فتحات على كلا الجانبين لتأمين المفتاح بإحكام. فتحة دائرية في الجزء السفلي من المركز تكشف عن سحب المفتاح ، والذي أسفله يتم سحب كبل ثلاثة أسلاك وتوصيله بطرف الكابل الخاص بالوحدة. وبالمثل ، من خلال ثقب في الزوايا الأربع ، يتم تثبيت الرف والاكريليك برباطات كبلات. كما هو موضح أعلاه ، يتم توصيل الوحدة الخطية مباشرة بالسحب ، لكن الوحدة الحلزونية تربط الدبوس والمفتاح بشكل منفصل.
الخطوة 4: إنشاء باستخدام 50 وحدة ضوئية
لقد صممنا تجربة مستخدم للحصول على إضاءة أكثر ثراءً من خلال نشر إجمالي 50 وحدة
كان لدينا رف بعرض 1 و 800 مم وطول 1 و 200 مم ، وقمنا بتوصيل كل مفتاح ووحدة حتى تتمكن من تجربة بيئة المطر والمطر التي خططنا لها في البداية ، وكان لدينا كل وحدة قائمة بذاتها لتمكين المهام المتعددة.
اعتمادًا على رسم التصميم ، تم حفر ثقب دائري في foemax لإخفاء التثبيت وللتأكد من أن المنطقة المتصلة بوحدة LED غير مرئية. نظرًا لأن المسافة من لوحة الأكريليك إلى وصلة وحدة LED حيث تم توصيل المفتاح حوالي 1 سم ، تم استخدام رغوة بسماكة 1 سم.
تم استخدام الإطار المعدني المربع لتثبيت التثبيت مع البراغي وأربطة الكابلات مع الحفاظ على الوزن الإجمالي والتوازن. إذا كان طول الوصلات المكشوفة أكبر من ذلك عندما يحاول الصانع ، فإن اللوح السميك يكون غير فعال ويوصى بهياكل أخرى.
لتسهيل تجربة المستخدم على مستوى العين ، يتم وضع التثبيت المكتمل على دعامة بارتفاع 2 متر تقريبًا ، ولكن الحذر هو أنه من الصعب جدًا تثبيت وحدة LED المدمجة بالمفتاح ، لذلك يجب إزالة جميع التوصيلات. صعدنا السلم وقمنا بتوصيل الوحدة بالتثبيت المثبت على الدعم.
يتمثل الجزء الأكثر أهمية في هذه العملية برمتها في التأكد من أن العمل يتم بشكل آمن ومضمون تمامًا لضمان جعل التجربة ممكنة في بيئة آمنة
تم استخدام ما مجموعه 10 وحدات اردوينو و 50 وحدة LED وتم توصيل خمس وحدات LED لكل اردوينو لتعدد المهام بشكل أكثر كفاءة وسلاسة. انظر المخطط المرفق للحصول على التفاصيل. سيتم مناقشة ترميز Neopixel متعدد المهام باستخدام المفتاح الكامل وفقًا لمخطط التصميم بالتفصيل في الخطوة التالية.
الخطوة 5: Arduino Coding & Wiring
الأسلاك
- تم توصيل 50 وحدة وفقًا لتخطيط الخطوة 4.
- تم تقسيم كل وحدة إلى 10 مجموعات من 50 وحدة لتمكين تعدد المهام وتوفير اتصال واضح.
- كما هو موضح في صورة المجموعة 1 أعلاه ، تم توصيل خمس وحدات بأردوينو واحد ، وتم ربط دبابيس نيوبكسل 5 فولت معًا مرة واحدة لتوصيل مصدر الطاقة.
- تم أيضًا ربط GND الخاصة بالنيوبكسل والمفاتيح معًا ، ولسهولة الإدراك ، تم توصيل المفاتيح بمسامير 2 و 3 و 4 و 5 و 6 وتم توصيل neopixels في المسامير 9 و 10 و 11 و 12 و 13.
- تم توصيل المفاتيح والنيوبكسل بطرق 2-9 ، 3-10 ، 4-11 ، 5-12 ، 6-13 ، على التوالي.
- وتجدر الإشارة إلى أنه نظرًا لأن وصلات الخطوط معقدة وهناك خطر نشوب حريق بسبب قصر الدائرة ، فقد تم تسخين أنبوب الانكماش لضمان عدم كسر الأجزاء الضعيفة.
Neopixel ترميز متعدد المهام مع مفتاح سحب
5 رسوم متحركة خفيفة (نوع المطر ، نوع الدش ، نوع البرق ، نوع البوب ، النوع غير المنتظم)
#يشمل
/ * 사용 하고자 하는 패턴 을 추가 함 * /
نمط التعداد {NONE، RAINBOW_CYCLE، THEATER_CHASE، COLOR_WIPE، SCANNER، FADE، TWINKLE، STAR، RAINBOWSPARKLE، METEOR، LIGHT، BLOSSOM} ؛ / * 네오 픽셀 을 방향 을 설정 함 * / اتجاه التعداد {FORWARD ، REVERSE} ؛
/ * 패턴 의 클래스 를 입력 함 * /
فئة NeoPatterns: العامة Adafruit_NeoPixel {/ * 패턴 을 추가 하고 업데이트 하기 위한 함수 * / عام: نمط ActivePattern ؛ / * 클레스 함수 에 패턴 의 방향 을 입력 * / direction Direction؛
/ * 변수 الفاصل الزمني 을 추가 * / فاصل زمني طويل بدون توقيع ؛ / * 변수 lastUpdate 를 추가 * / بدون توقيع long lastUpdate ؛ / * 변수 Color1، Color2 를 * / uint32_t Color1، Color2؛ / * 변수 TotalSteps 를 추가 * / uint16_t TotalSteps؛ / * 변수 الفهرس 를 추가 * / uint16_t الفهرس ؛
/ * 패턴 을 완료 했을 시 다시 불러오는 함수 * / void (* OnComplete) () ؛ / * 네오 패턴 에서 네오 픽샐 의 갯수، 핀 번호، 타입، 콜백 을 불러오는 함수 * / NeoPatterns (uint16_t pixels، uint8_t pin، uint8_t type، void (* callback) ()): Adafruit_NeoPixel (بكسل ، دبوس ، نوع) { OnComplete = رد الاتصال ؛ }
/ * 패턴 을 업데이트 하기 위한 케이스 구문 * /
تحديث باطل () {/ * 패턴 의 시간 설정. 멀티 태스킹 을 구현 하는 * / if ((millis () - lastUpdate)> Interval) {lastUpdate = millis () ؛ / * ActivePattern 의 스위치 구문 * / switch (ActivePattern) {/ * case RAINBOW_CYCLE 에서는 RainbowCycleUpdate 를 실행 하라 * / case RAINBOW_CYCLE: RainbowCycleUpdate () ؛ / * حالة RAINBOW_CYCLE 에서 나와라 * / استراحة ؛
/ * حالة THEATER_CHASE 에서는 TheaterChaseUpdate 를 실행 하라 * /
الحالة THEATER_CHASE: TheaterChaseUpdate () ، / * حالة THEATER_CHASE 에서 나와라 * / استراحة ؛
/ * حالة COLOR_WIPE 에서는 ColorWipeUpdate 를 실행 하라 * /
الحالة COLOR_WIPE: ColorWipeUpdate () ، / * حالة COLOR_WIPE 에서 나와라 * / استراحة ؛ / * case SCANNER ScannerUpdate 를 실행 하라 * / case SCANNER: ScannerUpdate () ؛ / * حالة الماسح الضوئي 에서 나와라 * / استراحة ؛
/ * حالة FADE 에서는 FadeUpdate 를 실행 하라 * /
الحالة FADE: FadeUpdate () ؛ / * حالة FADE 에서 나와라 * / استراحة ؛
/ * حالة توينكل 에서는 تحديث توينكل 를 실행 하라 * /
حالة توينكل: TwinkleUpdate () ؛ / * حالة توينكل 에서 나와라 * / استراحة ؛
/ * حالة STAR 에서는 StarUpdate 를 실행 하라 * /
الحالة STAR: StarUpdate () ؛ / * حالة STAR 에서 나와라 * / استراحة ؛
/ * حالة RAINBOWSPARKLE 에서는 RainbowsparkleUpdate 를 실행 하라 * /
حالة RAINBOWSPARKLE: RainbowsparkleUpdate () ؛ / * حالة RAINBOWSPARKLE 에서 나와라 * / استراحة ؛ / * حالة METEOR 에서는 MeteorUpdate 를 실행 하라 * / case METEOR: MeteorUpdate () ؛ / * حالة METEOR 에서 나와라 * / استراحة ؛
/ * حالة LIGHT 에서는 LightUpdate 를 실행 하라 * /
حالة الضوء: LightUpdate () ؛ / * حالة الضوء 에서 나와라 * / استراحة ؛
/ * حالة BLOSSOM 에서는 BlossomUpdate 를 실행 하라 * /
حالة BLOSSOM: BlossomUpdate () ؛ / * حالة BLOSSOM 에서 나와라 * / استراحة ؛ }}}
/ * 패턴 의 방향 을 설정 하는 구문 * /
/ * الفهرس 를 증가 시키고 초기화 하는 함수 * /
زيادة باطلة () {/ * 만약 정방향 이면 인덱스 를 증가 시켜라 * / if (Direction == FORWARD) {Index ++ ؛ / * 만약 인덱스 가 전체 네오 픽셀 구동 갯수 와 같 거나 많다 면 0 으로 초기화 시켜라 * / إذا (الفهرس> = TotalSteps) {الفهرس = 0 ؛ / * 패턴 을 완료 시키는 함수 * / if (OnComplete! = NULL) {OnComplete () ؛ }}}
/ * 만약 정방향 이 아니면 인덱스 를 감소 시켜라 * / آخر {--الفهرس ؛ / * 만약 인덱스 가 전체 네오 픽셀 구동 갯수 와 같 거나 적 다면 전체 구동 갯수 에서 1 을 빼라 * / إذا (الفهرس <= 0) {الفهرس = TotalSteps - 1 ؛ / * 패턴 을 완료 시키는 함수 * / if (OnComplete! = NULL) {OnComplete () ؛ }}}}
/ * 반대 방향 으로 움직이게 하는 함수 * /
عكس باطل () {/ * 애니메이션 함수 에 عكس 를 썼을 시 ، 만약 방향 이 정방향 이면 * / إذا (الاتجاه == إلى الأمام) {/ * 방향 은 그 와 반대 이며 전체 구동 갯수 에서 1 일 빼라 * / الاتجاه = عكس ؛ الفهرس = TotalSteps - 1 ؛ } / * 그 외의 방향 이 정방향 이면 인덱스 를 0 으로 설정 해라 * / آخر {الاتجاه = إلى الأمام ؛ الفهرس = 0 ؛ }}
/ * 애니메이션 을 설정 하는 함수 들 *
* دورة قوس قزح 의 시간 과 방향 을 입력 * /
RainbowCycle باطل (فاصل uint8_t ، اتجاه dir = FORWARD) {/ * 실행 되는 패턴 은 RainbowCycle 임 * / ActivePattern = RAINBOW_CYCLE ؛ / * 시간 은 الفراغ RainbowCycle () 안에 입력 되는 الفاصل الزمني 과 같음 * / الفاصل الزمني = الفاصل الزمني ؛ / * 총 구동 갯수 는 255 임 * / TotalSteps = 255 ؛ / * 인덱스 는 0 으로 설정 함 * / الفهرس = 0 ؛ / * 방향 은 باطل RainbowCycle () 안에 입력 되는 dir = FORWARD 과 같음 * / Direction = dir؛ }
/ * دورة قوس قزح 를 업데이트 했을 경우 * /
باطل RainbowCycleUpdate () {/ * 변수 i 가 네오 픽셀 개수 보다 작 으면 i 를 증가 시켜라 * / لـ (int i = 0؛ i <numPixels ()؛ i ++) {/ * 변수 i 가 증가 함 과 동시에 RGB 의 무지개 컬러 로 변화 하면서 작동 해라 * / setPixelColor (i، Wheel (((i * 256 / numPixels ()) + Index) & 255)) ؛ } / * 애니메이션 을 보여주는 함수 * / عرض () ؛ زيادة راتب()؛ }
/ * TheaterChase 의 컬러 와 시간 방향 을 입력 * /
void TheaterChase (uint32_t color1، uint32_t color2، فاصل uint8_t، direction dir = FORWARD) {/ * 실행 되는 패턴 은 RTHEATER_CHASE * / ActivePattern = THEATER_CHASE ؛ / * 시간 은 void TheaterChase () 안에 입력 되는 الفاصل الزمني 과 같음 * / الفاصل الزمني = الفاصل الزمني ؛ / * 총 구동 갯수 는 numPixels 갯수 임 * / TotalSteps = numPixels () ؛ / * 컬러 1، 2 를 설정 * / Color1 = color1؛ Color2 = color2 ؛ / * 인덱스 는 0 으로 설정 함 * / الفهرس = 0 ؛ / * 방향 은 void TheaterChase () 안에 입력 되는 dir = FORWARD 과 같음 * / Direction = dir؛ }
/ * TheaterChase 를 업데이트 했을 경우 * /
void TheaterChaseUpdate () {/ * 변수 i 가 네오 픽셀 개수 보다 작 으면 i 를 증가 시켜라 * / لـ (int i = 0؛ i <numPixels ()؛ i ++) {/ * 만약 변수 i 에 인덱스 를 더해서 더해서 3 으로 나눈 것이 0 과 같다 면 i 를 Color 로 변환 시켜라 * / if ((i + Index)٪ 3 == 0) {setPixelColor (i، Color1) ؛ } / * 그렇지 않다면 i 를 Color 로 변환 시켜라 * / else {setPixelColor (i، Color2) ؛ }} / * 애니메이션 을 보여주는 함수 * / show () ؛ زيادة راتب()؛ }
/ * ColorWipe 의 컬러 와 시간 방향 을 입력 * /
ColorWipe باطل (لون uint32_t ، فاصل uint8_t ، اتجاه dir = FORWARD) {/ * 실행 되는 패턴 은 COLOR_WIPE * / ActivePattern = COLOR_WIPE ؛ / * 시간 은 باطل ColorWipe () 안에 입력 되는 الفاصل الزمني 과 같음 * / الفاصل الزمني = الفاصل الزمني ؛ / * 총 구동 갯수 는 numPixels 갯수 임 * / TotalSteps = numPixels () ؛ / * 컬러 1 을 설정 * / Color1 = اللون ؛ / * 인덱스 는 0 으로 설정 함 * / الفهرس = 0 ؛ / * 방향 은 باطل ColorWipe () 안에 입력 되는 dir = FORWARD 과 같음 * / Direction = dir؛ }
/ * ColorWipeUpdate 를 업데이트 했을 경우 * /
باطل ColorWipeUpdate () {/ * index 를 컬러 1 로 변환 시켜라 * / setPixelColor (الفهرس ، اللون 1) ؛ / * 애니메이션 을 보여주는 함수 * / عرض () ؛ زيادة راتب()؛ }
/ * الماسح الضوئي 의 컬러 와 시간 을 입력 * /
ماسح باطل (uint32_t color1، uint8_t الفاصل الزمني) {/ * 실행 되는 패턴 은 SCANNER * / ActivePattern = SCANNER ؛ / * 시간 은 void Scanner () 안에 입력 되는 الفاصل الزمني 과 같음 * / الفاصل الزمني = الفاصل الزمني ؛ / * 구동 갯수 는 총 갯수 에서 1 을 빼고 2 를 곱 해라 * / TotalSteps = (numPixels () - 1) * 2 ؛ / * 컬러 1 을 설정 * / Color1 = color1 ؛ / * 인덱스 는 0 으로 설정 함 * / الفهرس = 0 ؛ }
/ * تحديث الماسح 를 업데이트 했을 경우 * /
void ScannerUpdate () {/ * 변수 i 는 영 이고 총 갯수 보다 작을 경우 i 를 증가 시켜라 * / لـ (int i = 0؛ i <numPixels ()؛ i ++) {/ * 만약 변수 i 가 인덱스 와 같다 면 i 를 color1 로 변환 시켜라 * / إذا (i == الفهرس) {setPixelColor (i ، Color1) ؛ } / * 그렇지 않다면 변수 i 를 전체 구동 갯수 에서 인덱스 를 뺀값 과 같다 * / وإلا إذا (i == TotalSteps - Index) {setPixelColor (i، Color1) ؛ } / * 그 밖에는 i 를 디밍 시켜라 i 의 값 만큼 * / آخر {setPixelColor (i، DimColor (getPixelColor (i))) ؛ }} / * 애니메이션 을 보여주는 함수 * / show () ؛ زيادة راتب()؛ }
/ * الماسح الضوئي 의 컬러 1 ، 2 와 스텝 ، 시간 ، 방향 을 입력 * /
تلاشي باطل (uint32_t color1، uint32_t color2، خطوات uint16_t، فاصل uint8_t، direction dir = FORWARD) {/ * 실행 되는 패턴 은 FADE * / ActivePattern = FADE ؛ / * 시간 은 الفراغ تتلاشى () 안에 입력 되는 الفاصل الزمني 과 같음 * / الفاصل الزمني = الفاصل الزمني ؛ / * 구동 갯수 는 스텝 값임 * / TotalSteps = خطوات ؛ / * 컬러 1، 2 를 설정 * / Color1 = color1؛ Color2 = color2 ؛ / * 인덱스 는 0 으로 설정 함 * / الفهرس = 0 ؛ / * 방향 은 void Fade () 안에 입력 되는 dir = FORWARD 과 같음 * / Direction = dir؛ } / * FadeUpdate 를 업데이트 했을 경우 * / void FadeUpdate () {/ * 변수 red 값 은 다음 과 같음 * / uint8_t red = ((Red (Color1) * (TotalSteps - Index)) + (Red (Color2) * Index))) / TotalSteps؛ / * 변수 أخضر 값 은 다음 과 같음 * / uint8_t أخضر = ((أخضر (Color1) * (TotalSteps - فهرس)) + (أخضر (Color2) * Index)) / TotalSteps ؛ / * 변수 أزرق 값 은 다음 과 같음 * / uint8_t blue = ((Blue (Color1) * (TotalSteps - Index)) + (Blue (Color2) * Index)) / TotalSteps ؛ / * 위 의 أحمر ، أخضر ، أزرق 값 으로 컬러 를 셋팅 * / ColorSet (اللون (أحمر ، أخضر ، أزرق)) ؛ / * 애니메이션 을 보여주는 함수 * / عرض () ؛ زيادة راتب()؛ }
/ * 모든 네오 픽셀 을 끄는 구문 * /
مسافة باطلة () {/ * 총 네오 픽셀 갯수 는 74 개 이며 * / int NPIXEL = 74 ؛ / * 변수 i 가 증가 하며 모든 네오 픽셀 의 컬러 값 을 0 으로 변환 함 * / لـ (int i = 0 ؛ i <NPIXEL ؛ i ++) {setPixelColor (i ، 0 ، 0 ، 0) ؛ }}
/ * وميض 의 컬러 1 와 시간 을 입력 * /
وميض باطل (uint32_t color1، uint8_t الفاصل الزمني) {/ * 실행 되는 패턴 은 TWINKLE * / ActivePattern = TWINKLE ؛ / * 시간 은 الفراغ Twinkle () 안에 입력 되는 الفاصل الزمني 과 같음 * / الفاصل الزمني = الفاصل الزمني ؛ / * 컬러 1 를 설정 * / Color1 = color1 ؛ / * 총 구동 갯수 는 numPixels 갯수 임 * / TotalSteps = numPixels () ؛ الفهرس = 0 ؛ }
/ * TwinkleUpdate 를 업데이트 했을 경우 * /
TwinkleUpdate () باطل {/ * 모든 네오 픽셀 의 컬러 를 0 으로 셋팅 * / setAll (0، 0، 0) ؛ / * 변수 بكسل 은 عشوائي 74 * / عدد البكسل = عشوائي (74) ؛ / * عشوائي 74 개 에서 2 로나 눈 수 를 랜덤 하게 켜라 * / setPixelColor (بكسل / 2 ، 50 ، 100 ، 255) ؛ setPixelColor (بكسل ، 250 ، 255 ، 250) ؛ setPixelColor (Pixel / 2 ، 200 ، 250 ، 255) ؛ setPixelColor (بكسل ، 255 ، 255 ، 255) ؛ setPixelColor (بكسل ، 250 ، 230 ، 250) ؛ setPixelColor (Pixel / 2 ، 150 ، 200 ، 255) ؛ / * 애니메이션 을 보여주는 함수 * / عرض () ؛ / * 랜덤 하게 끄는 함수 * / setPixelColor (بكسل ، 0 ، 0 ، 0) ؛ / * 애니메이션 을 보여주는 함수 * / عرض () ؛ زيادة راتب()؛ }
/ * نجمة 의 컬러 1 값 을 입력 * /
نجمة باطلة (uint32_t color1) {/ * 실행 되는 패턴 은 STAR * / ActivePattern = STAR ؛ / * 시간 은 نجمة باطلة () 안에 입력 되는 فاصل زمني 과 * / فاصل زمني = فاصل زمني ؛ / * 총 구동 갯수 는 numPixels 갯수 임 * / TotalSteps = numPixels () ؛ / * 컬러 1 을 설정 * / Color1 = color1 ؛ الفهرس = 0 ؛ }
/ * StarUpdate 를 업데이트 했을 경우 * /
باطل StarUpdate () {/ * 인덱스 와 컬러 를 셋팅 * / setPixelColor (الفهرس ، اللون 1) ؛ مشاهده()؛ / * 변수 i 가 0 이고 구동 갯수 보다 작 으면 i 를 감소 시킴 = 한칸 씩 이동 하는 * / من أجل (int i = 0 ؛ i <numPixels () ؛ i--) {setPixelColor (i ، Color (0 ، 0 ، 0)) ؛ } / * 애니메이션 을 보여주는 함수 * / زيادة () ؛ }
/ * Rainbowsparkle 의 시간 과 방향 을 입력 * /
Rainbowsparkle باطل (فاصل uint8_t ، اتجاه dir = FORWARD) {/ * 실행 되는 패턴 은 RAINBOWSPARKLE * / ActivePattern = RAINBOWSPARKLE ؛ / * 시간 은 باطل Rainbowsparkle () 안에 입력 되는 الفاصل الزمني 과 같음 * / الفاصل الزمني = الفاصل الزمني ؛ / * 총 구동 갯수 는 numPixels 갯수 임 * / TotalSteps = numPixels () ؛ الفهرس = 0 ؛ / * 방향 은 باطل Rainbowsparkle () 안에 입력 되는 الاتجاه 과 같음 * / الاتجاه = دير ؛ }
/ * RainbowsparkleUpdate 를 업데이트 했을 경우 * /
باطل RainbowsparkleUpdate () {/ * 변수 i 가 0 이고 구동 갯수 보다 작 으면 i 값 을 증가 하는데 * / لـ (int i = 0؛ i <numPixels ()؛ i ++) {/ * 변수 i 가 0 이고 구동 갯수 보다 작 으면 i 값 을 증가 하는데 * / إذا ((i + فهرس)٪ 2 == 0) {uint32_t c = عشوائي (255) ؛ setPixelColor (ط ، ج) ؛ } else {setPixelColor (i، random (255)) ؛ }} / * 애니메이션 을 보여주는 함수 * / show () ؛ زيادة راتب()؛ } / * النيزك 의 시간 과 방향 을 입력 * / نيزك باطل (uint32_t color1) {/ * 실행 되는 패턴 은 METEOR * / ActivePattern = METEOR ؛ / * 시간 설정 * / الفاصل الزمني = الفاصل الزمني ؛ / * 총 구동 갯수 는 عدد البكسل 갯수 에서 1 일뺀 후 ، * 2 를 한 것과 같음 * / TotalSteps = (numPixels () - 1) * 2 ؛ / * 컬러 1 을 설정 * / Color1 = color1 ؛ الفهرس = 0 ؛ }
/ * MeteorUpdate 를 업데이트 했을 경우 * /
باطل MeteorUpdate () {لـ (int i = 0؛ i <numPixels ()؛ i ++) {if (i == Index) {setPixelColor (i، 100، random (255)، 255) ؛ } else {setPixelColor (i، DimColor (getPixelColor (i))) ؛ }} / * 애니메이션 을 보여주는 함수 * / show () ؛ زيادة راتب()؛ }
/ * ضوء 의 시간 과 방향 을 입력 * /
ضوء باطل (uint32_t color1) {/ * 실행 되는 패턴 은 LIGHT * / ActivePattern = LIGHT ؛ / * 시간 설정 * / الفاصل الزمني = الفاصل الزمني ؛ / * 총 구동 갯수 는 عدد البيكسلات 갯수 에서 1 일뺀 후 ، * 2 를 한 것과 같음 * / TotalSteps = (numPixels () - 1) * 2 ؛ / * 컬러 1 을 설정 * / Color1 = color1 ؛ الفهرس = 0 ؛ }
/ * LightUpdate 를 업데이트 했을 경우 * /
void LightUpdate () {for (int i = 0؛ i <numPixels ()؛ i ++) {if (i == TotalSteps - Index) {setPixelColor (i، 150، random (200)، 40) ؛ } else {setPixelColor (i، DimColor (getPixelColor (i))) ؛ }} / * 애니메이션 을 보여주는 함수 * / show () ؛ زيادة راتب()؛ }
/ * بلوسوم 의 시간 과 방향 을 입력 * /
باطل Blossom (uint32_t color1) {/ * 실행 되는 패턴 은 BLOSSOM * / ActivePattern = BLOSSOM ؛ / * 시간 설정 * / الفاصل الزمني = الفاصل الزمني ؛ / * 총 구동 갯수 는 عدد البيكسلات 갯수 에서 1 일뺀 후 ، * 2 를 한 것과 같음 * / TotalSteps = (numPixels () - 1) * 2 ؛ / * 컬러 1 을 설정 * / Color1 = color1 ؛ الفهرس = 0 ؛ }
/ * BlossomUpdate 를 업데이트 했을 경우 * /
void BlossomUpdate () {for (int i = 0؛ i <numPixels ()؛ i ++) {if (i == TotalSteps - Index) {setPixelColor (i، 255، random (255)، 100) ؛ } else {setPixelColor (i، DimColor (getPixelColor (i))) ؛ }} / * 애니메이션 을 보여주는 함수 * / show () ؛ زيادة راتب()؛ }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/ * 네오 픽셀 의 켜지 는 위치 와 색 을 지정 해주는 함수 * / void setAll (بايت أحمر ، بايت أخضر ، بايت أزرق) {لـ (int i = 0 ؛ i <numPixels () ؛ i ++) {setPixelColor (i ، أحمر ، أخضر ، أزرق) ؛ } مشاهده()؛ }
/ * 네오 픽셀 의 디밍، 즉 밝기 를 조절 하는 함수 * /
uint32_t DimColor (uint32_t color) {// Shift R و G و B المكونات بت واحد إلى اليمين uint32_t dimColor = Color (أحمر (لون) >> 1 ، أخضر (لون) >> 1 ، أزرق (لون) >> 1) ؛ عودة باهتة }
/ * 모든 네오 픽셀 의 칼라 를 조절 * /
void ColorSet (uint32_t color) {لـ (int i = 0؛ i <numPixels ()؛ i ++) {setPixelColor (i، color) ؛ } مشاهده()؛ }
/ * 레드 값 을 불러 옴 * /
uint8_t Red (uint32_t color) {return (color >> 16) & 0xFF؛ } / * 그린 값 을 불러 옴 * / uint8_t Green (uint32_t color) {return (color >> 8) & 0xFF؛ } / * 블루 값 을 불러 옴 * / uint8_t Blue (uint32_t color) {return color & 0xFF؛ }
/ * قوس قزح 컬러 를 불러 옴 * /
uint32_t Wheel (بايت WheelPos) {WheelPos = 255 - WheelPos ؛ إذا (WheelPos <85) {إرجاع اللون (255 - WheelPos * 3 ، 0 ، WheelPos * 3) ؛ } وإلا إذا (WheelPos <170) {WheelPos - = 85 ؛ إرجاع اللون (0 ، WheelPos * 3 ، 255 - WheelPos * 3) ؛ } آخر {WheelPos - = 170 ؛ إرجاع اللون (WheelPos * 3 ، 255 - WheelPos * 3 ، 0) ؛ }}}؛
/ * قطاع 을 불러 오기 위한 함수 / * 사용 하는 스트립 별로 모두 지정 해주어야 함 * /
شريط باطل 1Complete () ؛ شريط باطل 2Complete () ؛ شريط باطل 3Complete () ؛ شريط باطل 4Complete () ؛ شريط باطل 5Complete () ؛
/ * 네오 픽셀 의 갯수 설정 * /
#define NUMPIXELS 74 / * 사용 하는 버튼 의 갯수 설정 * / #define B_NUM 5 / * Import strip1 ~ 5، 갯수 는 74 개 스트립 연결 핀 은 strip1 은 8 ~ strip5 까지 12 * / NeoPatterns strip1 (74، 8، NEO_GRB + NEO_KHZ800، & strip1Complete) ؛ قطاع الأنماط الجديدة 2 (74، 9، NEO_GRB + NEO_KHZ800، & strip2Complete) ؛ قطاع الأنماط الجديدة 3 (74، 10، NEO_GRB + NEO_KHZ800، & strip3Complete) ؛ شريط الأنماط الجديدة 4 (74 ، 11 ، NEO_GRB + NEO_KHZ800 ، & strip4Complete) ؛ قطاع الأنماط الجديدة 5 (74، 12، NEO_GRB + NEO_KHZ800، & strip5Complete) ؛ / * 배열 을 사용한 연결 버튼 핀 설정 * / const int buttonPin [B_NUM] = {2، 3، 4، 5، 6} ؛ / * 배열 을 사용 하여 버튼 상태 를 지정 해줌 * / int buttonState [B_NUM] ؛ / * 2 번핀 부터 6 번핀 까지 상태 는 순서 대로 LOW 임 * / int lastButtonState [B_NUM] = {LOW، LOW، LOW، LOW، LOW} ؛ / * 2 번핀 부터 6 번핀 까지 버튼 카운터 를 초기화 시킴 * / int buttonCounter [B_NUM] = {0 ، 0 ، 0 ، 0 ، 0} ؛ / * 2 번핀 부터 6 번핀 까지 최대 버튼 카운터 는 5 임 * / int buttonCounterMax = 5 ؛ / * 모든 버튼 핀 을 읽 일수 있도록 변수 추가 * / int read [B_NUM] ؛ long unsigned long lastDebounceTime [B_NUM] = {0، 0، 0، 0، 0} ؛ / * 모든 버튼 핀 을 읽는 시간 간격 تأخير 50 과 같음 * / debounceDelay طويل بدون توقيع = 50 ؛
الإعداد باطل(){
/ * 복잡 하게 저항 연결 이 필요 없도록 인풋 풀업 방식 의 버튼 설정: GND - 5V (الاتصال برقم التعريف الشخصي) * / لـ (int i = 0؛ i <B_NUM؛ i ++) {pinMode (buttonPin ، INPUT_PULLUP) ؛ } Serial.begin (9600) ؛ / * 스트립 1 ~ 5 를 셋팅 * / strip1.begin () ؛ strip2.begin () ، strip3.begin () ، strip4.begin () ، strip5.begin () ،
//strip1. TheaterChase (strip1. Color(255، 0، 255)، strip1. Color (255، 50، 0)، 20، FORWARD) ؛
}
/ * 버튼 카운터 변수 값 은 5 임 * /
عداد int = 5 ؛ حلقة باطلة () {/ * 버튼 수 보다 i 가 작 으면 i 를 증가 시키고 * / لـ (int i = 0؛ i debounceDelay) {if (reading ! = buttonState ) {buttonState = قراءة ؛ buttonCounter ++ ؛ / * 버튼 카운팅 이 위에서 설정 한 حد أقصى 5 를 넘으면 0 으로 초기화 시켜라. * / إذا (buttonCounter > buttonCounterMax) buttonCounter = 0 ؛ }} lastButtonState = قراءة ؛ } / * 모든 스트립 을 업데이트 함. * / strip1. Update () ؛ strip2. Update () ، strip3. Update () ، strip4. Update () ، strip5. Update () ؛
///// SWITCH_2 //////////////////////////////////////////////// ////////////////////////////////////////////////////// /////////////////////////////////////////////
/ * 버튼 배열 의 0 번째 즉. 2 번핀 에 연결된 버튼 을 활용 하여 애니메이션 이 구동 되도록 하는 스위치 케이스 구문 * / التبديل (buttonCounter [0]) {
/ * 첫번째 버튼 을 활동 시키면 구동 되는 애니메이션 * /
الحالة 0: strip1. ActivePattern = BLOSSOM ؛ / * 해당 애니메이션 의 시간 을 설정 * / strip1. Interval = 20 ؛ / * 구동 되는 네오 픽셀 의 갯수 를 설정 * / strip1. TotalSteps = strip1.numPixels () ؛ استراحة؛ / * 두번째 버튼 을 활동 시키면 구동 되는 애니메이션 * / الحالة 1: strip1. ActivePattern = RAINBOWSPARKLE ؛ strip1. Interval = 50 ؛ strip1. TotalSteps = strip1.numPixels () ، استراحة؛ / * 세번째 버튼 을 활동 시키면 구동 되는 애니메이션 * / الحالة 2: strip1. ActivePattern = الماسح الضوئي ؛ strip1. Interval = 10 ؛ strip1. TotalSteps = (strip1.numPixels () - 1) * 2 ؛ استراحة؛ / * 네번째 버튼 을 활동 시키면 구동 되는 애니메이션 * / الحالة 3: strip1. ActivePattern = TWINKLE ؛ strip1. Interval = 1 ؛ strip1. TotalSteps = strip1.numPixels () ، استراحة؛ / * 다섯 번째 버튼 을 활동 시키면 구동 되는 애니메이션 * / الحالة 4: strip1. ActivePattern = METEOR ؛ strip1. Interval = 10 ؛ strip1. TotalSteps = strip1.numPixels () ، استراحة؛ } Serial.print (buttonCounter [0]) ؛ Serial.print ("،") ؛ Serial.println (buttonCounter [1]) ؛
///// SWITCH_3 //////////////////////////////////////////////// ////////////////////////////////////////////////////// /////////////////////////////////////////////
التبديل (buttonCounter [1]) {حالة 0: strip2. ActivePattern = STAR ؛ strip2. Interval = 50 ؛ strip2. TotalSteps = strip2.numPixels () ، استراحة؛ الحالة 1: strip2. ActivePattern = RAINBOWSPARKLE ؛ strip2. Interval = 100 ؛ strip2. TotalSteps = strip2.numPixels () ، استراحة؛ الحالة 2: strip2. ActivePattern = الماسح الضوئي ؛ strip2. Interval = 20 ؛ strip2. TotalSteps = (strip2.numPixels () - 1) * 2 ؛ استراحة؛ الحالة 3: strip2. ActivePattern = TWINKLE ؛ strip2. Interval = 5 ؛ strip2. TotalSteps = strip2.numPixels () ، استراحة؛ الحالة 4: strip2. ActivePattern = METEOR ؛ strip2. Interval = 40 ؛ strip2. TotalSteps = strip2.numPixels () ، استراحة؛ } Serial.print (buttonCounter [0]) ؛ Serial.print ("،") ؛ Serial.println (buttonCounter [1]) ؛
///// SWITCH_4 //////////////////////////////////////////////// ////////////////////////////////////////////////////// /////////////////////////////////////////////
التبديل (buttonCounter [2]) {حالة 0: strip3. ActivePattern = STAR ؛ strip3. Interval = 50 ؛ strip3. TotalSteps = strip3.numPixels () ، استراحة؛ الحالة 1: strip3. ActivePattern = RAINBOWSPARKLE ؛ strip3. Interval = 100 ؛ strip3. TotalSteps = strip3.numPixels () ، استراحة؛ الحالة 2: strip3. ActivePattern = الماسح الضوئي ؛ strip3. Interval = 20 ؛ strip3. TotalSteps = (strip3.numPixels () - 1) * 2 ؛ استراحة؛ الحالة 3: strip3. ActivePattern = TWINKLE ؛ strip3. Interval = 5 ؛ strip3. TotalSteps = strip3.numPixels () ، استراحة؛ الحالة 4: strip3. ActivePattern = METEOR ؛ strip3. Interval = 25 ؛ strip3. TotalSteps = strip3.numPixels () ، استراحة؛ } Serial.print (buttonCounter [0]) ؛ Serial.print ("،") ؛ Serial.println (buttonCounter [1]) ؛
///// SWITCH_5 //////////////////////////////////////////////// ////////////////////////////////////////////////////// /////////////////////////////////////////////
التبديل (buttonCounter [3]) {حالة 0: strip4. ActivePattern = STAR ؛ strip4. Interval = 50 ؛ strip4. TotalSteps = strip4.numPixels () ، استراحة؛ الحالة 1: strip4. ActivePattern = RAINBOWSPARKLE ؛ strip4. Interval = 100 ؛ strip4. TotalSteps = strip4.numPixels () ، استراحة؛ الحالة 2: strip4. ActivePattern = الماسح الضوئي ؛ strip4. Interval = 20 ؛ strip4. TotalSteps = (strip4.numPixels () - 1) * 2 ؛ استراحة؛ الحالة 3: strip4. ActivePattern = توينكل ؛ strip4. Interval = 5 ؛ strip4. TotalSteps = strip4.numPixels () ، استراحة؛ الحالة 4: strip4. ActivePattern = METEOR ؛ strip4. Interval = 25 ؛ strip4. TotalSteps = strip4.numPixels () ، استراحة؛ } Serial.print (buttonCounter [0]) ؛ Serial.print ("،") ؛ Serial.println (buttonCounter [1]) ؛
///// SWITCH_6 //////////////////////////////////////////////// ////////////////////////////////////////////////////// /////////////////////////////////////////////
التبديل (buttonCounter [4]) {حالة 0: strip5. ActivePattern = STAR ؛ قطاع 5. Interval = 50 ؛ strip5. TotalSteps = strip5.numPixels () ، استراحة؛ الحالة 1: strip5. ActivePattern = RAINBOWSPARKLE ؛ قطاع 5. Interval = 100 ؛ strip5. TotalSteps = strip5.numPixels () ، استراحة؛ الحالة 2: strip5. ActivePattern = الماسح الضوئي ؛ قطاع 5. Interval = 20 ؛ strip5. TotalSteps = (strip5.numPixels () - 1) * 2 ؛ استراحة؛ الحالة 3: قطاع 5. ActivePattern = توينكل ؛ قطاع 5. Interval = 5 ؛ strip5. TotalSteps = strip5.numPixels () ، استراحة؛ الحالة 4: قطاع 5. ActivePattern = METEOR ؛ قطاع 5. Interval = 25 ؛ strip5. TotalSteps = strip5.numPixels () ، استراحة؛ } Serial.print (buttonCounter [0]) ؛ Serial.print ("،") ؛ Serial.println (buttonCounter [1]) ؛ }
// strip1 Completion Callback
void strip1Complete () {strip1. Color1 = strip1. Wheel (عشوائي (255)) ؛ strip1. Color2 = strip1. Wheel (عشوائي (255)) ؛ قطاع 1. الفهرس = 0 ؛ }
// strip2 Completion Callback
void strip2Complete () {strip2. Color1 = strip2. Wheel (عشوائي (255)) ؛ strip2. Color2 = strip2. Wheel (عشوائي (255)) ؛ strip2. Index = 0 ؛ }
// strip3 Completion Callback
void strip3Complete () {strip3. Color1 = strip3. Wheel (عشوائي (255)) ؛ strip3. Color2 = strip3. Wheel (عشوائي (255)) ؛ strip3. Index = 0 ؛ }
// strip4 Completion Callback
void strip4Complete () {strip4. Color1 = strip4. Wheel (عشوائي (255)) ؛ strip4. Color2 = strip4. Wheel (عشوائي (255)) ؛ الشريط 4. الفهرس = 0 ؛ }
// strip5 Completion Callback
void strip5Complete () {strip5. Color1 = strip5. Wheel (عشوائي (255)) ؛ strip5. Color2 = strip5. Wheel (عشوائي (255)) ؛ الشريط 5. الفهرس = 0 ؛ }
الخطوة 6: النتيجة وصنع الفيلم
نشكرك على اهتمامك بمشروعنا رغم أنه ليس كافيًا.
موصى به:
مفتاح WAVE SWITCH باستخدام مفتاح أقل باستخدام 555: 4 خطوات
WAVE SWITCH || TOUCH LESS SWITCH USING 555: مرحبًا بالجميع مرحبًا بكم اليوم أنا أقوم ببناء مفتاح بسيط يعمل باللمس أقل ، يتم تنشيطه فقط من خلال التلويح بيدنا بمساعدة مستشعر الأشعة تحت الحمراء وموقت 555 IC ، لذلك دعونا نبنيها…. نظرًا لأن 555 يعمل كمتجر فليب فلوب
مفتاح الضوء المتحكم فيه بالعين باستخدام نظارات Shota Aizawa's Eraser Head Goggles (My Hero Academia): 8 خطوات (بالصور)
مفتاح الضوء المتحكم فيه بالعين باستخدام نظارات Shota Aizawa's Eraser Head Goggles (My Hero Academia): إذا كنت تقرأ مانغا بطلي الأكاديمي أو شاهدت أنمي أكاديميتي البطل ، فيجب أن تعرف شخصية شاركتات تدعى شوتا أيزاوا. شوتا أيزاوا المعروف أيضًا باسم Eraser Head ، هو بطل محترف ومعلم الصف في الإمارات العربية المتحدة من الدرجة 1-A. كويرك شوتا يعطيه أب
تحكم في مفتاح الإضاءة باستخدام Cardboard Infinity Gauntlet: 10 خطوات
تحكم في مفتاح الإضاءة باستخدام Cardboard Infinity Gauntlet الخاص بك: لقد استوحيت من فيلم Avengers Movie ، وبدأت في صنع Thanos Infinity Gauntlet من الورق المقوى. في هذا المشروع ، استخدمت وحدات جهاز الإرسال والاستقبال اللاسلكي MPU6050 و NRF24L01 + 2.4 جيجا هرتز للتواصل بين لوحتين من Arduino لاسلكيًا. إنفينيتي جاونتل
مفتاح الضوء الذي يتم التحكم فيه عن بعد بتقنية البلوتوث - التعديل التحديثي. مفتاح الضوء لا يزال يعمل ، لا توجد كتابة إضافية: 9 خطوات (بالصور)
مفتاح الضوء الذي يتم التحكم فيه عن بعد بتقنية البلوتوث - التعديل التحديثي. مفتاح الضوء لا يزال يعمل ، لا توجد كتابة إضافية: تحديث 25 نوفمبر 2017 - للحصول على إصدار عالي الطاقة من هذا المشروع يمكنه التحكم في كيلووات من الحمل ، راجع التعديل التحديثي للتحكم في BLE لأحمال الطاقة العالية - لا يلزم وجود أسلاك إضافية - تحديث 15 نوفمبر 2017 & ndash؛ بعض لوحات BLE / أكوام البرامج تقدم
مفتاح الضوء المنشط بالحركة مع مستشعر الضوء: 5 خطوات
مفتاح الضوء المنشط بالحركة مع مستشعر الضوء: يحتوي مفتاح الضوء المنشط بالحركة على العديد من التطبيقات سواء في المنزل أو في المكتب. ومع ذلك ، فقد أضاف هذا ميزة دمج مستشعر الضوء ، بحيث لا يمكن تشغيل هذا الضوء إلا في الليل