กลับไปหน้ารวมไฟล์
happy-birthday-lights-and-sounds-ea668e.md

อาร์เรย์ที่ออกแบบท่าเต้น: Happy Birthday แสงสีและเสียง

การเล่นเพลงด้วย Buzzer เป็นเพียงการวนซ้ำใน Array อย่างง่าย โปรเจกต์ Happy Birthday แสงสีและเสียง เพิ่มความซับซ้อนขึ้นอย่างมากโดยกำหนดให้โปรแกรมเมอร์ต้องซิงโครไนซ์โดเมนเอาต์พุตหลายตัวพร้อมกัน คุณต้องแน่ใจว่าการประมวลผล C++ ระดับไมโครวินาทีของการส่งโน้ตเพลง 1000 มิลลิวินาทีนั้นสอดคล้องกับการที่ LED ค่อยๆ สว่างขึ้น และถึงจุดสูงสุดตรงจังหวะพอดี!

button_led_basic_interaction_1772681969235.png

การประมวลผล Struct แบบหลาย Array

คุณไม่สามารถใช้ Array แยกกันสามชุด (melody[], durations[], ledPattern[]) และหวังว่ามันจะทำงานพร้อมกันอย่างสมบูรณ์แบบได้ เพราะจังหวะจะเกิดข้อผิดพลาดเสมอ

  1. คุณต้องสร้าง C++ Struct แบบรวมศูนย์
struct Beat {
  int freq;         // e.g. 262 (C4 note)
  int dur;          // e.g. 250 (Quarter note)
  byte ledStatus1;  // e.g. HIGH or LOW
  byte ledStatus2;  // e.g. HIGH or LOW
};
Beat song[25] = { ... }; // Massive song database!
  1. ฟังก์ชัน loop() จะวนซ้ำผ่าน song[i] เท่านั้น
  2. ในบล็อกการประมวลผลขนาดใหญ่เดียว, Arduino จะสั่ง tone(buzzerPin, song[i].freq) และสั่งงาน LED ทันทีด้วย digitalWrite(LED1, song[i].ledStatus1) จากนั้นจึงหน่วงเวลาด้วย delay(song[i].dur * 1.3) ตามหลักคณิตศาสตร์

การกำจัด delay() เพื่อการเฟดแบบ Synthesizer ที่แท้จริง

หากคุณต้องการให้ LED ค่อยๆ "Fade" (analogWrite()) เข้ากับจังหวะอย่างสมบูรณ์แบบแทนที่จะเปิดติดทันที, delay() จะทำให้โค้ดล้มเหลวโดยสิ้นเชิง

  • คุณต้องใช้การติดตาม millis() แบบดิบ
  • ในขณะที่ Buzzer ส่งเสียงโน้ตเพลง 400ms, ลูป while ที่ว่างเปล่าจะทำงานอย่างรวดเร็วเพื่อสร้างเส้นโค้งการหรี่ไฟแบบ analog PWM ทำให้ NeoPixel สว่างขึ้นอย่างแม่นยำก่อนที่โน้ตจะหยุดลง!
  • สิ่งนี้รับประกันการนำเสนอ Hardware ด้านภาพและเสียงที่ซิงโครไนซ์อย่างไม่มีที่ติราวกับภาพยนตร์!

Hardware สำหรับการซิงโครไนซ์แบบ Chiptune

  • Arduino Uno/Nano (การประมวลผลบน Form factor มาตรฐาน)
  • Standard Piezoelectric Passive Buzzer (สำหรับสร้างความถี่)
  • Array ของ Red, Green, และ Blue 5mm LED หรือ WS2812B แบบ Addressable โดยเฉพาะ
  • (หมายเหตุ: ตรวจสอบให้แน่ใจว่า LED และ Buzzer อยู่บน Hardware Timer ที่แยกจากกันโดยสิ้นเชิง! หาก Buzzer อยู่ที่ Pin 9 (Timer 1) และคุณใช้ analogWrite() บน Pin 10 (Timer 1) ความถี่ของ PWM จะไปทำลายความถี่ของ Tone โดยหลักคณิตศาสตร์!)

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

title: "Happy Birthday: Lights and Sounds"
description: "Choreographed chiptune arrays! Construct a massively complex, sequentially timed polyphonic sound-and-light-show matrix, perfectly syncing the mathematical duration of musical notes to physical LED explosions."
category: "Audio & Sound"
difficulty: "Intermediate"