基于stm32的JQ8900组合播报

 前言

  为了能够播报变量,如可实时播报温湿度,电压电流电阻值,参考JQ8900语音模块采用其组合模块播报,现对该功能实现及注意点进行记录。

一、硬件连接部分

  1. 电压最好为稳定的5v,建议外接供电,不要直接通过单片机电压引脚引出,可能造成喇叭电压供电不足发出滋滋滋的声音
  2. SPK+、SPK-接喇叭正负极
  3. RX、TX接单片机串口

二、JQ8900存放音频

  通过Micro线连接电脑和JQ8900,电脑会出现一个可移动磁盘,由于我们是组合模式播报,所以需要将生成的音频放到以ZH命名的文件夹里,注意生成的音频以wav或mp3格式,命名方式以两位的英文或数字形式,注意个位数的数字应为两个字节,即如00mp3,01mp3....  

(提醒:将音频移到U盘后需要拔掉Micro线再去使用串口调试上位机,否则会使JQ8900无法接收到串口发送的数据)

文字转语音软件

JQ8900串口上位机

芯片通信采用全双工串口通信;

波特率为 9600,数据位:8 ,停止位 1 位,检验位 N

三、JQ8900通信格式

其中需要注意的就是数据长度和和校验的计算,以及数据的发送形式

1.数据长度

JQ8900输出模式为十六进制。其中长度为曲目字节之和,一个曲目占两个字节,如“01”对应的是0x30,0x31两个字节,“dz”对应的是0x64, 0x7A

这里如果我想播报1049,则

1  >>01 >>0x30,0x31

0  >>00 >>0x30,0x30

4  >>04 >>0x30,0x34

9  >>09 >>0x30,0x39

需要在拆分后的每个单独数值前面加上 '0'

   // 4. 数值部分(拆分每个数字为 2 字节)

    char num_str[6];  // 存储字符串(最大 5 位数值)

    snprintf(num_str, sizeof(num_str), "%d", value);  // 将数值转换为字符串

    // 每个数字转换为 2 字节,0x30 是 '0',后面是数字字符

    for (int i = 0; num_str[i] != '\0'; i++) {

        frame[index++] = 0x30;  // '0'

        frame[index++] = num_str[i];  // 数字字符(例如 '1', '0', '2' 等)

    }

2.数据发送形式

因此计算数据长度(所占字节)为

    // 计算数值部分的字节数,每个数字占 2 字节

    int num_digits = 0;

    int temp_value = value;

    while (temp_value > 0) {

        temp_value /= 10;

        num_digits++;

}

其中num_digits(1049的长度为4)为数值长度,num_digits*2数据长度( 0x30, 0x31, 0x30, 0x30, 0x30, 0x34, 0x30, 0x39的字节数为8)

3.计算校验和

和校验为之前所有字节之和的低 8 ,即起始码到数据相加后取低 8

// 校验和计算函数

uint8_t calculateChecksum(uint8_t *frame, uint8_t length) {

    uint8_t checksum = 0;

    for (int i = 0; i < length; i++) {

        checksum += frame[i];  // 累加每个字节

    }

    return checksum & 0xFF;  // 取低 8 位

}

然后将数据帧通过串口发送即可实现语音播报

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值