演示通过基本轮询方式定期打印 CodexPad 所有按钮状态与摇杆值。 本示例先通过 AT 指令连接到指定的 CodexPad 设备(根据蓝牙设备地址),然后进入轮询循环。 每隔 30 毫秒,它会打印所有按钮的当前状态(按下/弹起)以及两个摇杆的原始模拟值(0‑255)。 它展示了 button_state() 用于离散按钮查询和 axis_value() 用于连续摇杆读取的基本用法。
#include <SoftwareSerial.h>
namespace {
constexpr uint8_t kDebugSerialRxPin = 6;
constexpr uint8_t kDebugSerialTxPin = 5;
const String kBluetoothDeviceAddress = "0C:3D:5E:9D:80:99";
constexpr uint32_t kBluetoothModuleSerialBaudRate = 115200;
SoftwareSerial g_debug_serial(kDebugSerialRxPin, kDebugSerialTxPin);
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();
static uint32_t s_print_time = 0;
if (s_print_time == 0 || s_print_time + 30 < millis()) {
s_print_time = millis();
g_debug_serial.print("Up:");
g_debug_serial.print(", ");
g_debug_serial.print("Down:");
g_debug_serial.print(",");
g_debug_serial.print("Left:");
g_debug_serial.print(", ");
g_debug_serial.print("Right:");
g_debug_serial.print(", ");
g_debug_serial.print("Square(X):");
g_debug_serial.print(", ");
g_debug_serial.print("Triangle(Y):");
g_debug_serial.print(", ");
g_debug_serial.print("Cross(A):");
g_debug_serial.print(", ");
g_debug_serial.print("Circle(B):");
g_debug_serial.print(", ");
g_debug_serial.print("L1:");
g_debug_serial.print(", ");
g_debug_serial.print("L2:");
g_debug_serial.print(", ");
g_debug_serial.print("L3:");
g_debug_serial.print(", ");
g_debug_serial.print("R1:");
g_debug_serial.print(", ");
g_debug_serial.print("R2:");
g_debug_serial.print(", ");
g_debug_serial.print("R3:");
g_debug_serial.print(", ");
g_debug_serial.print("Select:");
g_debug_serial.print(", ");
g_debug_serial.print("Start:");
g_debug_serial.print(", ");
g_debug_serial.print("Home:");
g_debug_serial.print(", ");
g_debug_serial.print("L(X:");
g_debug_serial.print(", Y:");
g_debug_serial.print("), R(X:");
g_debug_serial.print(", Y:");
g_debug_serial.println(")");
}
}