项目 5:声控电子蜡烛(50 分)
任务描述
用声音传感器、全彩 LED 和奏乐单元设计声控蜡烛。LED 默认闪烁绿光;吹一口气后切换为闪烁红光模拟点燃;再吹一口则熄灭 LED 并演奏一段音乐(至少三个音符)后保持熄灭,模拟吹灭。过程循环。
核心:声音触发、LED 多种闪烁模式控制、以及简单的音乐播放功能集成。
所需硬件
- Steamania JoyKit V2(主控制器)
- 声音传感器模块(麦克风)
- WS2812B 全彩 LED 模块
- 蜂鸣器/奏乐模块
核心任务
- 初始化 LED 闪烁绿光(默认状态)
- 检测声音触发(吹气)
- 第一次吹气切换到红色闪烁模式(蜡烛点燃)
- 第二次吹气熄灭 LED 并播放音乐
- 持续循环所有状态
参考方案
程序代码
; 声控电子蜡烛程序
; 声音传感器控制 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+ 音符音乐 | 小音频问题 | 音乐播放但不完整 | 音乐不工作 |
| 状态转换 | 平滑的状态变化 | 小转换问题 | 状态变化但粗糙 | 状态转换不正确 |
| 代码质量 | 整洁、组织良好的代码 | 良好结构 | 代码能工作但混乱 | 代码不工作 |
扩展挑战
- 可变灵敏度:调整声音检测阈值以适应不同环境
- 闪烁效果:为红色 LED 亮度添加随机变化以实现逼真的火焰效果
- 多首歌曲:存储不同的旋律并随机播放
- 自动关闭:在熄灭状态 30 秒后自动返回绿色状态
相关文档
- 指令集总结 - 完整指令集概述