简体中文
English
简体中文
日本語

Arduino 上手教程

2. 设备开发 & 案例程序

5. 扩展模块

6. 应用案例

Chain Switch 使用教程

1.准备工作

  • 环境配置:参考 Arduino IDE 上手教程 完成 IDE 安装,并根据实际使用的开发板安装对应的板管理与需要的驱动库。
  • 使用到的驱动库:

2.示例程序

编译要求
M5Stack 板管理版本 >= 3.2.4
M5Chain 库版本 >= 1.0.8
cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
#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 指向外侧,如图:

IO 引脚配置
RXD_PIN = GPIO_NUM_5(GPIO5)
TXD_PIN = GPIO_NUM_6(GPIO6)

本案例使用 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 数值和开关状态图片>

例程效果如下:

3.参考链接

Page Tools
PDF
On This Page