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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 06:55:29