基于ASRPRO语音识别与STM32的实时温湿度播报系统设计与实现

1次阅读
没有评论

共计 1919 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

背景痛点

在传统的温湿度监测系统中,我们通常采用 LCD 显示屏或蓝牙传输方案,但这些方式在实际应用中存在明显不足:

基于 ASRPRO 语音识别与 STM32 的实时温湿度播报系统设计与实现

  • LCD 屏在光线昏暗环境下可视性差,尤其对老年用户不友好
  • 蓝牙方案虽然无线连接方便,但功耗较高,不适合电池供电场景
  • 两种方案都无法实现 ” 无接触 ” 交互,在疫情等特殊时期存在卫生隐患

技术选型

经过市场调研,我们对比了几款主流语音模块:

  1. 科大讯飞模块
  2. 优势:识别准确率高(98%+),支持方言
  3. 劣势:单价高(200 元 +),API 较复杂

  4. ASRPRO 模块

  5. 优势:成本低(40 元内),响应快(<200ms),提供图形化配置工具
  6. 劣势:仅支持普通话,需要自行训练唤醒词

考虑到项目预算和开发周期,最终选择了 ASRPRO 作为语音交互方案。

硬件设计

系统框图

[STM32F103C8T6] --UART2--> [ASRPRO]
    |
    |--I2C--> [DHT22]

关键连接细节

  1. 电平转换
  2. ASRPRO 工作电压 5V,STM32 为 3.3V
  3. 使用 TXS0108E 电平转换芯片,连接示意图:

    ASRPRO_TX -- 100Ω 电阻 -- TXS0108E_A1
    TXS0108E_B1 -- STM32_UART2_RX

  4. DHT22 优化配置

  5. 硬件上拉电阻 4.7KΩ
  6. 软件设置采样间隔 2 秒(平衡响应速度与数据稳定性)

核心代码实现

UART 中断处理(STM32 端)

// 环形缓冲区定义
#define BUF_SIZE 128
typedef struct {uint8_t data[BUF_SIZE];
    uint16_t head;
    uint16_t tail;
} RingBuffer;

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {if(huart->Instance == USART2) {
        // 存入环形缓冲区
        buf.data[buf.head] = rx_byte;
        buf.head = (buf.head + 1) % BUF_SIZE;
        // 触发语音处理任务
        osSignalSet(voiceTaskHandle, 0x01);
    }
}

语音队列管理

void VoicePlayTask(void const *argument) {while(1) {
        // 等待信号量
        osSignalWait(0x01, osWaitForever);

        // 临界区保护
        taskENTER_CRITICAL();
        if(buf.head != buf.tail) {uint8_t cmd = buf.data[buf.tail];
            buf.tail = (buf.tail + 1) % BUF_SIZE;
            ASRPRO_SendCmd(cmd); // 封装好的发送函数
        }
        taskEXIT_CRITICAL();}
}

性能优化

波特率测试数据

波特率 (bps) 平均延迟 (ms)
9600 210
19200 180
38400 150
115200 120

建议使用 38400bps 平衡稳定性和速度

误唤醒滤波算法

// 连续 5 次检测到唤醒词才真正触发
#define WAKEUP_THRESHOLD 5

static uint8_t wakeup_count = 0;

void ProcessWakeupSignal(void) {if(ASR_GetWakeupFlag()) {
        wakeup_count++;
        if(wakeup_count >= WAKEUP_THRESHOLD) {PlayTemperature(); // 播放温湿度
            wakeup_count = 0;
        }
    } else {wakeup_count = 0;}
}

避坑指南

  1. 电平不匹配问题
  2. 现象:ASRPRO 发送数据 STM32 无法接收
  3. 解决:除了电平转换芯片,也可使用电阻分压电路:

    5V_TX -- 1KΩ -- STM32_RX
               |
             2KΩ
               |
              GND

  4. 高温环境稳定性

  5. 在 ASRPRO 模块背面加装散热片
  6. 外壳设计通风孔,实测可使工作温度降低 8 -10℃

扩展思考

要实现多节点数据汇总,可增加 NRF24L01 无线模块:

  1. 硬件改动:
  2. STM32 SPI1 接口连接 NRF24L01
  3. 修改天线匹配电路为 50Ω 阻抗

  4. 软件方案:

    void NRF_ReceiveCallback(void) {if(CheckCRC()) {
            // 将接收到的温湿度数据加入语音队列
            VoiceQueue_Push(received_data);
        }
    }

项目资源

完整工程代码已托管至 GitHub:
github.com/example/asrpro-stm32-demo

包含:
– Keil MDK 工程文件
– ASRPRO 语音模型配置文件
– 3D 打印外壳设计图

通过这个项目,我们实现了成本控制在 100 元内、响应速度 <200ms 的语音交互方案。特别在养老院等场景测试时,老年用户对语音播报方式接受度很高。未来可以考虑增加离线语音命令识别等功能进一步扩展应用场景。

正文完
 0
评论(没有评论)