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
相关产品推荐
相关产品推荐

