提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
使用SU-03T,通过串口输入播放数字。
提示:以下是本篇文章正文内容,下面案例可供参考
一、网页端设置
第一步:先配置串口IO
第二步:配置触发方式串口输入 第三步:配置串口输入的参数,第一个参数选择int,可以最大播报0xFFFFFFFF,L1、L2、L3、L4,分别是小数部分。一般播报取四位小数足够日常使用。 第四步:点击添加控制,完成串口播放语音的配置。
二、使用
按照以上配置之后,对应要输入的数组格式为: unsigned char VoiceCmd[13] = {0xAA, 0x55, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xAA}; 通过观察可以得到 该数组的 VoiceCmd[2] 为消息编号位,即是控制语音模块播放哪条语音指令的控制为 VoiceCmd[3],VoiceCmd[4],VoiceCmd[5],VoiceCmd[6],H1这个参数的位置,即我所定义的整数位。 VoiceCmd[7],VoiceCmd[8],VoiceCmd[9],VoiceCmd[10],对应的是 L1、L2、L3、L4,即我定义的小数位。 例如想播报 用电量为230.4523千万时,H1位串口传入的高位 H1 = 230,L1 = 4,L2 = 5,L3 = 2,L4 = 3,截图上的消息号是7,即VoiceCmd[2] = 0x07,把这些十进制转十六进制,发送VoiceCmd[13] = {0xAA, 0x55, 0x07, 0xE6, 0x00, 0x00, 0x00, 0x04, 0x05, 0x02, 0x03, 0x55, 0xAA}; 发送这个数组即可播报“用电量为230.4523千万时”;
敲代码
本文提供Arduino 开发环境代码,其他单片机只需改串口配置即可
#include <SoftwareSerial.h>
SoftwareSerial mySerial(11, 12);
void VoicePlay(uint8_t Cmd, float data, uint8_t DecimalDigits)
{
unsigned char VoiceCmd[13] = {0xAA, 0x55, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xAA};
uint16_t temp = 0;
VoiceCmd[2] = Cmd;
if (DecimalDigits == 0)
{
temp = (uint16_t)data;
VoiceCmd[3] = temp & 0xFF;
VoiceCmd[4] = temp >> 8;
}
else if (DecimalDigits == 1)
{
temp = (uint16_t)(data * 10);
VoiceCmd[3] = (temp / 10) & 0xFF;
VoiceCmd[4] = (temp / 10) >> 8;
VoiceCmd[7] = temp / 10 % 10;
}
else if (DecimalDigits == 2)
{
temp = (uint16_t)(data * 100);
VoiceCmd[3] = (temp / 100) & 0xFF;
VoiceCmd[4] = (temp / 100) >> 8;
VoiceCmd[7] = temp / 10 % 10;
VoiceCmd[8] = temp % 10;
}
else if (DecimalDigits == 3)
{
temp = (uint16_t)(data * 1000);
VoiceCmd[3] = (temp / 1000) & 0xFF;
VoiceCmd[4] = (temp / 1000) >> 8;
VoiceCmd[7] = temp / 100 % 10;
VoiceCmd[8] = temp / 10 % 10;
VoiceCmd[9] = temp % 10;
}
else if (DecimalDigits == 4)
{
temp = (uint16_t)(data * 10000);
VoiceCmd[3] = (temp / 10000) & 0xFF;
VoiceCmd[4] = (temp / 10000) >> 8;
VoiceCmd[7] = temp / 1000 % 10;
VoiceCmd[8] = temp / 100 % 10;
VoiceCmd[9] = temp / 10 % 10;
VoiceCmd[10] = temp % 10;
}
mySerial.write(VoiceCmd, sizeof(VoiceCmd));
}
void setup()
{
mySerial.begin(9600);
}
void loop()
{
VoicePlay(0x07, 230.4523,4);
delay(5000);
}
要注意的是这个语音内容部分,如果在实际使用中你不需要播放小数点后四位这么多,在文本说明的(第四步)可以不添加这么多的串口参数,但是我个人建议在本文说明的(第三步)你还是添加1个int和4个unsigned char类型的数据,这么做的目的是当有多条串口输入数据需要播报的时候,统一串口输入的数组,简化编程。 例如,你要播报整数,本文的(第三步)配置不变,本文的(第四步)操作可改为下图所示,改该VoicePlay第三个参数为0。即可播报“用电量230千瓦时”的语音。
VoicePlay(0x07, 230.4523,0);
需要播放一位小数,本文的(第三步)配置不变,本文的(第四步),在添加H1串口参数之后,在添加L1,作为小数位,如下图所示。 改该VoicePlay第三个参数为1。
VoicePlay(0x07, 230.4523,1);
|