กลับไปหน้ารวมไฟล์
snowy-tree-86d9f9.md

ปีนี้พวกเราตกแต่งต้นไม้ด้วยไฟ Arduino Uno และความสำเร็จขั้นเทพ (เท่าที่ผ่านมา!) ของพี่คือการทำให้หิมะตกบนต้นไม้ได้!

การแสดงผลนี้จะสร้าง 'เกล็ดหิมะ' ที่ยอดต้นไม้ จำลองการร่วงหล่นพลิ้วไหว และกองสุมเป็นกองหิมะที่โคนต้น แถวล่างสุดจะค่อยๆ ละลาย ช่วยให้มีที่สำหรับหิมะใหม่ๆ!

พายุหิมะดิจิทัล: ฟิสิกส์การตกของหิมะบนต้นไม้

ไฟคริสต์มาสธรรมดาๆ ก็แค่ "กระพริบ" แต่โปรเจค Snowy Tree นี้สร้างสภาพแวดล้อมที่มีชีวิตขึ้นมาเลย ด้วยการพันต้นไม้ด้วย WS2811 Addressable LEDs คุณจะจำลองการเคลื่อนไหวพลิ้วไหวของพายุหิมะในฤดูหนาวได้ โปรเจคนี้ไม่ใช่แค่แสดงรูปแบบ แต่จำลองวงจรชีวิตในบรรยากาศของเกล็ดหิมะ—ตั้งแต่ "การเกิด" ที่ยอดต้นไม้ ไปจนถึง "การละลาย" ที่พื้น

การทำแผนที่เชิงพื้นที่: เชื่อมต่อ 1D สู่ 3D

ความท้าทายใหญ่ที่สุดในการตกแต่งต้นไม้ด้วย LED คือสายไฟเป็น สายแบบหนึ่งมิติ (1D) แต่ต้นไม้เป็น ทรงกรวยสามมิติ (3D) เพื่อให้หิมะดูเหมือนตกลงมาตรงๆ พี่ต้องหาอัตราส่วนของไฟ LED ในแต่ละชั้น (ring)

ส่วนที่ยากคือการหาอัตราส่วนของไฟในแต่ละชั้นนี่แหละ พี่เลยเขียนโค้ดชั่วคราวขึ้นมาให้สามารถเลื่อน 'เคอร์เซอร์' ไปรอบๆ ต้นไม้ได้ โดยจะติดทีละหนึ่ง LED มันใช้ Serial.read() เพื่อให้พี่ใช้ปุ่ม '-' และ '=' เลื่อนมันไปมาได้ และพิมพ์หมายเลขไฟปัจจุบันออกมาให้พี่บันทึกได้ วิธีนี้ทำให้พี่สร้าง 'เส้นแนวตั้ง' ขึ้นด้านหนึ่งของต้นไม้ โดยเริ่มที่ไฟหมายเลข 0

"ซอฟต์แวร์เคอร์เซอร์" ตัวนี้คือเครื่องมือทำแผนที่แบบมือของพี่เลย ด้วยการเลื่อน LED ที่ติดไฟเพียงดวงเดียวไปตามสายไฟ พี่บันทึกว่า "ดัชนี LED" ไหนตรงกับความสูงและกิ่งจริงๆ บนต้นไม้ จากข้อมูลนี้ พี่ก็คำนวณ อัตราส่วนแนวตั้ง สำหรับแต่ละ "ชั้น" ในแนวนอนของต้นไม้ได้ ด้วยอัตราส่วนเหล่านั้น ทุกครั้งที่เกล็ดหิมะต้อง 'ร่วง' ลงมา พี่ก็รู้แล้วว่าต้องเลื่อนมันกี่ดวงเพื่อสร้างภาพลวงตาว่ามันเคลื่อนที่ในแนวตั้ง! ตอนนี้ Arduino สามารถระบุได้อย่างแม่นยำแล้วว่า LED ดวงไหนควรติดไฟต่อไป เพื่อสร้างภาพลวงตาว่าเกล็ดหิมะ "ตกลงมา" ในแนวตั้ง แทนที่จะแค่เคลื่อนที่ไปตามสายไฟ

วงจรชีวิตของเกล็ดหิมะเสมือน

โค้ดนี้ใช้เอ็นจิ้นแอนิเมชันที่ซับซ้อน มีหลายขั้นตอนชัดเจน:

  1. การกำเนิด: เกล็ดหิมะจะถูกสุ่มสร้างขึ้นที่ LED ชั้นบนสุด ด้วยความเข้มที่แตกต่างกัน (ใช้สีขาวและสีฟ้าอ่อน)
  2. การพลิ้วไหว: ขณะที่เกล็ดหิมะ "ร่วงลงมา" โค้ดจะเพิ่มการส่ายในแนวนอนเล็กน้อย เลียนแบบการเคลื่อนที่วุ่นวายของหิมะจริงที่ถูกสายลมโชย
  3. การสะสม: เมื่อเกล็ดหิมะถึงปลายสายไฟ มันไม่ได้หายไปเฉยๆ มันจะยังคงติดไฟอยู่ สร้าง "กองหิมะ" สะสมขึ้น
  4. การละลายครั้งใหญ่: เพื่อป้องกันไม่ให้ต้นไม้ขาวโพลนไปหมด "ตัวจับเวลาในการละลาย" จะค่อยๆ ปิดไฟ LED ชั้นล่างสุด ทำให้มีที่ว่างสำหรับเกล็ดหิมะใหม่จากด้านบนได้ตลอดเวลา

การจัดการพลังงานสำหรับสิ่งมหัศจรรย์ในฤดูหนาว

Addressable LEDs นี่กินไฟไม่เบา ถ้าคุณตั้งค่า LED 100 ดวงให้เป็นสีขาวเต็มที่ (เหมือนหิมะ) มันอาจกินกระแสได้ถึง 6 แอมป์ โปรเจคนี้ใช้ แหล่งจ่ายไฟอุตสาหกรรม 5V 10A และ ตัวเก็บประจุขนาดใหญ่ 1000uF ขวางบนเรลไฟ เพื่อป้องกันปรากฏการณ์ "Browser Brownouts" — ที่แรงดันตกต่ำมากจน Arduino รีเซ็ตตัวเอง การจัดการนี้ช่วยให้การแสดงผลฤดูหนาวของคุณคงที่ตลอดทั้งคืน

โปรเจคนี้เป็นบทนำที่เพอร์เฟกต์สำหรับ Algorithmic Animation และแสดงให้เห็นว่าแค่การทำแผนที่เชิงพื้นที่นิดหน่อย ก็สามารถเปลี่ยนสายไฟธรรมดาๆ ให้กลายเป็นงานศิลปะเชิงโต้ตอบระดับมืออาชีพได้แล้ว

ข้อมูล Frontmatter ดั้งเดิม

title: "ต้นคริสต์มาสสายฟ้า ติดสโนว์แบบจัดเต็ม!"
description: "จำลองหิมะตกสุดตึงบน LED strip ที่พันรอบต้นไม้ งานง่ายแต่หล่อ ใช้ Arduino ควบคุม กับโค้ดเทพๆ รับรองวัยรุ่นต้องชอบ!"
author: "GameMaker"
category: "Lights & LEDs"
tags:
  - "lights"
  - "art"
  - "kids"
views: 4680
likes: 0
price: 1499
difficulty: "Intermediate"
components:
  - "1x Power Supply 5V 10A"
  - "1x WS2811 Addressable LED String"
  - "1x Capacitor 1000 uF"
  - "1x Arduino UNO"
tools: []
apps:
  - "1x Visual Studio 2015"
downloadableFiles: []
documentationLinks: []
passwordHash: "90bfe964af534b29f6da7efe3f8d82a5b9c55f5f311bb98a51f63c4bd5099ca5"
encryptedPayload: "U2FsdGVkX1+zHKLf/Lo+bmIEFgH/uSdnnQ8MAVsp9dAl3s+WRzJfaPnpq1akXTym86Pgn5WmMfrC5An16/A7ANWJbSf1azVJpbHD3OFPo3A="
seoDescription: "Arduino project simulating snow using a line of LEDs wrapped around a tree. Ideal for festive lighting."
videoLinks:
  - "https://www.dropbox.com/s/y4owtgdsbo585xd/2017-12-19%2022.06.49.mp4?dl=0"
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/snowy-tree-86d9f9_cover.png"
lang: "en"