【ChipIntelli 系列】客户查询数值类的播报编程 & 相关工具

有一些应用中,客户可能查询数值,比如温度、湿度、日期、天气等等,那么如何进行播报呢?
 
以下是天问魔改的ChipIntelli SDK的播报数值的相关代码,可供借鉴。
/*************************************************************************
 * 描述: 播报数值文本.
 * 参数: d:需要播报的数值.
 * 返回: none.
*************************************************************************/
void play_num(String s)
{
    uint8_t i = 0;
    uint8_t len = s.length(); //字符串长度
    for(i=0;i<len;i++)
    {
        if((s[i]>='0')&&(s[i]<='9')){
            s[i] = s[i]-'0';
        }else{
            return;
        }
    }
    for(i=0;i<len;i++)
    {
        while (prompt_play_by_cmd_id(12 + s[i], -1, NULL, false))
        {    
            delay(1);
        }  
    }


}


/*************************************************************************
 * 描述: 播报数值.
 * 参数: d:需要播报的数值; mode:1,以数值模式播报,0以号码模式播报.
 * 返回: none.
*************************************************************************/
void play_num(int64_t d, uint8_t mode)
{
    uint8_t i,index = 0;
    volatile uint8_t arr[12],id[28];
    uint8_t temp_f;
    if( d < 0 ){
        d = -d;
        id[index++] = 15;
    }
    temp_f = d % 100; //小数部分
    d = d / 100;
    arr[0] = d / 100000000000 % 10;
    arr[1] = d / 10000000000 % 10;
    arr[2] = d / 1000000000 % 10;
    arr[3] = d / 100000000 % 10;
    arr[4] = d / 10000000 % 10;
    arr[5] = d / 1000000 % 10;
    arr[6] = d / 100000 % 10;
    arr[7] = d / 10000 % 10;
    arr[8] = d / 1000 % 10;
    arr[9] = d / 100 % 10;
    arr[10] = d / 10 % 10;
    arr[11] = d / 1 % 10;
    if(mode){
        if(d >= 100000000)  //1亿
        {
            if(arr[0] > 0){  //千亿位
                id[index++] = arr[0];
                id[index++] = 12;
            }
            if(arr[1] > 0){  //百亿位
                id[index++] = arr[1];
                id[index++] = 11;
            }else if((arr[1] == 0)&&(arr[2] != 0)&&((d / 100000000 % 10000) > 1000)){
                id[index++] = arr[4];
            }
            if(arr[2] > 0){    //十亿位
                id[index++] = arr[2];
                id[index++] = 10;    
            }else if((arr[2] == 0)&&(arr[3] != 0)&&((d / 100000000 % 10000) > 100)){
                id[index++] = arr[2];
            }
            if(arr[3] > 0){    //亿位
                id[index++] = arr[3];
            }else if((d / 100000000 % 10000) == 0){
                id[index++] = 0;
            }
            id[index++] = 14;
        }
        if(d >= 10000)  //1万
        {
            if((d / 10000 % 10000) != 0){   //中间4位不为0
                if((arr[4] == 0) && (d >= 100000000)){     //千万位为0且有亿位则需要播报
                    id[index++] = 0;
                }
                if(arr[4] > 0){  //千万位
                    id[index++] = arr[4];
                    id[index++] = 12;
                }
                if(arr[5] > 0){  //百万位
                    id[index++] = arr[5];
                    id[index++] = 11;
                }else if((arr[5] == 0)&&(arr[6] != 0)&&((d / 10000 % 10000) > 1000)){
                    id[index++] = arr[5];
                }
                if(arr[6] > 0){   //十万位
                    id[index++] = arr[6];
                    id[index++] = 10;    
                }else if((arr[6] == 0)&&(arr[7] != 0)&&((d / 10000 % 10000) > 100)){
                    id[index++] = arr[6];
                }
                if(arr[7] > 0){   //万位
                    id[index++] = arr[7];
                }else if((d / 10000 % 1000) == 0){
                    id[index++] = 0;
                }
                id[index++] = 13;  //万
            }
        }
        if((d % 10000) != 0){   //最低4位不为0
            if((arr[8] == 0)&&(d >= 10000)){   //千位为0且有万位则需要播报
                id[index++] = 0;
            }
            if(arr[8] > 0){  //千位
                id[index++] = arr[8];
                id[index++] = 12;
            }
            if(arr[9] > 0){  //百位
                id[index++] = arr[9];
                id[index++] = 11;
            }else if((arr[9] == 0)&&(arr[10] != 0)&&((d / 1 % 10000) > 1000)){
                id[index++] = arr[9];
            }
            if(arr[10] > 0){   //十位
                id[index++] = arr[10];
                id[index++] = 10;    
            }else if((arr[10] == 0)&&(arr[11] != 0)&&((d / 1 % 10000) > 100)){
                id[index++] = arr[10];
            }
            if(arr[11] > 0){   //个位
                id[index++] = arr[11];
            }
        }
        if(d == 0){
            id[index++] = 0;
        }


        if(temp_f == 0){
            //读取完毕
        }else if(temp_f < 10){
            id[index++] = 16;
            id[index++] = 0;
            id[index++] = temp_f%10;
        }else if(temp_f >= 10){
            id[index++] = 16;
            id[index++] = temp_f/10%10;
            id[index++] = temp_f/1%10;
        }
    }else{
        for(i=0; i < 12;i++){
            if(arr[i] != 0){
                break;
            }
        }
        if(i == 12){
            id[index++] = 0;
        }else{
            for(;i<12;i++){
                id[index++] = arr[i];
            }
        }
        if(temp_f == 0){
            //读取完毕
        }else if(temp_f < 10){
            id[index++] = 16;
            id[index++] = 0;
            id[index++] = temp_f%10;
        }else if(temp_f >= 10){
            id[index++] = 16;
            id[index++] = temp_f/10%10;
            id[index++] = temp_f/1%10;
        }
    }
    for(i=0;i<index;i++){
        while (prompt_play_by_cmd_id(12 + id[i], -1, NULL, false))
        {    
            delay(1);
        }  
    }
}

以下是播报温湿度的相关代码:


//========================================================================
// 描述: 播报温湿度.
// 参数: temp:温度(为255则跳过温度播报); humidity:湿度(为255则跳过湿度播报).
// 返回: none.
//========================================================================
void luxiaoban_speech(float temp, uint8_t humidity)
{
    int temp_int, humidity_int;
    int index;
    int i,arr[4],id[15];
    index = 0;
    
    for(i=0;i<4;i++){
        arr[i] = 0;
    }

    if(temp < 255)
    {
        if(temp >= 0)    
        {
            temp_int = 10 * temp; //将温度值放大10倍
            id[index++] = 25; //播报“当前温度为”
        }else{
            temp_int = -10 * temp; //将温度值放大10倍,并转为正数
            id[index++] = 28; //播报“当前温度为零下”
        }

        for(i =  0; temp_int !=0; i++)
        {
            arr[i] = temp_int%10;
            temp_int /= 10;
        }
        
        if(i == 4)
        {
            id[index++] = arr[3]; //百位数
            id[index++] = 11; //百
            if(arr[2] > 0){
                id[index++] = arr[2]; //十位数
                id[index++] = 10; //十
            }else{
                id[index++] = 27; //零
            }
            if(arr[1] > 0){
                id[index++] = arr[1]; //个位数
            }
            if(arr[0] > 0){
                id[index++] = 24; //点
                id[index++] = arr[0]; //第一位小数
            }
        }else if(i == 3)
        {
            id[index++] = arr[2]; //十位数
            id[index++] = 10; //十
            if(arr[1] > 0){
                id[index++] = arr[1]; //个位数
            }
            if(arr[0] > 0){
                id[index++] = 24; //点
                id[index++] = arr[0]; //第一位小数
            }       
        }else if((i == 2)||(i == 1))
        {
            if(arr[1] == 0){
                id[index++] = 27;
            }else{
                id[index++] = arr[1]; //个位数
            }
            if(arr[0] > 0){
                id[index++] = 24; //点
                id[index++] = arr[0]; //第一位小数
            }  
        }
        id[index++] = 13; //播报摄氏度
    }

    if((humidity <= 100)&&(humidity >= 0))
    {
        for(i=0;i<4;i++){
            arr[i] = 0;
        }
        humidity_int = humidity * 10; //将湿度值放大10倍
        for(i =  0; humidity_int !=0; i++)   //123.4
        {
            arr[i] = humidity_int%10;
            humidity_int /= 10;
        }
        id[index++] = 26; //播报“湿度百分之”

        if(humidity >= 100)
        {
            id[index++] = arr[3]; //百位数
            id[index++] = 11; //百
            if(arr[2] > 0){
                id[index++] = arr[2]; //十位数
                id[index++] = 10; //十
            }else{
                id[index++] = 27; //零
            }
            if(arr[1] > 0){
                id[index++] = arr[1]; //个位数
            }
            if(arr[0] > 0){
                id[index++] = 24; //点
                id[index++] = arr[0]; //第一位小数
            }
        }
        else if(humidity >= 10)
        {
            id[index++] = arr[2]; //十位数
            id[index++] = 10; //十
            if(arr[1] > 0){
                id[index++] = arr[1]; //个位数
            }
            if(arr[0] > 0){
                id[index++] = 24; //点
                id[index++] = arr[0]; //第一位小数
            }       
        }else if(humidity > 0)
        {
            id[index++] = arr[1]; //个位数
            if(arr[0] > 0){
                id[index++] = 24; //点
                id[index++] = arr[0]; //第一位小数
            }  
        }else if(humidity == 0){
            id[index++] = 27; //个位数
        }
    }

    for(i = 0; i < index; i++){
        while (prompt_play_by_cmd_id(id[i], -1, NULL, false))
        {    
            delay(1);
        }   
    }
}

 

posted @ 2026-05-13 01:44  FBshark  阅读(19)  评论(0)    收藏  举报