演示如何检测已连接的 CodexPad 设备的实时按钮状态与摇杆移动。 本示例先通过 AT 指令与指定的 CodexPad 设备建立蓝牙连接,然后持续监控所有用户输入。 它展示了三种不同的按钮状态检测: 按下 (瞬间按下)、 释放 (瞬间释放)和 持续按住 。 同时,它监控模拟摇杆轴,当检测到超过设定阈值的显著变化时打印其值,从而过滤微小抖动。
#include <SoftwareSerial.h>
namespace {
constexpr uint8_t kDebugSerialRxPin = 6;
constexpr uint8_t kDebugSerialTxPin = 5;
constexpr uint8_t kAxisThreshold = 2;
const String kBluetoothDeviceAddress = "0C:3D:5E:9D:80:99";
constexpr uint32_t kBluetoothModuleSerialBaudRate = 115200;
SoftwareSerial g_debug_serial(kDebugSerialRxPin, kDebugSerialTxPin);
switch (button) {
return "Up";
}
return "Down";
}
return "Left";
}
return "Right";
}
return "Square(X)";
}
return "Triangle(Y)";
}
return "Cross(A)";
}
return "Circle(B)";
}
return "L1";
}
return "L2";
}
return "L3";
}
return "R1";
}
return "R2";
}
return "R3";
}
return "Select";
}
return "Start";
}
return "Home";
}
default: {
return {};
}
}
}
void Connect(Stream &bluetooth_stream, const String &bluetooth_device_address) {
if (bluetooth_device_address.length() != 17 || bluetooth_device_address[2] != ':' || bluetooth_device_address[5] != ':' ||
bluetooth_device_address[8] != ':' || bluetooth_device_address[11] != ':' || bluetooth_device_address[14] != ':') {
g_debug_serial.println("Error: Invalid MAC address format. Expected: XX:XX:XX:XX:XX:XX");
while (true);
}
g_debug_serial.print("Start to connect ");
g_debug_serial.println(kBluetoothDeviceAddress);
bluetooth_stream.println("AT+DISCON");
delay(100);
bluetooth_stream.println("AT+RESET");
delay(100);
bluetooth_stream.println("AT+ECHO=1");
delay(100);
bluetooth_stream.println("AT+ROLE=0");
delay(100);
bluetooth_stream.print("AT+CON=");
bluetooth_stream.println(bluetooth_device_address);
delay(100);
g_debug_serial.println("Connected");
}
}
void setup() {
g_debug_serial.begin(115200);
Serial.begin(kBluetoothModuleSerialBaudRate);
Connect(Serial, kBluetoothDeviceAddress);
}
void loop() {
g_codex_pad_frame_decoder.Update();
for (auto button : kAllButtons) {
if (g_codex_pad_frame_decoder.pressed(button)) {
g_debug_serial.print("Button ");
g_debug_serial.print(ButtonToString(button));
g_debug_serial.println(": pressed");
}
else if (g_codex_pad_frame_decoder.released(button)) {
g_debug_serial.print("Button ");
g_debug_serial.print(ButtonToString(button));
g_debug_serial.println(": released");
}
else if (g_codex_pad_frame_decoder.holding(button)) {
g_debug_serial.print("Button ");
g_debug_serial.print(ButtonToString(button));
g_debug_serial.println(": holding");
}
}
g_debug_serial.print("L(X:");
g_debug_serial.print(
g_debug_serial.print(", Y:");
g_debug_serial.print(
g_debug_serial.print("), R(X:");
g_debug_serial.print(
g_debug_serial.print(", Y:");
g_debug_serial.print(
g_debug_serial.println(")");
}
}