Arduino GY-30光敏模块达标后停止读取及音乐播放失控问题求助
开盖音乐盒BH1750与DFPlayer Mini组合故障排查
问题描述
我制作了一个开盖触发播放音乐的盒子,使用GY-30(BH1750)光敏模块和DFPlayer Mini MP3播放器,预期逻辑是光照≥15lx时播放音乐,<15lx时暂停。但实际运行时,模块输出4次光照值后就停止读取,且光照变化时播放器无法停止播放。单独使用光敏模块或DFPlayer Mini都正常,只有两者组合且光照值≥15时才出问题。
代码
#include "Arduino.h" #include "SoftwareSerial.h" #include "DFRobotDFPlayerMini.h" #include <Wire.h> #include <BH1750.h> SoftwareSerial mySoftwareSerial(12, 11); // RX, TX DFRobotDFPlayerMini myDFPlayer; void printDetail(uint8_t type, int value); BH1750 lightMeter; # define ACTIVATED LOW void setup () { Serial.begin(115200); mySoftwareSerial.begin(9600); delay(300); Wire.begin(); lightMeter.begin(); Serial.println("Entry..."); Serial.println(); Serial.println(F("Initializing Player ")); if (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with mp3. Serial.println(F("Unable to begin:")); Serial.println(F("1.Please recheck the connection!")); Serial.println(F("2.Please insert the SD card!")); while(true); } Serial.println(F("MP3 Player online.")); Serial.println(F("BH1750 Test")); myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms myDFPlayer.volume(5); //Set volume value (0~30). myDFPlayer.EQ(DFPLAYER_EQ_NORMAL); } void loop () { float lux = lightMeter.readLightLevel(); Serial.print("Light: "); Serial.print(lux); Serial.println(" lx"); if (lux < 15) { myDFPlayer.pause(); } else if (lux >= 15) { myDFPlayer.start(); } }
串口输出
20:28:55.589 -> Entry... 20:28:55.589 -> 20:28:55.589 -> Initializing Player 20:28:56.361 -> MP3 Player online. 20:28:56.361 -> BH1750 Test 20:28:56.892 -> Light: 85.83 lx 20:28:56.892 -> Light: 85.83 lx 20:28:56.924 -> Light: 85.83 lx 20:28:56.970 -> Light: 85.00 lx
解决方案
1. 添加延迟避免通信时序冲突
BH1750的I2C通信与DFPlayer Mini的SoftwareSerial可能存在时序干扰,在loop循环末尾添加短延迟:
void loop () { float lux = lightMeter.readLightLevel(); Serial.print("Light: "); Serial.print(lux); Serial.println(" lx"); if (lux < 15) { myDFPlayer.pause(); } else if (lux >= 15) { myDFPlayer.start(); } delay(200); // 增加延迟,缓解通信冲突 }
2. 优化播放/暂停逻辑,减少重复指令
当前代码每次循环都发送播放/暂停指令,可能导致DFPlayer Mini进入异常状态。添加状态标记,仅在状态变化时发送指令:
// 全局变量添加播放状态标记 bool isPlaying = false; void loop () { float lux = lightMeter.readLightLevel(); Serial.print("Light: "); Serial.print(lux); Serial.println(" lx"); if (lux < 15) { if (isPlaying) { myDFPlayer.pause(); isPlaying = false; } } else { if (!isPlaying) { myDFPlayer.start(); isPlaying = true; } } delay(200); }
3. 排查电源供电问题
DFPlayer Mini播放时电流会上升,可能导致BH1750供电不足。确保使用功率足够的电源,或给DFPlayer Mini电源引脚并联100µF电解电容滤波。
4. 更换SoftwareSerial引脚
部分Arduino引脚的硬件特性可能影响SoftwareSerial稳定性,尝试更换RX/TX引脚(比如使用2、3号引脚),避开与I2C引脚(A4/A5)相邻的引脚。
内容的提问来源于stack exchange,提问作者Mcoski
相关产品推荐
相关产品推荐

