SU-03T,通过串口输入播放数字,可以使用单片机读取传感器数据并播报

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

使用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 开发环境代码,其他单片机只需改串口配置即可
接线

/*
接线
arduino    SU03T
5V----------5V
GND---------GND
11----------TX
12----------RX
*/
#include <SoftwareSerial.h>

SoftwareSerial mySerial(11, 12);


/*
  语音播报函数
  Cmd 是控制语音模块念哪一条指令
  data: 要念的数字
  DecimalDigits: 小数位(最大支持小数点后四位)
*/
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};

  uint32_t temp = 0;
  VoiceCmd[2] = Cmd;
  if (DecimalDigits == 0) //整数
  {
    temp = (uint32_t)data;
    VoiceCmd[3] = temp & 0xFF;
    VoiceCmd[4] = temp >> 8;
  }
  else if (DecimalDigits == 1) //一位小数
  {
    temp = (uint32_t)(data * 10);
    VoiceCmd[3] = (temp / 10) & 0xFF;
    VoiceCmd[4] = (temp / 10) >> 8;

    VoiceCmd[7] = temp / 10 % 10;
  }
  else if (DecimalDigits == 2) //两位小数
  {
    temp = (uint32_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 = (uint32_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 = (uint32_t)(data * 10000);
    VoiceCmd[3] = (temp / 10000) & 0xFF;
    VoiceCmd[4] = (temp / 10000) >> 8;
    //小数位
    VoiceCmd[7] = temp / 1000 % 10;//2304523
    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(0x04, 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);

在这里插入图片描述

  • 13
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值