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

如何仅在蓝牙连接状态变更时执行一次红外发射操作?

你的代码问题在于发送逻辑直接写在loop主循环中,只要蓝牙状态符合判定条件,每一轮循环都会执行一次发送指令,自然会持续输出红外编码。要实现状态变更时仅发送一次,只需要新增变量记录上一次的连接状态,仅当状态发生变化时才触发发送逻辑即可。

修改后的完整代码如下:

#include "BluetoothA2DPSink32.h"
#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRsend.h>

const uint16_t kIrLed = 2; 
IRsend irsend(kIrLed);
const uint16_t rawData[71] = {9004, 4556,  534, 602,  506, 654,  490, 624,  514, 1762,  490, 1764,  486, 1768,  516, 1762,  490, 626,  516, 622,  486, 1770,  514, 1762,  492, 1762,  486, 654,  490, 624,  514, 622,  486, 652,  490, 626,  514, 622,  488, 632,  512, 626,  512, 602,  532, 628,  490, 626,  514, 622,  486, 1770,  514, 1744,  510, 1742,  508, 1768,  516, 1762,  490, 1764,  512, 1744,  514, 1762,  492, 41344,  9022, 2298,  508};
const uint16_t rawData2[71] = {9022, 4574,  518, 622,  486, 654,  490, 628,  512, 1762,  490, 1764,  486, 1770,  514, 1762,  490, 626,  514, 622,  488, 1768,  514, 1762,  490, 1744,  506, 654,  490, 624,  516, 622,  486, 652,  492, 1764,  486, 1768,  516, 622,  488, 652,  490, 624,  516, 622,  488, 652,  490, 626,  514, 622,  488, 654,  490, 1764,  486, 1770,  514, 1762,  490, 1764,  486, 1770,  514, 1764,  490, 41360,  9006, 2318,  488};

BluetoothA2DPSink32 a2dp_sink;
// 新增变量存储上一次的连接状态,初始设为无效值
uint8_t lastConnState = 0xFF;

void setup() {
  irsend.begin();
  a2dp_sink.set_bits_per_sample(32);  
  a2dp_sink.start("Hifi32bit");   
}

void loop() {
  uint8_t currentState = a2dp_sink.get_connection_state();
  // 仅当状态发生变化时才执行操作
  if (currentState != lastConnState) {
    if (currentState == ESP_A2D_CONNECTION_STATE_CONNECTED) {
      irsend.sendRaw(rawData, 71, 38);
    } else if (currentState == ESP_A2D_CONNECTION_STATE_DISCONNECTED) {
      irsend.sendRaw(rawData2, 71, 38);
    }
    // 更新存储的上一次状态
    lastConnState = currentState;
  }
}

修改说明:

  • 新增了全局变量lastConnState用来记录上一次的蓝牙连接状态,初始值设为0xFF(不属于官方定义的连接状态枚举值),确保设备上电后第一次检测到状态就能正常触发发送逻辑。
  • 主循环中先读取当前的蓝牙连接状态,只有当前状态和上一次记录的状态不一致时,才判断当前状态类型、发送对应的红外编码。
  • 发送完成后立刻更新lastConnState的值为当前状态,后续循环只要状态没有变化,就不会再触发发送操作,实现每次状态切换仅发送一次的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:54:03