
Arduino 上手教程



#include "M5Chain.h"
#define RXD_PIN GPIO_NUM_5 // 47 for the other side of Chain DualKey
#define TXD_PIN GPIO_NUM_6 // 48 for the other side of Chain DualKey
Chain M5Chain;
device_list_t *device_list = NULL;
uint16_t device_count = 0;
uint8_t opr_status = 0;
uint8_t switch_id = 0;
bool switch_found = false;
const uint16_t OPEN_THRESHOLD = 3967;
const uint16_t CLOSE_THRESHOLD = 128;
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("===========================");
Serial.println("M5Stack Chain Switch Test");
M5Chain.begin(&Serial2, 115200, RXD_PIN, TXD_PIN);
while (!M5Chain.isDeviceConnected()) {
Serial.println("No device connected");
delay(1000);
}
M5Chain.getDeviceNum(&device_count);
device_list = (device_list_t *)malloc(sizeof(device_list_t));
device_list->count = device_count;
device_list->devices = (device_info_t *)malloc(sizeof(device_info_t) * device_count);
M5Chain.getDeviceList(device_list);
for (uint16_t i = 0; i < device_count; i++) {
if (device_list->devices[i].device_type == CHAIN_SWITCH_TYPE_CODE) {
switch_id = device_list->devices[i].id;
switch_found = true;
Serial.printf("ID[%d] is Chain Switch\n", switch_id);
break;
}
}
if (!switch_found) {
Serial.println("Chain Switch not found");
return;
}
// Set the onboard RGB LED brightness (0-100).
M5Chain.setRGBLight(switch_id, 50, &opr_status);
// Set open/close thresholds without saving them to flash.
M5Chain.setSwitchThresholdValue(switch_id, OPEN_THRESHOLD, CLOSE_THRESHOLD,
&opr_status, CHAIN_SAVE_FLASH_DISABLE);
M5Chain.setSwitchDirection(switch_id, CHAIN_SWITCH_DOWNUP_INC, &opr_status,
CHAIN_SAVE_FLASH_DISABLE);
}
void loop() {
if (!switch_found) {
delay(1000);
return;
}
uint16_t switch12Bit = 0;
switch_status_type_t switch_status = CHAIN_SWITCH_OPEN;
if (M5Chain.getSwitch12BitAdc(switch_id, &switch12Bit) == CHAIN_OK &&
M5Chain.getSwitchStatus(switch_id, &switch_status) == CHAIN_OK) {
uint8_t rgb[3];
if (switch_status == CHAIN_SWITCH_CLOSE) {
rgb[0] = 0;
rgb[1] = 255;
rgb[2] = 0;
} else {
rgb[0] = 255;
rgb[1] = 0;
rgb[2] = 0;
}
M5Chain.setRGBValue(switch_id, 0, 1, rgb, sizeof(rgb), &opr_status);
Serial.printf("ADC: %u, status: %s\n", switch12Bit,
switch_status == CHAIN_SWITCH_CLOSE ? "ON" : "OFF");
} else {
Serial.println("Failed to read Chain Switch");
}
delay(200);
}用 Chain Bridge 连接器连接主控 Chain DualKey 和 Chain Switch。连接时需要注意方向,三角箭头从主控 Chain DualKey 指向外侧,如图:
本案例使用 Chain DualKey 的 GPIO5 作为 RX、GPIO6 作为 TX。若将 Chain Switch 连接到 Chain DualKey 的另一侧接口,或改用其他主控设备,请根据实际接线修改程序中的 RXD_PIN 和 TXD_PIN。
Chain Switch 的滑条连接 STM32G031G8U6 的 PB0 (ADC_IN),使用 MCU 内置 12 位 ADC,输出范围为 0~4095。程序中的 OPEN_THRESHOLD 和 CLOSE_THRESHOLD 分别表示开、关阈值,取值范围为 0~4095。示例设置为 3967 和 128,并通过 CHAIN_SWITCH_DOWNUP_INC 将滑块从下往上移动的方向设置为 ADC 数值递增。
将以上程序编译并上传至设备,点击 Arduino IDE 右上角的按钮打开串口监视器(Serial Monitor)。可以看到 Chain Switch 的实时 12 位 ADC 数值和开关状态。Chain Switch 处于 ON 状态时板载 RGB LED 显示绿色,处于 OFF 状态时显示红色:
<Chain Switch 串口监视器输出 ADC 数值和开关状态图片>
例程效果如下: