สารบัญ:

LED Spiral Tree: 4 ขั้นตอน (พร้อมรูปภาพ)
LED Spiral Tree: 4 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: LED Spiral Tree: 4 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: LED Spiral Tree: 4 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: How To Wrap Trees With Lights 2024, กรกฎาคม
Anonim
ต้นไม้เกลียว LED
ต้นไม้เกลียว LED
ต้นไม้เกลียว LED
ต้นไม้เกลียว LED
ต้นไม้เกลียว LED
ต้นไม้เกลียว LED

ฉันชอบแถบ LED ทุกชนิด ฉันสร้างแสงสีรุ้งที่สวยงามกับพวกเขา แม้แต่สิ่งที่ระบุไม่ได้ก็มีประโยชน์ ฉันสร้างโคมไฟกลางแจ้งแบบร่มในตลาดโดยติดมันไว้กับซี่โครงที่ไม่เป็นร่ม ดังนั้นเมื่อต้นเกลียวของฉันระเบิด ฉันตัดสินใจพันแถบไฟ LED ไว้รอบมัน

ขั้นตอนที่ 1: คอนโทรลเลอร์

คอนโทรลเลอร์
คอนโทรลเลอร์
คอนโทรลเลอร์
คอนโทรลเลอร์
คอนโทรลเลอร์
คอนโทรลเลอร์

ฉันตัดสินใจใช้ไฟ LED RGB ที่ไม่สามารถระบุที่อยู่ได้ ซึ่งหมายความว่าฉันสามารถมีเอฟเฟกต์ที่ตั้งโปรแกรมไว้ได้ แต่ไฟ LED ทั้งหมดเปลี่ยนสีพร้อมกัน นี่หมายความว่าจำเป็นต้องมีคอนโทรลเลอร์ ฉันสามารถใช้ Arduino uno และทำการทดสอบเบื้องต้นโดยใช้เกราะ RGB แต่ลงเอยด้วยการใช้บอร์ดเดี่ยวแบบกำหนดเองพร้อมชิป Atmega328 เปล่า เพียงแค่ต้องเปลี่ยนโปรแกรมเมอร์เป้าหมายและตั้งโปรแกรมชิปโดยตรง

ฉันมีแผงเหล่านี้เหลืออยู่มากมายจากโครงการโคมไฟอื่นๆ รู้สึกอิสระที่จะใช้ตัวควบคุมแบบอินไลน์แบบอินไลน์ที่มีราคาถูกเหมือนที่ฉันทำบนร่มแทน

ฉันลงเอยด้วยการใช้การสาธิตการตัดขวางแบบช้าเป็นฐานสำหรับต้นไม้

/** รหัสสำหรับ cross-fading LED 3 ดวง สีแดง สีเขียว และสีน้ำเงิน (RGB) * ในการสร้างการจาง คุณต้องทำสองสิ่ง: * 1. อธิบายสีที่คุณต้องการให้แสดง * 2. ระบุลำดับที่คุณต้องการ ให้จางลง * * อธิบายสี: * สีเป็นเพียงอาร์เรย์ของสามเปอร์เซ็นต์, 0-100, * ควบคุมไฟ LED สีแดง สีเขียว และสีน้ำเงิน * * สีแดงคือ LED สีแดงที่เต็ม สีฟ้าและสีเขียวปิด * int สีแดง = { 100, 0, 0 } * สีขาวสลัวคือไฟ LED ทั้งสามดวงที่ 30% * int dimWhite = {30, 30, 30} * เป็นต้น * * สีทั่วไปบางสีมีให้ด้านล่าง หรือสร้างสีของคุณเอง * * รายการ ORDER: * ในส่วนหลักของโปรแกรม คุณต้องแสดงรายการลำดับ * ที่คุณต้องการให้สีปรากฏ เช่น * crossFade (สีแดง); * crossFade (สีเขียว); * crossFade (สีน้ำเงิน); * * สีเหล่านั้นจะปรากฏตามลำดับ โดยจางจาก * สีหนึ่งไปเป็นสีถัดไป * * นอกจากนี้ คุณสามารถปรับการตั้งค่าเสริม 5 แบบ: * 1. สีเริ่มต้นถูกตั้งค่าเป็นสีดำ (ดังนั้นสีแรกจะจางลง ใน) แต่ * คุณสามารถตั้งค่าสีเริ่มต้นให้เป็นสีอื่นได้ * 2 ลูปภายในทำงานสำหรับ 1,020 อินเตอร์; ตัวแปร 'รอ' * กำหนดระยะเวลาโดยประมาณของการตัดขวางเดี่ยว ตามทฤษฎีแล้ว * 'รอ' ที่ 10 ms ควรทำ crossFade ประมาณ 10 วินาที ในทางปฏิบัติ * ฟังก์ชันอื่น ๆ ที่โค้ดทำงานช้าลง * เหลือประมาณ 11 วินาทีบนกระดานของฉัน วายเอ็มเอ็มวี * 3. หากตั้งค่า 'ซ้ำ' เป็น 0 โปรแกรมจะวนซ้ำไปเรื่อย ๆ * หากตั้งค่าเป็นตัวเลข จะวนซ้ำจำนวนนั้น * จากนั้นหยุดที่สีสุดท้ายในลำดับ (ตั้งค่า 'return' เป็น 1, * และทำให้สีสุดท้ายเป็นสีดำถ้าคุณต้องการให้มันจางหายไปในตอนท้าย) * 4. มีตัวแปร 'hold' ที่เป็นตัวเลือก ซึ่งจะหยุดโปรแกรม * สำหรับ 'hold' มิลลิวินาทีเมื่อ สีเสร็จสมบูรณ์ * แต่ก่อนที่สีถัดไปจะเริ่มขึ้น * 5. ตั้งค่าแฟล็ก DEBUG เป็น 1 หากคุณต้องการให้เอาต์พุตการดีบัก * ส่งไปยังมอนิเตอร์แบบอนุกรม * * ภายในของโปรแกรมไม่ซับซ้อน แต่ * จุกจิกเล็กน้อย - มีการอธิบายการทำงานภายใน * ใต้ลูปหลัก * * เมษายน 2550, Clay Shirky *

/ เอาท์พุต

int grnPin = 9; // LED สีเขียว เชื่อมต่อกับพินดิจิตอล 10 int redPin = 10; // LED สีแดง ต่อกับขาดิจิตอล 9 int bluPin = 11; // LED สีน้ำเงิน ต่อกับขาดิจิตอล 11

// อาร์เรย์สี

int สีดำ[3] = { 0, 0, 0 }; int สีขาว[3] = { 100, 100, 100 }; int สีแดง[3] = { 100, 0, 0 }; int สีเขียว[3] = { 0, 100, 0 }; สีน้ำเงินเข้ม[3] = { 0, 0, 100 }; int สีเหลือง[3] = { 40, 95, 0 }; int dimWhite[3] = { 30, 30, 30 }; // ฯลฯ.

// ตั้งค่าสีเริ่มต้น

int redVal = สีดำ[0]; int grnVal = สีดำ [1]; int bluVal = สีดำ[2];

รอสักครู่ = 3; // 10ms หน่วงเวลา crossFade ภายใน; เพิ่มขึ้นเพื่อให้จางลงช้าลง

int ถือ = 0; // ถือตัวเลือกเมื่อสีเสร็จสมบูรณ์ ก่อน crossFade int DEBUG = 0 ถัดไป // เคาน์เตอร์ DEBUG; หากตั้งค่าเป็น 1 จะเขียนค่ากลับผ่าน serial int loopCount = 60; // DEBUG ควรรายงานบ่อยแค่ไหน? int ซ้ำ = 0; // เราควรวนซ้ำกี่ครั้งก่อนที่จะหยุด? (0 สำหรับไม่หยุด) int j = 0; // ตัวนับวนซ้ำ

// เริ่มต้นตัวแปรสี

int ก่อนหน้า = redVal; int ก่อนหน้า = grnVal; int ก่อนหน้า = bluVal;

// ตั้งค่าเอาต์พุต LED

การตั้งค่าเป็นโมฆะ () {pinMode (redPin, OUTPUT); // ตั้งค่าพินเป็นเอาต์พุต pinMode(grnPin, OUTPUT); โหมดพิน (บลูพิน, เอาต์พุต);

if (DEBUG) { // หากเราต้องการดูค่าสำหรับการดีบัก…

Serial.begin(9600); // …ตั้งค่าเอาต์พุตอนุกรม } }

// โปรแกรมหลัก: แสดงรายการลำดับของ crossfades

วงเป็นโมฆะ () { crossFade (สีแดง); crossFade(สีเขียว); crossFade(สีน้ำเงิน); crossFade(สีเหลือง);

if (repeat) { // เราวนซ้ำจำนวน จำกัด หรือไม่?

เจ += 1; if (j >= ซ้ำ) { // เราอยู่ที่นั่นหรือยัง? ทางออก(j); //ถ้าอย่างนั้นก็หยุดเถอะ } } }

/* ด้านล่างบรรทัดนี้เป็นคณิตศาสตร์ -- คุณไม่จำเป็นต้องเปลี่ยนแปลงสิ่งนี้สำหรับพื้นฐาน

* * โปรแกรมทำงานดังนี้: * ลองนึกภาพ crossfade ที่ย้าย LED สีแดงจาก 0-10 * สีเขียวจาก 0-5 และสีน้ำเงินจาก 10 เป็น 7 ใน * สิบขั้นตอน * เราต้องการนับ 10 ขั้นตอนและเพิ่มหรือ * ลดค่าสีโดยเพิ่มขึ้นทีละขั้นเท่าๆ กัน * ลองนึกภาพ a + หมายถึงการเพิ่มค่าขึ้น 1 และ - * เท่ากับการลดค่าลง เฟด 10 สเต็ปของเราจะมีลักษณะดังนี้: * * 1 2 3 4 5 6 7 8 9 10 * R + + + + + + + + + + * G + + + + + * B - - - * * สีแดงเพิ่มขึ้นจาก 0 ถึง 10 ในสิบขั้น สีเขียวจาก * 0-5 ใน 5 ขั้นตอน และสีน้ำเงินตกจาก 10 เป็น 7 ในสามขั้นตอน * * ในโปรแกรมจริง เปอร์เซ็นต์ของสีจะถูกแปลงเป็นค่า * 0-255 และมี 1020 ขั้นตอน (255*4) * * หากต้องการทราบว่าควรมีขั้นตอนใหญ่เพียงใดระหว่างค่าหนึ่งขึ้นหรือลงของค่า LED ค่าใดค่าหนึ่ง เราเรียก CalculStep() * ซึ่งคำนวณช่องว่างสัมบูรณ์ระหว่างค่าเริ่มต้นและค่าสิ้นสุด * และจากนั้น แบ่งช่องว่างนั้นด้วย 1,020 เพื่อกำหนดขนาดของขั้นตอน * ระหว่างการปรับค่า */

int คำนวณขั้นตอน (int prevValue, int endValue) {

ขั้นตอน int = endValue - prevValue; // อะไรคือช่องว่างโดยรวม? if (step) {// ถ้ามันไม่ใช่ศูนย์ step = 1020/step; // หารด้วย 1,020 } return step; }

/* ฟังก์ชันถัดไปคือ calcVal เมื่อค่าวนรอบ i, * ถึงขนาดขั้นที่เหมาะสมสำหรับสีใดสีหนึ่ง * จะเพิ่มหรือลดค่าของสีนั้นขึ้น 1 * (R, G และ B คำนวณแยกกัน) */

int คำนวณVal (ขั้นตอน int, int val, int i) {

if ((ขั้นตอน) && i % step == 0) { // หากขั้นตอนไม่เป็นศูนย์และถึงเวลาเปลี่ยนค่า

if (ขั้นตอน > 0) { // เพิ่มค่าถ้าขั้นตอนเป็นบวก… val += 1; } else if (ขั้นตอนที่ 255) { val = 255; } else if (val < 0) { val = 0; } ค่าส่งคืน; }

/* crossFade() แปลงสีเปอร์เซ็นต์เป็น a

* ช่วง 0-255 จากนั้นวนซ้ำ 1,020 ครั้ง ตรวจดูว่า * จำเป็นต้องอัปเดตค่าในแต่ละครั้งหรือไม่ จากนั้นจึงเขียน * ค่าสีไปยังหมุดที่ถูกต้อง */

เป็นโมฆะ crossFade (สี int [3]) {

// แปลงเป็น 0-255 int R = (สี[0] * 255) / 100; int G = (สี [1] * 255) / 100; int B = (สี[2] * 255) / 100;

int stepR = คำนวณขั้นตอน (prevR, R);

int stepG = คำนวณขั้นตอน (prevG, G); int stepB = คำนวณขั้นตอน (prevB, B);

สำหรับ (int i = 0; i <= 1,020; i++) { redVal = คำนวณVal (stepR, redVal, i); grnVal = คำนวณVal(stepG, grnVal, i); bluVal = คำนวณVal(stepB, bluVal, i);

analogWrite (redPin, redVal); // เขียนค่าปัจจุบันไปยังพิน LED

analogWrite (grnPin, grnVal); analogWrite (bluPin, bluVal);

ล่าช้า(รอ); // หยุดชั่วคราวสำหรับ 'รอ' มิลลิวินาทีก่อนที่จะทำการวนซ้ำ

if (DEBUG) { // หากเราต้องการเอาต์พุตแบบอนุกรม ให้พิมพ์ที่

if (i == 0 หรือ i % loopCount == 0) { // จุดเริ่มต้น และทุกๆ loopCount ครั้ง Serial.print ("Loop/RGB: #"); Serial.print(i); Serial.print(" | "); Serial.print (redVal); Serial.print(" / "); Serial.print(grnVal); Serial.print(" / "); Serial.println (bluVal); } ดีบัก += 1; } } // อัปเดตค่าปัจจุบันสำหรับลูปถัดไป prevR = redVal; ก่อนหน้า = grnVal; ก่อนหน้า = bluVal; ล่าช้า(ถือ); // หยุดชั่วคราวสำหรับตัวเลือก 'รอ' มิลลิวินาทีก่อนที่จะทำการวนซ้ำ }

ขั้นตอนที่ 2: ห่อต้นไม้

ห่อต้นไม้
ห่อต้นไม้
ห่อต้นไม้
ห่อต้นไม้
ห่อต้นไม้
ห่อต้นไม้
ห่อต้นไม้
ห่อต้นไม้

ฉันใช้แถบกันน้ำเพราะสิ่งเหล่านี้จะอยู่กลางแจ้ง พวกเขาติดด้วยตัวเอง แต่ฉันรีบติดตามด้วยลวดผูกเพื่อให้แน่ใจว่าพวกเขาจะอยู่นิ่ง แฮ็คที่ง่ายและสะดวก ความสามารถในการป้อนผ่านของแถบทำให้ง่ายต่อการป้อนแหล่งจ่ายไฟที่ด้านล่างและดึงพลังงานจากด้านบนไปยังดาว

ขั้นตอนที่ 3: Don't forget the Star on Top

อย่าลืมดาวอยู่ด้านบน
อย่าลืมดาวอยู่ด้านบน
อย่าลืมดาวอยู่ข้างบน
อย่าลืมดาวอยู่ข้างบน
อย่าลืมดาวอยู่ด้านบน
อย่าลืมดาวอยู่ด้านบน
อย่าลืมดาวอยู่ด้านบน
อย่าลืมดาวอยู่ด้านบน

สำหรับดารา ฉันใช้ชิป 10W คู่หนึ่งเพื่อเรียกร้องความสนใจ ฉันบัดกรีพวกมันเป็นแผ่นทองแดงเป็นฮีทซิงค์ ฉันสามารถใช้แถบมากกว่านี้ได้เนื่องจากมีเหลืออยู่เล็กน้อย

ขั้นตอนที่ 4: ทดลองใช้งาน

Image
Image

ลองครั้งแรกมีความเร็วเร็วเกินไป….

พอสงบสติอารมณ์ได้ก็ดูดีทีเดียว

แนะนำ: