You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 15:36:03