前言
为了能够播报变量,如可实时播报温湿度,电压电流电阻值,参考JQ8900语音模块采用其组合模块播报,现对该功能实现及注意点进行记录。
一、硬件连接部分
- 电压最好为稳定的5v,建议外接供电,不要直接通过单片机电压引脚引出,可能造成喇叭电压供电不足发出滋滋滋的声音
- SPK+、SPK-接喇叭正负极
- 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 位
}
然后将数据帧通过串口发送即可实现语音播报