


#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;
int16_t encoder_value;
int16_t encoder_incre;
uint8_t button_status;
chain_button_press_type_t button_press_type;
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("===========================");
Serial.println("M5Stack Chain Encoder 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);
if (device_list->devices[0].device_type == CHAIN_ENCODER_TYPE_CODE) {
Serial.println("ID[1] is Chain Encoder\n");
delay(1000);
} else {
Serial.println("ID[1] is NOT Chain Encoder\n");
return;
}
// Device ID, double click interval (100MS/200MS/.../900MS/1000MS), long press interval (3S/4S/.../9S/10S), operation status pointer
M5Chain.setEncoderButtonTriggerInterval(1, BUTTON_DOUBLE_CLICK_TIME_500MS, BUTTON_LONG_PRESS_TIME_5S, &opr_status);
Serial.println("Set double and long press intervals");
// Device ID, increment direction (AB = clockwise, BA = counterclockwise), operation status pointer
M5Chain.setEncoderABDirect(1, ENCODER_AB, &opr_status);
Serial.println("Set increment direction\n");
delay(1000);
}
void loop() {
M5Chain.getEncoderValue(1, &encoder_value); // Device ID
Serial.print("encoder_value:");
Serial.println(encoder_value);
M5Chain.getEncoderIncValue(1, &encoder_incre); // Device ID
Serial.print("encoder_incre:");
Serial.println(encoder_incre);
M5Chain.getEncoderButtonStatus(1, &button_status); // Device ID
Serial.print("button_status:");
Serial.println(button_status);
while (M5Chain.getEncoderButtonPressStatus(1, &button_press_type)) { // Device ID
switch (button_press_type) {
case CHAIN_BUTTON_PRESS_SINGLE:
Serial.println("Single pressed");
M5Chain.resetEncoderValue(1, &opr_status); // Device ID
break;
case CHAIN_BUTTON_PRESS_DOUBLE:
Serial.println("Double pressed");
break;
case CHAIN_BUTTON_PRESS_LONG:
Serial.println("Long pressed");
break;
}
}
}用 Chain Bridge 连接器连接主控 Chain DualKey 和 Chain Encoder。连接时需要注意方向,三角箭头从主控 Chain DualKey 指向外侧,如图:
将以上程序编译并上传至设备,点击 Arduino IDE 右上角的按钮打开串口监视器(Serial Monitor)和串口绘图器(Serial Plotter)。转动 Chain Encoder 的旋钮,可以看到以下信息:
encoder_value:旋钮当前值;encoder_incre:旋钮本次变化值;button_status:旋钮是否被按下;encoder_value 重置为 0;