Arduino无SD卡使用PCM库实现音频播放及按键触发问题解决
Arduino无SD卡PCM音频播放(上电自动+按键触发)实现方案
实现核心要点
- 所有音频采样数据直接存入开发板Flash的PROGMEM区域,完全不需要外接SD卡
- 上电初始化阶段自动播放第一段预设音频
- 按键采用INPUT_PULLUP上拉输入配置,无需外接上拉电阻,有效避免电平浮动误触发,按下即可触发播放第二段音频
硬件接线说明
- 音频输出:PCM库默认输出到数字引脚9,引脚9外接功放/扬声器即可播放
- 按键接线:按键一端接数字引脚2,另一端直接接GND
完整可运行代码
#include <PCM.h> // 第一段音频:上电自动播放的采样数据 const unsigned char sample1[] PROGMEM = { 0,6,14,22,30,38,46,54,60,68,74,82,90,98,106,114,112, // 可替换为自己的第一段音频采样数据 }; // 第二段音频:按键触发播放的采样数据 const unsigned char sample2[] PROGMEM = { 112,106,98,90,82,74,68,60,54,46,38,30,22,14,6,0, // 可替换为自己的第二段音频采样数据 }; // 按键引脚定义 const int buttonPin = 2; // 播放状态标记,避免长按重复触发 bool isPlaying = false; void setup() { // 配置按键为上拉输入模式,为该需求的核心解决点,无需外接上拉电阻 pinMode(buttonPin, INPUT_PULLUP); // 上电自动播放第一段音频 startPlayback(sample1, sizeof(sample1)); } void loop() { // 检测按键是否按下(上拉输入模式下按下为低电平) if(digitalRead(buttonPin) == LOW && !isPlaying) { // 20ms防抖延迟,避免误触发 delay(20); // 二次确认按键状态 if(digitalRead(buttonPin) == LOW) { isPlaying = true; // 播放第二段触发音频 startPlayback(sample2, sizeof(sample2)); } } // 播放完成后重置标记,可根据实际音频长度调整延迟时长 if(isPlaying) { delay(1000); isPlaying = false; } }
注意事项
- PCM库仅支持AVR架构的Arduino开发板(Uno、Nano、Pro Mini等),其他架构板卡需更换对应音频播放库
- 音频采样数据需要提前转成8位无符号整数格式,采样率推荐8kHz,避免占用过多Flash空间
- 如果仍出现按键误触发的情况,可以适当增大防抖延迟的时长
内容的提问来源于stack exchange,提问作者Arjun_B
相关产品推荐
相关产品推荐

