Skip to content

资源配置 ​

概述 ​

Node-MQ可配置的硬件资源包括:

  • 29 x GPIO引脚
  • 10 x ADC通道(12-bit)
  • 8 x PWM通道(12-bit)
  • 3 x UART控制器
  • 2 x I2C接口(主机)
  • 2 x SPI接口(主机)

ESP32-S3的部分硬件资源保留用于系统功能,不包含在Node-MQ的可配置资源中。例如,全部45个GPIO引脚中,部分用作Strapping(启动配置)引脚,以及连接内部或外部Flash/PSRAM的引脚。详细信息请参考 ESP32-S3引脚说明。

Node-MQ使用统一的config指令管理所有硬件资源,包括资源的配置、释放以及当前配置的查看。

config指令样例:

json
{
  "action": "config",
  "input": [1, 2, 3],
  "output": [4, 5, 6],
  "pwm": [
    {
      "freq_hz": 100,
      "io_num": [7, 8]
    }
  ],
  "uart": [
    {
      "uart_num": 0,
      "post_encoding": "base64"
    }
  ]
}

发送不带参数的config指令,可以查看当前系统配置信息。不带参数的config指令:

json
{
  "action": "config"
}

config指令可以多次执行,逐步配置不同的资源,或释放、修改已配置的资源。Node-MQ采用增量方式配置资源。

Node-MQ收到config指令并完成相应的配置后(如果有),将应答当前系统的完整配置信息(type-config)。

硬件资源序号 ​

config指令的参数通常需要引用对应的硬件资源序号,例如GPIO序号、UART控制器序号等。这些序号定义如下:

  • GPIO序号 - 使用与ESP32-S3数据手册一致的定义,即通常标注在PCB引脚旁的数字。可配置的29个GPIO为:

    json
    [
      1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
      11, 12, 13, 14, 15, 16, 17, 18, 21, 38,
      39, 40, 41, 42, 43, 44, 46, 47, 48
    ]
  • UART控制器序号 - 使用与ESP32-S3数据手册一致的定义,即UART0、UART1、UART2。对应的参数值为:

    json
    [0, 1, 2]
  • I2C接口序号 - 使用与ESP32-S3数据手册一致的定义,即I2C_NUM_0、I2C_NUM_1。对应的参数值为:

    json
    [0, 1]
  • SPI接口序号 - SPI接口的情况有所不同。ESP32-S3共有SPI0~SPI3 4个SPI接口。其中,SPI0和SPI1由系统保留,用于Flash/PSRAM访问。可供用户使用的是SPI2和SPI3。Node-MQ顺序定义了SPI_NUM_0与SPI_NUM_1分别对应数据手册中的SPI2与SPI3。SPI_NUM_0、SPI_NUM_1对应的参数值为:

    json
    [0, 1]

参数说明 ​

config指令的参数覆盖所有可配置的硬件资源,以下将分类说明。

提示

所有指令参数可以任意组合使用(不受分类限制)。

GPIO ​

  • input [array] (?) 设置为输入模式的GPIO序号数组。
  • output [array] (?) 设置为输出模式的GPIO序号数组。
  • pullup [array] (?) 启用内部上拉电阻的GPIO序号数组。
  • pulldown [array] (?) 启用内部下拉电阻的GPIO序号数组。
  • posedge [array] (?) 设置为上升沿触发的GPIO序号数组。
  • negedge [array] (?) 设置为下降沿触发的GPIO序号数组。
  • anyedge [array] (?) 设置为任意边沿触发的GPIO序号数组。
  • GPIO引脚可以同时设置为输入和输出,即同时具备读写功能。例如:
    json
    {
      "action": "config",
      "input": [1, 2],
      "output": [1, 2]
    }
  • GPIO引脚在一次config指令中的 input、output、pullup、pulldown 值会覆盖该引脚之前的对应设置,而其已有的触发设置会保留。
  • ESP32-S3各GPIO引脚的驱动电流为:GPIO17、GPIO18约10 mA;其他引脚约20 mA。
  • ESP32-S3的内部上拉/下拉电阻约为45 kΩ。
  • 当设置为触发(中断)的GPIO满足触发条件时,Node-MQ将发送该GPIO对应的 type-digital 消息到config指令所使用的通道。

样例 ​

json
{
  "action": "config",
  "input": [1],
  "output": [2, 3],
  "pulldown": [1],
  "posedge": [1]
}
  • input - 设置GPIO1引脚为输入模式。
  • output - 设置GPIO2、GPIO3引脚为输出模式。
  • pulldown - 启用GPIO1引脚的内部下拉电阻。
  • posedge - 设置GPIO1引脚为上升沿触发。

ADC ​

  • analog [array] (?) 启用模拟输入功能(ADC)的GPIO序号数组。
  • Node-MQ有10个可配置的ADC通道,对应GPIO1~GPIO10,即 analog 数组元素的取值范围1~10。
  • ADC采样分辨率为12-bit,读数值范围0~4095。
  • monitor [array] (?) 模拟量监视器对象数组。

    模拟量监视器可以实时监视 analog 参数中定义的模拟输入引脚,当输入电平满足监视器设置的触发条件时,Node-MQ将发送对应该引脚的 type-analog 消息到config指令所使用的通道。

    监视器对象的JSON属性定义:

    • io_num [array] (!) 要监视的GPIO序号数组,各引脚必须已经配置为 analog。
    • remove [bool] (?) 为true时,释放并移除 io_num 对应的监视器。默认false。
    • period_ms [int] (?) 引脚电平的采样周期,单位毫秒,调整步长为100 ms。默认值500 ms。
    • grain [int] (?) 采样变化粒度。在无阈值条件的情况下,当采样值的变化量大于或等于该参数时,满足触发条件。默认值为1。
    • high [int] (?) 上限阈值。指定该参数后,当采样值向上越过阈值时,满足触发条件。取值范围0~4095。
    • low [int] (?) 下限阈值。指定该参数后,当采样值向下越过阈值时,满足触发条件。取值范围0~4095。

样例 ​

json
{
  "action": "config",
  "analog": [4, 5, 6],
  "monitor": [
    {
      "io_num": [4],
      "period_ms": 1000,
      "grain": 5
    },
    {
      "io_num": [5, 6],
      "period_ms": 1000,
      "high": 1024
    }
  ]
}
  • analog - 设置GPIO4、GPIO5、GPIO6为模拟输入引脚。
  • monitor - 监视器对象数组:
    • 监视器[0] - 模拟输入引脚:GPIO4;采样周期:1000 ms(1秒);采样变化粒度:5。
    • 监视器[1] - 模拟输入引脚:GPIO5、GPIO6;采样周期:1000 ms(1秒);上限阈值:1024。

PWM ​

  • pwm [array] (?) PWM配置对象数组。

    Node-MQ有8个可配置的PWM通道,可以绑定到任意GPIO引脚。8个通道共用4个产生PWM频率的LEDC定时器。因此,8个通道可以任意分为4组不同频率的PWM输出。所有PWM通道均具有12-bit duty分辨率。

    PWM配置对象按照PWM频率对输出引脚进行分组设置。PWM配置对象的JSON属性定义:

    • freq_hz [int] (?) 该分组的PWM频率,单位赫兹。默认值100 Hz,最大允许值100 kHz。
    • io_num [array] (!) 该分组绑定的输出GPIO序号数组。

    最多允许4组不同频率的PWM配置(4个定时器),所有分组的GPIO数量合计不得超过8个(8个PWM通道)。

样例 ​

json
{
  "action": "config",
  "pwm": [
    {
      "io_num": [7, 8]
    },
    {
      "freq_hz": 1000,
      "io_num": [9]
    }
  ]
}
  • pwm - 不同频率的PWM输出分组:
    • 分组[0] - PWM频率:100 Hz(默认值);输出引脚:GPIO7、GPIO8。
    • 分组[1] - PWM频率:1000 Hz;输出引脚:GPIO9。

重置 ​

  • reset [array] (?) 重置引脚为默认状态的GPIO序号数组。

    配置为GPIO、ADC或PWM功能的引脚,可以通过 reset 取消已配置的功能,并恢复为默认状态。默认状态为不指定输入/输出模式的GPIO,无内部上拉/下拉电阻,无触发。

样例 ​

json
{
  "action": "config",
  "reset": [1, 2, 3, 4, 5, 6, 7, 8, 9]
}
  • reset - 重置GPIO1~GPIO9引脚为默认状态。

UART ​

  • uart [array] (?) UART配置对象数组。

    Node-MQ有3个可配置的UART控制器(控制器序号0~2)。默认TX/RX引脚为:

    UART控制器默认TX引脚默认RX引脚
    UART04344
    UART11718
    UART23940

    UART配置对象的JSON属性定义:

    • uart_num [int] (!) 该配置对象的UART序号。取值范围0~2。
    • remove [bool] (?) 为true时,释放并移除 uart_num 对应的UART控制器。默认false。
    • tx [int] (?) TX引脚的GPIO序号。不指定时使用默认TX引脚。
    • rx [int] (?) RX引脚的GPIO序号。不指定时使用默认RX引脚。
    • baud_rate [int] (?) 传输波特率,默认值115200。
    • data_bits [int] (?) 数据位数,默认值8。取值范围5~8。
    • parity [string] (?) 奇偶校验方式,默认值none。可选值:
      • even - 偶校验
      • odd - 奇校验
      • none - 无校验
    • stop_bits [float] (?) 停止位数量,默认值1。可选值:1、1.5、2。
    • post [bool] (?) 为true时,该UART RX接收的数据将以 type-uart 消息转发到config指令所使用的通道。默认true。
    • post_encoding [string] (?) 当 post 为true时,转发数据所使用的编码格式。默认值json。可选值:
      • json - 对RX接收的数据进行JSON转义,适用于文本数据。
      • base64 - 对RX接收的数据进行Base64编码,适用于二进制数据。
      • hex - 将RX接收的数据转换为Hex文本,适用于二进制数据。
    • action [bool] (?) 为true时,该UART将作为指令通道使用。默认false。
    • 当 action 为true时,该UART的RX接收数据将作为指令解析并执行,同时由TX输出指令执行结果。
    • 当 action 为true时,post 参数无效(接收数据作为指令而非数据)。
    • 当 remove 释放UART控制器后,其占用的TX、RX引脚将恢复为默认GPIO状态。

样例 ​

  1. 启用UART0、UART1:

    json
    {
      "action": "config",
      "uart": [
        {
          "uart_num": 0,
          "post_encoding": "base64"
        },
        {
          "uart_num": 1,
          "action": true
        }
      ]
    }
    • uart - 要启用的UART配置对象数组:
      • 配置[0] - UART序号:0;转发数据编码:base64。
      • 配置[1] - UART序号:1;设置为指令通道:true。
  2. 移除UART1:

    json
    {
      "action": "config",
      "uart": [
        {
          "uart_num": 1,
          "remove": true
        }
      ]
    }

I2C ​

  • i2c [array] (?) I2C接口配置对象数组。

    Node-MQ有2个可配置的I2C接口(I2C接口序号0~1)。

    I2C接口配置对象的JSON属性定义:

    • i2c_num [int] (!) 该配置对象的I2C接口序号。取值范围0~1。
    • remove [bool] (?) 为true时,释放并移除 i2c_num 对应的I2C接口。默认false。
    • sda [int] (!) SDA引脚的GPIO序号。
    • scl [int] (!) SCL引脚的GPIO序号。
    • Node-MQ的I2C接口采用总线与设备分离的配置方式。I2C总线由 i2c 参数配置,仅定义总线相关的引脚信息。与I2C设备相关的地址、速度等信息则由 i2c_device 参数定义。
    • 当 remove 释放I2C接口后,其占用的SDA、SCL引脚将恢复为默认GPIO状态。
  • i2c_device [array] (?) I2C设备配置对象数组。

    I2C设备配置用于定义具体的I2C设备,例如24C02N EEPROM。I2C设备通过I2C接口序号引用已配置的I2C接口(总线),一个I2C总线上可以定义多个I2C设备。

    I2C设备配置对象的JSON属性定义:

    • name [string] (!) 用户定义的设备名。I2C设备操作指令使用该名称访问设备。最大长度15个字符。
    • remove [bool] (?) 为true时,释放并移除 name 对应的I2C设备。默认false。
    • i2c_num [int] (!) 已配置的I2C接口序号。
    • address [int] (!) I2C设备地址(7-bit)。取值范围0~127(十进制)。
    • speed_hz [int] (?) SCL频率,单位赫兹。默认值100000(100 kHz),最大允许值400 kHz。

样例 ​

  1. 启用I2C_NUM_0接口,添加I2C设备(24C02N EEPROM):

    json
    {
      "action": "config",
      "i2c": [
        {
          "i2c_num": 0,
          "sda": 15,
          "scl": 16
        }
      ],
      "i2c_device": [
        {
          "name": "eeprom",
          "i2c_num": 0,
          "address": 80
        }
      ]
    }
    • i2c - 要启用的I2C接口配置对象数组:
      • 配置[0] - I2C接口序号:0;SDA引脚:GPIO15;SCL引脚:GPIO16。
    • i2c_device - 要添加的I2C设备配置对象数组:
      • 配置[0] - I2C设备名:eeprom;I2C接口序号:0;设备地址:80。
  2. 移除I2C设备(eeprom)并移除I2C_NUM_0接口:

    json
    [
      {
        "action": "config",
        "i2c_device": [
          {
            "name": "eeprom",
            "remove": true
          }
        ]
      },
      {
        "action": "config",
        "i2c": [
          {
            "i2c_num": 0,
            "remove": true
          }
        ]
      }
    ]
    • 移除I2C总线之前,需要先移除该总线上的所有设备。
    • 样例使用指令数组形式,以确保先移除I2C设备,再移除I2C总线。

SPI ​

  • spi [array] (?) SPI接口配置对象数组。

    Node-MQ有2个可配置的SPI接口(SPI接口序号0~1)。

    SPI接口配置对象的JSON属性定义:

    • spi_num [int] (!) 该配置对象的SPI接口序号。取值范围0~1。
    • remove [bool] (?) 为true时,释放并移除 spi_num 对应的SPI接口。默认false。
    • mosi [int] (?) MOSI引脚的GPIO序号。
    • miso [int] (?) MISO引脚的GPIO序号。
    • sclk [int] (!) SCLK引脚的GPIO序号。
    • Node-MQ的SPI接口采用总线与设备分离的配置方式。SPI总线由 spi 参数配置,仅定义总线相关的引脚信息。与SPI设备相关的模式、频率、片选、位序等信息则由 spi_device 参数定义。
    • SPI接口的 mosi 与 miso 引脚可根据设备要求选择配置。
    • 当 remove 释放SPI接口后,其占用的MOSI、MISO、SCLK引脚将恢复为默认GPIO状态。
  • spi_device [array] (?) SPI设备配置对象数组。

    SPI设备配置用于定义具体的SPI设备,例如ADXL345数字加速度计。SPI设备通过SPI接口序号引用已配置的SPI接口(总线),一个SPI总线上可以定义多个SPI设备。

    SPI设备配置对象的JSON属性定义:

    • name [string] (!) 用户定义的设备名。SPI设备操作指令使用该名称访问设备。最大长度15个字符。
    • remove [bool] (?) 为true时,释放并移除 name 对应的SPI设备。默认false。
    • spi_num [int] (!) 已配置的SPI接口序号。
    • mode [int] (?) 设备SPI模式。可选值:0、1、2、3。
    • speed_hz [int] SCLK频率,单位赫兹。默认值1000000(1 MHz),最大允许值40 MHz。
    • cs [int] (?) 设备片选引脚的GPIO序号。
    • cs_level [string] (?) 片选信号的有效电平,默认值low。可选值:low、high。
    • bit_order [string] (?) 数据位传输顺序,默认值msb。可选值:
      • msb - 高位在前
      • lsb - 低位在前
    • 当 remove 释放SPI设备后,其占用的CS片选引脚将恢复为默认GPIO状态。

样例 ​

  1. 启用SPI_NUM_0接口,添加SPI设备(ADXL345数字加速度计):

    json
    {
      "action": "config",
      "spi": [
        {
          "spi_num": 0,
          "mosi": 10,
          "miso": 11,
          "sclk": 12
        }
      ],
      "spi_device": [
        {
          "name": "adxl345",
          "spi_num": 0,
          "mode": 3,
          "cs": 13
        }
      ]
    }
    • spi - 要启用的SPI接口配置对象数组:
      • 配置[0] - SPI接口序号:0;MOSI引脚:GPIO10;MISO引脚:GPIO11;SCLK引脚: GPIO12。
    • spi_device - 要添加的SPI设备配置对象数组:
      • 配置[0] - SPI设备名:adxl345;SPI接口序号:0;设备SPI模式:3;设备片选引脚:GPIO13。
  2. 移除SPI设备(adxl345)并移除SPI_NUM_0接口:

    json
    [
      {
        "action": "config",
        "spi_device": [
          {
            "name": "adxl345",
            "remove": true
          }
        ]
      },
      {
        "action": "config",
        "spi": [
          {
            "spi_num": 0,
            "remove": true
          }
        ]
      }
    ]
    • 移除SPI总线之前,需要先移除该总线上的所有设备。
    • 样例使用指令数组形式,以确保先移除SPI设备,再移除SPI总线。

应答 ​

type-config ​

Node-MQ收到config指令并完成相应的配置后(如果有),将应答当前系统的完整配置信息(有效的配置)。

应答JSON对象的type属性值为config,其余属性的定义与config指令的参数定义一致。

样例 ​

json
{
  "type": "config",
  "input": [1],
  "output": [2, 3],
  "pulldown": [1],
  "posedge": [1],
  "analog": [4, 5, 6],
  "pwm": [
    {
      "freq_hz": 100,
      "io_num": [7, 8]
    }
  ],
  "monitor": [
    {
      "io_num": [4],
      "period_ms": 1000,
      "grain": 5,
      "high": 0,
      "low": 0
    }
  ],
  "uart": [
    {
      "uart_num": 0,
      "tx": 43,
      "rx": 44,
      "post": true,
      "post_encoding": "base64",
      "baud_rate": 115200,
      "data_bits": 8,
      "parity": "none",
      "stop_bits": 1
    }
  ]
}

type-digital ​

当设置为触发(中断)的GPIO满足触发条件时,Node-MQ将发送该GPIO对应的type-digital消息到config指令所使用的通道。

样例 ​

json
{
  "type": "digital",
  "data": [
    {
      "io_num": 1,
      "value": 1
    }
  ]
}
  • type - 数据类型 digital(引脚电平数字量)。
  • data - 数据对象数组。
    • io_num - 引脚的GPIO序号。
    • value - 数值:0(低电平);1(高电平)。

type-analog ​

当模拟量监视器的引脚输入电平满足触发条件时,Node-MQ将发送对应该引脚的type-analog消息到config指令所使用的通道。

样例 ​

json
{
  "type": "analog",
  "data": [
    {
      "io_num": 4,
      "raw": 1172,
      "voltage_mv": 982
    }
  ]
}
  • type - 数据类型 analog(引脚电平模拟量)。
  • data - 数据对象数组。
    • io_num - 引脚的GPIO序号。
    • raw - 12-bit ADC原始采样值(0~4095)。
    • voltage_mv - 经过校准转换的mV单位电压值。

type-uart ​

  • 当配置UART控制器的 post 参数为true时(默认值),该UART RX接收的数据将以type-uart消息转发到config指令所使用的通道。转发数据按照配置的 post_encoding 作相应的编码。

样例 ​

json
{
  "type": "uart",
  "uart_num": 0,
  "encoding": "base64",
  "data": "VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy4="
}
  • type - 数据类型 uart(UART RX数据)。
  • uart_num - UART序号。
  • encoding - 数据编码(即config指令中 post_encoding 参数指定的编码)。
  • data - 编码后的RX接收数据(此处为base64编码)。

json编码样例:

json
{
  "type": "uart",
  "uart_num": 0,
  "encoding": "json",
  "data": "The quick brown fox jumps over the lazy dog."
}