如何仅在蓝牙连接状态变更时执行一次红外发射操作?
你的代码问题在于发送逻辑直接写在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
相关产品推荐
相关产品推荐

