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

ESP32同时使用NFC读取与I2S音频输出故障求助

ESP32 NFC与I2S音频共存异常问题

单独使用基于Adafruit PN532库的NFC读取功能、或基于ESP32-audioI2S库的I2S音频输出功能均正常,但同时启用两个功能时出现以下异常:

  • 在库中添加打印语句后,WiFi客户端无数据返回
  • 在loop函数中执行success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);语句后立即触发故障
  • 日志显示剩余堆内存充足,暂无法确认是否为内存问题

完整代码如下:

#include "Arduino.h"
#include "WiFiMulti.h"
#include "Audio.h"
#include <Adafruit_PN532.h>

#define PN532_IRQ (2)
#define PN532_RESET (3)
Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET);

#define I2S_DOUT 19
#define I2S_BCLK 5
#define I2S_LRC 18

Audio audio;
WiFiMulti wifiMulti;
String ssid = "VODAFONE-794F";
String password = "7kgnyKP2sPKLpA4K";

String getRadioURLFromUID(uint32_t cardid)
{
  switch (cardid)
  {
  case 0x56761F03: // 另一UID
    return "http://mp3.ffh.de/radioffh/hqlivestream.mp3";
  case 0x4E3E0C01: // 另一UID
    return "http://mp3.ffh.de/radioffh/hqlivestream.mp3";
  default:
    return ""; // 该UID未映射电台
  }
}

void setup()
{
  Serial.begin(115200);

  WiFi.mode(WIFI_STA);
  wifiMulti.addAP(ssid.c_str(), password.c_str());
  wifiMulti.run();
  if (WiFi.status() != WL_CONNECTED)
  {
    WiFi.disconnect(true);
    wifiMulti.run();
  }
  Serial.println("WiFi已连接。");

  audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
  audio.setVolume(1);
  audio.connecttohost("http://mp3.ffh.de/radioffh/hqlivestream.mp3");

  nfc.begin();
  // uint32_t versiondata = nfc.getFirmwareVersion();
  // if (!versiondata)
  // {
  //   Serial.println("未检测到PN53x模块。");
  //   while (1)
  //     ;
  // }
  nfc.SAMConfig();
  // Serial.println("NFC初始化完成。等待标签...");
}

void loop()
{
  uint8_t success;
  uint8_t uid[7] = {0};
  uint8_t uidLength;

  // 此处触发故障
  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);

  if (success)
  {
    uint32_t cardid = 0;
    for (int i = 0; i < uidLength; i++)
    {
      cardid <<= 8;
      cardid |= uid[i];
    }
    Serial.print("卡片ID: ");
    Serial.println(cardid, HEX);

    String radioURL = getRadioURLFromUID(cardid);
    if (radioURL != "")
    {
      Serial.print("正在播放电台: ");
      Serial.println(radioURL);
      audio.stopSong(); // 停止当前播放
      if (audio.connecttohost("http://mp3.ffh.de/radioffh/hqlivestream.mp3"))
      {
        log_i("剩余堆内存=%i", ESP.getFreeHeap());
        Serial.println("流播放启动成功!");
      }
      else
      {
        Serial.println("流播放启动失败!");
      }
    }
    else
    {
      Serial.println("该卡片未映射电台。");
    }
    // delay(2000); // 防止重复读取
  }
  audio.loop(); // 维持音频播放
}

void audio_error(const char *info)
{
  Serial.print("音频错误: ");
  Serial.println(info);
  audio.stopSong();
  delay(1000); // 重试前短暂等待
  audio.connecttohost("http://icecast.omroep.nl/radio2-bb-mp3");
}

// 可选回调函数
void audio_info(const char *info)
{
  Serial.print("信息        ");
  Serial.println(info);
}
void audio_id3data(const char *info)
{ // id3元数据
  Serial.print("id3数据     ");
  Serial.println(info);
}
void audio_eof_mp3(const char *info)
{ // 文件结束
  Serial.print("MP3结束     ");
  Serial.println(info);
}
void audio_showstation(const char *info)
{
  Serial.print("电台信息    ");
  Serial.println(info);
}
void audio_showstreamtitle(const char *info)
{
  Serial.print("流标题      ");
  Serial.println(info);
}
void audio_bitrate(const char *info)
{
  Serial.print("比特率      ");
  Serial.println(info);
}
void audio_commercial(const char *info)
{ // 时长(秒)
  Serial.print("广告时长    ");
  Serial.println(info);
}
void audio_icyurl(const char *info)
{ // 主页地址
  Serial.print("ICY地址     ");
  Serial.println(info);
}
void audio_lasthost(const char *info)
{ // 已播放的流URL
  Serial.print("最后播放地址");
  Serial.println(info);
}

内容的提问来源于stack exchange,提问作者devvin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 21:35:53