跳到主要内容

项目 5:声控电子蜡烛(50 分)

任务描述​

用声音传感器、全彩 LED 和奏乐单元设计声控蜡烛。LED 默认闪烁绿光;吹一口气后切换为闪烁红光模拟点燃;再吹一口则熄灭 LED 并演奏一段音乐(至少三个音符)后保持熄灭,模拟吹灭。过程循环。

核心:声音触发、LED 多种闪烁模式控制、以及简单的音乐播放功能集成。

所需硬件​

  • Steamania JoyKit V2(主控制器)
  • 声音传感器模块(麦克风)
  • WS2812B 全彩 LED 模块
  • 蜂鸣器/奏乐模块

核心任务​

  1. 初始化 LED 闪烁绿光(默认状态)
  2. 检测声音触发(吹气)
  3. 第一次吹气切换到红色闪烁模式(蜡烛点燃)
  4. 第二次吹气熄灭 LED 并播放音乐
  5. 持续循环所有状态

参考方案​

程序代码​

; 声控电子蜡烛程序
; 声音传感器控制 LED 状态和音乐播放

; 初始化 - 第 000-005 行
000 C3 0001 0000 ; 启用声音传感器
001 C7 0001 0000 ; 启用 WS2812B LED 控制
002 C8 0001 0000 ; 启用蜂鸣器/奏乐模块
003 10 0000 0030 ; R30 = 0(状态寄存器:0=绿色,1=红色,2=熄灭)
004 0E 0000 0010 ; 跳转到第 010 行的主循环

; 状态 0:绿色闪烁(蜡烛熄灭)- 第 010-01F 行
010 11 0030 0000 ; R00 = R30(读取当前状态)
011 04 0000 0018 ; 如果 R00 != 0,跳转到检查下一个状态
012 E4 0000 FF00 ; 设置 LED 为绿色(R=0, G=255, B=0)
013 02 01F4 0000 ; 延时 500 毫秒
014 E4 0000 0000 ; 关闭 LED
015 02 01F4 0000 ; 延时 500 毫秒
016 04 0001 001A ; 如果检测到声音(R01 > 0),跳转到状态切换
017 0E 0000 0010 ; 跳转回第 010 行(继续绿色闪烁)

018 04 0001 0020 ; 如果检测到声音,跳转到状态切换
019 0E 0000 0010 ; 跳转回第 010 行

; 状态 1:红色闪烁(蜡烛点燃)- 第 020-02F 行
020 11 0030 0000 ; R00 = R30(读取当前状态)
021 04 0001 0028 ; 如果 R00 != 1,跳转到检查下一个状态
022 E4 00FF 0000 ; 设置 LED 为红色(R=255, G=0, B=0)
023 02 01F4 0000 ; 延时 500 毫秒
024 E4 0000 0000 ; 关闭 LED
025 02 01F4 0000 ; 延时 500 毫秒
026 04 0001 002A ; 如果检测到声音,跳转到状态切换
027 0E 0000 0020 ; 跳转回第 020 行(继续红色闪烁)

028 04 0001 0030 ; 如果检测到声音,跳转到状态切换
029 0E 0000 0020 ; 跳转回第 020 行

; 状态 2:熄灭并播放音乐(蜡烛吹灭)- 第 030-03F 行
030 11 0030 0000 ; R00 = R30(读取当前状态)
031 04 0002 0038 ; 如果 R00 != 2,跳转到状态切换检查
032 E4 0000 0000 ; 关闭 LED
033 D0 0040 0000 ; 播放从第 040 行开始的音乐
034 02 03E8 0000 ; 延时 1000 毫秒(音乐持续时间)
035 04 0001 003A ; 如果检测到声音,跳转到状态切换
036 0E 0000 0030 ; 跳转回第 030 行(保持熄灭)

038 04 0001 0040 ; 如果检测到声音,跳转到状态切换
039 0E 0000 0030 ; 跳转回第 030 行

; 状态切换 - 第 040-04F 行
040 11 0030 0000 ; R00 = R30(读取当前状态)
041 04 0000 0048 ; 如果 R00 == 0,跳转到设置状态 1
042 04 0001 0050 ; 如果 R00 == 1,跳转到设置状态 2
043 10 0000 0030 ; R30 = 0(重置为绿色状态)
044 02 03E8 0000 ; 延时 1000 毫秒
045 0E 0000 0010 ; 跳转回第 010 行

048 10 0001 0030 ; R30 = 1(设置为红色状态)
049 02 03E8 0000 ; 延时 1000 毫秒
04A 0E 0000 0020 ; 跳转回第 020 行

050 10 0002 0030 ; R30 = 2(设置为熄灭状态)
051 02 03E8 0000 ; 延时 1000 毫秒
052 0E 0000 0030 ; 跳转回第 030 行

; 音乐数据 - 第 060-06F 行
060 D1 0262 0000 ; 音符 C5 (523Hz)
061 D1 0294 0000 ; 音符 D5 (587Hz)
062 D1 032F 0000 ; 音符 E5 (659Hz)
063 D1 0000 0000 ; 音乐结束

详细解释​

初始化(第 000-005 行)​

第 000 行:C3 0001 0000

  • 启用声音传感器模块
  • 检测吹气声音所必需

第 001 行:C7 0001 0000

  • 启用 WS2812B LED 控制
  • 全彩 LED 操作所必需

第 002 行:C8 0001 0000

  • 启用蜂鸣器/奏乐模块
  • 音乐播放所必需

第 003 行:10 0000 0030

  • 初始化状态寄存器 R30 = 0
  • 状态 0 = 绿色闪烁(蜡烛熄灭)

第 004 行:0E 0000 0010

  • 跳转到第 010 行的主循环

状态 0:绿色闪烁(第 010-019 行)​

第 010 行:11 0030 0000

  • 从 R30 读取当前状态

第 011 行:04 0000 0018

  • 条件跳转:如果状态 != 0,检查下一个状态

第 012 行:E4 0000 FF00

  • 设置 LED 为绿色(R=0, G=255, B=0)

第 013 行:02 01F4 0000

  • 延时 500 毫秒

第 014 行:E4 0000 0000

  • 关闭 LED

第 015 行:02 01F4 0000

  • 延时 500 毫秒

第 016 行:04 0001 001A

  • 条件跳转:如果检测到声音,切换状态

第 017 行:0E 0000 0010

  • 继续绿色闪烁循环

状态 1:红色闪烁(第 020-029 行)​

第 022 行:E4 00FF 0000

  • 设置 LED 为红色(R=255, G=0, B=0)
  • 模拟蜡烛火焰

第 023-025 行:每 500 毫秒红色闪烁一次

第 026 行:04 0001 002A

  • 检查声音触发以切换状态

状态 2:熄灭并播放音乐(第 030-039 行)​

第 032 行:E4 0000 0000

  • 关闭 LED(蜡烛熄灭)

第 033 行:D0 0040 0000

  • 播放从第 040 行开始的音乐
  • 使用指令 0xD0 进行音乐播放

第 034 行:02 03E8 0000

  • 延时 1000 毫秒用于音乐持续时间

状态切换(第 040-052 行)​

第 040 行:11 0030 0000

  • 读取当前状态

第 041 行:04 0000 0048

  • 如果状态 == 0(绿色),切换到状态 1(红色)

第 042 行:04 0001 0050

  • 如果状态 == 1(红色),切换到状态 2(熄灭)

第 043 行:10 0000 0030

  • 如果状态 == 2(熄灭),重置为状态 0(绿色)

音乐数据(第 060-063 行)​

第 060 行:D1 0262 0000

  • 播放音符 C5 (523Hz)

第 061 行:D1 0294 0000

  • 播放音符 D5 (587Hz)

第 062 行:D1 032F 0000

  • 播放音符 E5 (659Hz)

第 063 行:D1 0000 0000

  • 音乐结束标记

关键概念​

1. 声音检测​

声音传感器检测吹气。使用寄存器 R01 检查声音电平是否超过阈值。

2. 状态机​

由寄存器 R30 控制的三种状态:

  • 状态 0 (R30=0):绿色闪烁 - 蜡烛熄灭
  • 状态 1 (R30=1):红色闪烁 - 蜡烛点燃
  • 状态 2 (R30=2):LED 熄灭 + 音乐 - 蜡烛吹灭

3. 音乐播放​

使用指令 0xD0 播放音乐,0xD1 定义音符。每个音符指定频率。

4. LED 颜色控制​

  • 绿色:E4 0000 FF00(R=0, G=255, B=0)
  • 红色:E4 00FF 0000(R=255, G=0, B=0)
  • 关闭:E4 0000 0000(R=0, G=0, B=0)

评估标准​

标准优秀 (5)良好 (4)合格 (3)需改进 (2)
声音检测可靠的声音触发小检测问题触发不一致声音传感器不工作
LED 控制正确的颜色和闪烁小颜色/时间问题闪烁工作但有错误LED 工作不正常
音乐播放清晰的 3+ 音符音乐小音频问题音乐播放但不完整音乐不工作
状态转换平滑的状态变化小转换问题状态变化但粗糙状态转换不正确
代码质量整洁、组织良好的代码良好结构代码能工作但混乱代码不工作

扩展挑战​

  1. 可变灵敏度:调整声音检测阈值以适应不同环境
  2. 闪烁效果:为红色 LED 亮度添加随机变化以实现逼真的火焰效果
  3. 多首歌曲:存储不同的旋律并随机播放
  4. 自动关闭:在熄灭状态 30 秒后自动返回绿色状态

相关文档​