版本:v1.1 | 更新日期:2026-03-14 阅读时间:约 12 分钟 适用模组:JX-A7T 混合AI语音模组 素材来源:智能公元技术交流群真实案例(2026-03-13)+ SmartPi 官方文档
在物联网设备开发中, "如何将外部传感器数据显示到小程序" 是一个非常常见的需求。很多开发者使用 JX-A7T 混合语音模组时,会面临这样的问题:
真实用户提问(智能公元16群,2026-03-13): "请问,这个JX-A7T可以通过单片机给这个模块发送温度湿度数据,然后在智能公元小程序里面显示吗?"
答案是肯定的! 本文将系统讲解如何通过 JX-A7T 模组实现 MCU 传感器数据到小程序的完整数据链路。
┌─────────────────────────────────────────────────────────────────┐ │ JX-A7T传感器数据流架构 │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────┐ UART1 ┌──────────────┐ 云端 ┌─────┐│ │ │ MCU │ ───────────→ │ JX-A7T │ ───────────→ │WiFi ││ │ │(传感器) │ 传感器数据 │ (数据转发) │ MQTT/HTTP │云端 ││ │ └─────────┘ └──────────────┘ └─────┘│ │ │ │ │ │ │ DHT11/ 语音部分 云端API │ │ SHT30 暂不处理 │ │ │ 其他传感器 │ │ │ ↓ │ │ ┌──────────┐ │ │ │ 智能公元 │ │ │ │ 小程序 │ │ │ │数据显示 │ │ │ └──────────┘ │ └─────────────────────────────────────────────────────────────────┘
JX-A7T 模组内部集成了两个主要部分:
两者之间可以通过 内部数据通路实现数据转发。MCU 将传感器数据发送给 JX-A7T 的语音串口(UART1),JX-A7T 再通过内部机制将数据传递给 WiFi 部分上传到云端。
⚠️ 重要说明:JX-A7T的语音串口1(PA2/PA3)是唯一可用于与外部MCU通信的串口。语音烧录串口(PB5/PB6)和WiFi烧录串口(UART0_RX2/TX2)仅用于烧录,不可用于数据通信。
JX-A7T 模组共有多个串口,但只有1个可用于MCU通信:
| 串口名称 | 引脚定义 | 用途 | 是否可外接MCU |
|---|---|---|---|
| 语音串口0 | PB5(TX)/PB6(RX) | 烧录语音固件 | ✗ 烧录专用 |
| WiFi串口0 | UART0 RX2/UART0TX2 | 烧录WiFi固件 | ✗ 烧录专用 |
| 语音串口1 | PA2(TX)/PA3(RX) | 自定义通信 | ✓ 推荐使用 |
┌─────────────────────────────────────────────────────────────────┐ │ 硬件连接示意图 │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ MCU (如STM32/ESP32) JX-A7T模组 │ │ │ │ TX ─────────────────────→ PA3 (UART1_RX) │ │ RX ─────────────────────→ PA2 (UART1_TX) │ │ GND ────────────────────→ GND │ │ │ │ [可选] │ │ │ DHT11/SHT30等传感器 语音功能 WiFi部分 │ │ (接MCU的GPIO) (语音识别) (云端通信) │ │ │ └─────────────────────────────────────────────────────────────────┘
| 参数 | 要求 | 说明 |
|---|---|---|
| 逻辑电平 | 3.3V | JX-A7T是3.3V逻辑 |
| 波特率 | 9600/115200 | 根据平台配置决定 |
| 数据位 | 8位 | 标准UART配置 |
| 停止位 | 1位 | 标准UART配置 |
| 校验位 | 无 | 标准UART配置 |
⚠️ 注意事项:如果MCU是5V逻辑(如Arduino UNO),需要使用电平转换模块或电阻分压电路。5V直接连接可能损坏JX-A7T模块。
在智能公元平台上配置串口输入以接收MCU数据:
步骤1:添加串口输入触发
1. 进入产品配置 → 控制配置 2. 点击"添加触发" 3. 选择触发类型:串口输入 4. 选择串口:UART1_RX(语音串口1接收) 5. 设置消息编号(如:01)
步骤2:配置数据格式
1. 选择数据格式类型 - 固定格式:适用于简单场景 - 自定义格式:适用于多参数场景 2. 设置帧头帧尾(默认可使用) - 帧头:AA 55 - 帧尾:55 AA 3. 配置输入参数(可选) - 参数名:如 "temperature" 或 "humidity" - 类型:选择 char/int/float - 测试值:用于生成测试消息
步骤3:生成固件
1. 保存配置 2. 点击生成固件 3. 下载并烧录到JX-A7T
将串口输入的数据绑定到变量,以便在小程序中显示:
1. 在串口输入触发中添加动作 2. 选择"修改变量"动作 3. 选择或创建变量: - 变量名:sensor_temperature - 数据类型:与串口输入参数一致 - 绑定参数:选择对应的输入参数
在小程序开发端配置数据显示控件:
1. 进入小程序页面编辑
2. 添加"文本显示"控件
3. 设置控件数据源:
- 选择变量:sensor_temperature
- 设置显示格式:"温度:{value}°C"
4. 如有多个传感器,添加更多控件
5. 保存并发布小程序
根据官方文档,串口数据格式需要注意以下几点:
| 项目 | 说明 |
|---|---|
| 配置界面显示 | 使用空格分隔(如
AA 55 01 55 AA)便于阅读 |
| 实际发送数据 | 连续的16进制字节,不含空格(
0xAA 0x55 0x01 0x55 0xAA) |
| 帧头帧尾 | 默认
AA 55 /
55 AA,可自定义 |
| 帧尾可省略 | 如使用校验和,帧尾字段可留空 |
多参数数据帧示例(温度+湿度):
AA 55 # 帧头 01 # 消息ID [温度数据 - 4字节float] [湿度数据 - 4字节float] 55 AA # 帧尾
#include "dht11.h"
#include "usart.h"
// 数据帧结构定义
#define FRAME_HEAD 0xAA55
#define FRAME_TAIL 0x55AA
#define MSG_ID_SENSOR 0x01
typedef struct {
uint16_t head; // 帧头
uint8_t msg_id; // 消息ID
float temperature; // 温度
float humidity; // 湿度
uint16_t tail; // 帧尾
} SensorData_t;
// 读取传感器并发送到JX-A7T
void send_sensor_data_to_jxa7t(void)
{
SensorData_t data;
uint8_t *bytes = (uint8_t*)&data;
// 读取DHT11传感器
DHT11_Data_t dht11;
if (DHT11_Read(&dht11) == DHT11_OK) {
// 转换为浮点数
data.temperature = (float)dht11.temperature;
data.humidity = (float)dht11.humidity;
} else {
// 读取失败,使用上次值或默认值
return;
}
// 组装数据帧
data.head = FRAME_HEAD;
data.msg_id = MSG_ID_SENSOR;
data.tail = FRAME_TAIL;
// 通过串口1发送到JX-A7T
HAL_UART_Transmit(&huart1, bytes, sizeof(SensorData_t), 100);
}
// 定时发送(例如每2秒)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim == &htim2) { // 假设定时器2每2秒触发
send_sensor_data_to_jxa7t();
}
}
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
// 帧头帧尾定义
const uint16_t FRAME_HEAD = 0xAA55;
const uint16_t FRAME_TAIL = 0x55AA;
const uint8_t MSG_ID = 0x01;
void setup() {
Serial.begin(9600); // 连接到JX-A7T的PA2/PA3
dht.begin();
}
void loop() {
delay(2000); // 每2秒读取一次
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// 检查读取是否成功
if (isnan(humidity) || isnan(temperature)) {
return;
}
// 组装数据帧(大端序)
uint8_t buffer[13];
// 帧头(大端序)
buffer[0] = (FRAME_HEAD >> 8) & 0xFF;
buffer[1] = FRAME_HEAD & 0xFF;
// 消息ID
buffer[2] = MSG_ID;
// 温度数据(假设平台配置为32位浮点)
memcpy(&buffer[3], &temperature, sizeof(float));
// 湿度数据
memcpy(&buffer[7], &humidity, sizeof(float));
// 帧尾(大端序)
buffer[11] = (FRAME_TAIL >> 8) & 0xFF;
buffer[12] = FRAME_TAIL & 0xFF;
// 发送到JX-A7T
Serial.write(buffer, 13);
}
#include "driver/uart.h"
#include "dht.h"
#define UART_NUM UART_NUM_1
#define TX_PIN 17
#define RX_PIN 16
#define DHT_PIN 4
void send_sensor_data_task(void *pvParameters)
{
uart_config_t uart_config = {
.baud_rate = 9600,
.data_bits = UART_DATA_8_BITS,
.parity = UART_PARITY_DISABLE,
.stop_bits = UART_STOP_BITS_1,
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
};
uart_param_config(UART_NUM, &uart_config);
uart_set_pin(UART_NUM, TX_PIN, RX_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
while (1) {
// 读取DHT11
float temp = read_dht_temperature();
float humi = read_dht_humidity();
// 组装数据帧
uint8_t data[13];
data[0] = 0xAA; // 帧头
data[1] = 0x55;
data[2] = 0x01; // 消息ID
memcpy(&data[3], &temp, sizeof(float)); // 温度
memcpy(&data[7], &humi, sizeof(float)); // 湿度
data[11] = 0x55; // 帧尾
data[12] = 0xAA;
// 发送到JX-A7T
uart_write_bytes(UART_NUM, (const char*)data, 13);
vTaskDelay(pdMS_TO_TICKS(2000)); // 2秒间隔
}
}
┌─────────────────────────────────────────────────────────────────┐ │ 数据帧格式定义 │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ ┌──────┐ ┌──────┐ ┌────────────────┐ ┌────────────────┐ ┌──────┐│ │ │ 帧头 │ │消息ID│ │ 数据字段 │ │ 数据字段 │ │ 帧尾 ││ │ │2Byte │ │1Byte │ │ N Byte │ │ M Byte │ │2Byte ││ │ └──────┘ └──────┘ └────────────────┘ └────────────────┘ └──────┘│ │ │ │ 帧头:0xAA 55(固定,可自定义) │ │ 消息ID:区分不同消息类型 │ │ 帧尾:0x55 AA(固定,可自定义或省略) │ │ 数据字段:根据实际传感器数量和类型定义 │ │ │ └─────────────────────────────────────────────────────────────────┘
| 传感器 | 数据类型 | 字节数 | 示例值 |
|---|---|---|---|
| DHT11温湿度 | uint8_t | 1+1 | 温度25°C,湿度60% |
| SHT30 | float | 4+4 | 温度25.3°C,湿度60.5% |
| 光照强度(BH1750) | uint16_t | 2 | 0-65535 lux |
| PM2.5(GP2Y10) | uint16_t | 2 | 0-500 μg/m³ |
| 二氧化碳(SGP30) | uint16_t | 2 | 400-5000 ppm |
假设需要上传:温度、湿度、光照、PM2.5 ┌──────┬──────┬──────┬──────┬──────┬──────┐ │ 帧头 │ 消息ID│ 温度 │ 湿度 │ 光照 │ 帧尾 │ │2Byte │1Byte │4Byte │4Byte │2Byte │2Byte │ └──────┴──────┴──────┴──────┴──────┴──────┘ 总计:15字节 示例数据: AA 55 # 帧头 01 # 消息ID 41 CD 00 00 # 温度 25.3°C (float) 42 71 00 00 # 湿度 60.5% (float) 10 E2 # 光照 4334 lux 55 AA # 帧尾
验证步骤: 1. 使用万用表测试 - 确认TX连接到RX(MCU TX → JX-A7T PA3) - 确认RX连接到TX(MCU RX → JX-A7T PA2) - 确认GND连通 2. 使用USB转TTL模块测试 - 将TX/RX短接,回环测试 - 确认MCU串口发送正常 3. 电平测试 - 确认JX-A7T侧为3.3V逻辑 - 如MCU是5V,确认电平转换正常
方法一:串口监控
1. 在MCU TX和JX-A7T RX之间并联USB转TTL 2. 使用串口助手监控发送的数据 3. 确认数据格式与配置一致
方法二:日志输出
1. 在MCU代码中添加日志输出 2. 打印发送的原始数据(十六进制) 3. 与平台配置的协议对比
方法三:小程序验证
1. 配置小程序显示变量 2. 观察变量值是否更新 3. 检查更新频率是否正确
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 小程序显示0 | 数据格式不匹配 | 检查大小端、浮点格式 |
| 小程序不更新 | 数据未上传 | 检查串口连接、网络状态 |
| 数据乱码 | 波特率不匹配 | 确认MCU和JX-A7T波特率一致 |
| 数据跳变 | 干扰或采样问题 | 添加滤波、检查传感器连接 |
| 串口无数据 | 接线错误 | 确认PA2/PA3接线正确 |
┌─────────────────────────────────────────────────────────────────┐ │ 多传感器融合系统 │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │ │ │DHT11 │ │SHT30 │ │BH1750│ │GP2Y10│ │SGP30 │ │ │ │温湿度 │ │温湿度 │ │光照 │ │粉尘 │ │空气质量│ │ │ └──┬───┘ └──┬───┘ └──┬───┘ └──┬───┘ └──┬───┘ │ │ │ │ │ │ │ │ │ └─────────┴─────────┴─────────┴─────────┘ │ │ │ │ │ ┌──────▼──────┐ │ │ │ MCU │ │ │ │ (数据融合) │ │ │ └──────┬──────┘ │ │ │ UART1 │ │ ┌──────▼──────┐ │ │ │ JX-A7T │ │ │ │ (数据转发) │ │ │ └──────┬──────┘ │ │ │ │ │ ┌──────▼──────┐ │ │ │ 智能公元App │ │ │ │ 多参数显示 │ │ │ └─────────────┘ │ └─────────────────────────────────────────────────────────────────┘
场景:传感器数据同时在本地语音播报和远程小程序显示
实现方案:
1. MCU通过串口发送数据给JX-A7T 2. JX-A7T同时执行两个动作: a. 语音播报:"当前温度25度,湿度60%" b. 通过WiFi上传到小程序
平台配置:
场景:温度超过阈值时触发告警
实现方案:
1. 在平台配置阈值检测 2. 当串口输入的数据超过阈值时: - 本地语音告警 - 小程序推送通知 - 可选:触发继电器控制设备
平台配置示例:
- 变量:temperature - 阈值:> 30°C - 触发动作: * TTS:"温度过高警告" * 小程序通知 * GPIO输出:打开风扇
| 需求场景 | 推荐方案 | 优势 |
|---|---|---|
| 简单温湿度显示 | JX-A7T + MCU | 成本低,配置简单 |
| 多传感器监测 | JX-A7T + MCU | 灵活扩展 |
| 本地语音+远程显示 | JX-A7T(双功能) | 一体化方案 |
| 高频率数据上报 | 考虑专用WiFi模块 | 避免影响语音功能 |
更新日期:2026-03-14 素材来源:智能公元16群真实提问(2026-03-13) + SmartPi官方文档(faq-hardware-design-jx-a7t.md, uart-input-parameter.md, faq-burning-and-debug-jx-a7t.md) 适用产品:JX-A7T 混合AI语音模组
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70049243/viewspace-3177069/ ,如需转载,请注明出处,否则将追究法律责任。