ASR-01和ESP32语音控制LED灯——基于VSCODE编辑器和ESP-IDF环境

一、ASR-01部分

大家不要问我软件哪里来,大家哪里买的的,就去哪里要,淘宝客服一定有,没有你就换一家。

        图形化编程


        原理:通过接收相匹配语音,赋值给ID,然后通过switch语句,判断ID值,执行通过串口发送相关信息的语句。然后在核心板方面通过判断发送的信息实现开关灯。

代码模式


#include "asr.h"
#include "setup.h"
#include "myLib/asr_event.h"
#include "HardwareSerial.h"
 
uint32_t snid;
void ASR_CODE();
 
//{ID:250,keyword:"命令词",ASR:"最大音量",ASRTO:"音量调整到最大"}
//{ID:251,keyword:"命令词",ASR:"中等音量",ASRTO:"音量调整到中等"}
//{ID:252,keyword:"命令词",ASR:"最小音量",ASRTO:"音量调整到最小"}
//{speak:丫丫-可爱女童,vol:2,speed:10,platform:baidu}
//{playid:10001,voice:欢迎使用智能管家,用智能管家唤醒我。}
//{playid:10002,voice:我退下了,用智能管家唤醒我}
 
/*描述该功能...
*/
void ASR_CODE(){
  switch (snid) {
   case 4:
    Serial.print('1');
    break;
   case 6:
    Serial.write('0');
    break;
  }
 
}
 
void setup()
{
  Serial.begin(9600);
  //{ID:2,keyword:"唤醒词",ASR:"智能管家",ASRTO:"我在"}
  //{ID:4,keyword:"命令词",ASR:"打开红灯",ASRTO:"好的,马上打开红灯"}
  //{ID:6,keyword:"命令词",ASR:"关闭红灯",ASRTO:"好的,马上关闭红灯"}
}

二、VS_CODE部分

环境配置我就不多说了,论坛上有很多的优秀博主。我就直接上说明了

①、创建一个新项目

1、打开ESP—IDF插件

2、新建文件

3、选择例程

一直下滑,知道看见下图中的选项,这里的例程其实选一个GPIO吧还是,虽然本质上是差不多的

②创建模块

大家这里根据需要创建模块,一定要养好分模块编程的习惯。

还有就是大家新建模块的时候,一定要把它建立在main文件夹下,

创建完成后,需要到这里将我们建立的.c 文件包含进来,要不然编译时会报错

③运行流程

流程就是下面这个流程,简单做了一下,没有那么严谨,勿怪勿怪

③代码部分

上代码

我挑重要的介绍一下,源工程我放在最后,大家自取。

CMaketList.txt

这个文件是用来包含.c文件的,大家建立在main.c文件夹下的模块,都需要在这里被包含一下

idf_component_register(SRCS "led.c" "uart.c" "main.c"
                    INCLUDE_DIRS ".")

信息比较模块

这里使用的是strncmp字符串比较关键字

strncmp(const char *s1, const char *s2, size_t n);

参数说明:

  • s1:指向第一个要比较的字符串。
  • s2:指向第二个要比较的字符串。
  • n:指定要比较的最大字符数。

返回值:

  • 如果 s1s2 的前 n 个字符相等,或者都到达了字符串结束符 \0 并且在这之前所有比较的字符都相同,则返回 0。
  • 如果 s1 的前 n 个字符小于 s2 的相应字符(基于 ASCII 值),则返回一个负整数。
  • 如果 s1 的前 n 个字符大于 s2 的相应字符,则返回一个正整数。
if(strncmp(data,"1", len) == 0)
            {
                // ESP_LOGI(TAG, "Received: %s", data);
                gpio_set_level(GPIO_OUTPUT_IO_0, 1);

                uart_write_bytes(UART_NUM, data, strlen(data));//写数据,回传数据
            
            }   
            else if(strncmp(data,"0", len) == 0)
            {
                 // ESP_LOGI(TAG, "Received: %s", data);
                gpio_set_level(GPIO_OUTPUT_IO_0, 0);

                uart_write_bytes(UART_NUM, data, strlen(data));//写数据,回传数据
            }

看了看,好像也没什么重要的,大家自己将下面的代码复制到工程中自己研究一下吧,有什么问题大家就在评论区交流,这些简单项目没什么难度,大家可以以看stm32的代码一样的角度去解析,

三、源码分享

main.c

#include "main.h"
char data[128];
   
void app_main(void)
{
    uart_init();
    LED_Init();

     while (1) {
        // 读取数据
        int len = uart_read_bytes(UART_NUM, data, sizeof(data), 20 / portTICK_PERIOD_MS);//读取接收字符,并接收返回的数据长度
        if (len > 0) {
            // 打印接收到的数据
            data[len] = '\0';
            if(strncmp(data,"1", len) == 0)
            {
                // ESP_LOGI(TAG, "Received: %s", data);
                gpio_set_level(GPIO_OUTPUT_IO_0, 1);

                uart_write_bytes(UART_NUM, data, strlen(data));//写数据,回传数据
            
            }   
            else if(strncmp(data,"0", len) == 0)
            {
                 // ESP_LOGI(TAG, "Received: %s", data);
                gpio_set_level(GPIO_OUTPUT_IO_0, 0);

                uart_write_bytes(UART_NUM, data, strlen(data));//写数据,回传数据
            }
        }
     }
}
    


main.h

#ifndef __MAIN_H
#define __MAIN_H

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <inttypes.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include "driver/uart.h"

/* 外设头文件 */

#include "led.h"
#include "uart.h"

#endif

led.c

#include "led.h"
static const char *TAG = "LED";



void LED_Init()
{
    //zero-initialize the config structure.
    gpio_config_t io_conf = {};//初始化GPIO的结构体
    //disable interrupt
    io_conf.intr_type = GPIO_INTR_DISABLE;
    //set as output mode
    io_conf.mode = GPIO_MODE_OUTPUT;
    //bit mask of the pins that you want to set,e.g.GPIO18/19
    io_conf.pin_bit_mask = (1ULL << GPIO_OUTPUT_IO_0);
    //disable pull-down mode
    io_conf.pull_down_en = 0;
    //disable pull-up mode
    io_conf.pull_up_en = 0;
    //configure GPIO with the given settings
    gpio_config(&io_conf);

}

led.h

#ifndef __led_H
#define __led_H

#include "main.h"

#define GPIO_OUTPUT_IO_0    CONFIG_GPIO_OUTPUT_0
#define GPIO_OUTPUT_IO_1    CONFIG_GPIO_OUTPUT_1
#define GPIO_OUTPUT_PIN_SEL  ((1ULL<<GPIO_OUTPUT_IO_0) | (1ULL<<GPIO_OUTPUT_IO_1))
void LED_Init();

#endif

uart.c

#include "uart.h" //包含头文件

static const char *TAG = "UART";

void uart_init(void)
{
    // 配置UART参数
    uart_config_t uart_config = {
        .baud_rate = UART_BAUD_RATE,
        .data_bits = UART_DATA_8_BITS,
        .parity = UART_PARITY_DISABLE,
        .stop_bits = UART_STOP_BITS_1,
        .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
        .source_clk = UART_SCLK_DEFAULT,
    };

    // 安装UART驱动
    uart_driver_install(UART_NUM, 256, 0, 0, NULL, 0);

    // 设置UART引脚
    uart_set_pin(UART_NUM, UART_TX_PIN, UART_RX_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);

    // 配置UART
    uart_param_config(UART_NUM, &uart_config);
}

// void uart_rx_task(void *pvParameters)
// {
//    char data[128];
//     while (1) {
//         // 读取数据
//         int len = uart_read_bytes(UART_NUM, data, sizeof(data), 20 / portTICK_PERIOD_MS);
//         if (len > 0) {
//             // 打印接收到的数据
//             data[len] = '\0';
//             if(strncmp(data,"1", len) == 0){
//                 ESP_LOGI(TAG, "Received: %s", data);
//                 uart_write_bytes(UART_NUM, data, strlen(data));//写数据,回传数据
            
//         }
//     }
// }

uart.h

#ifndef __UART_H
#define __UART_H

#include "main.h"
#define UART_NUM UART_NUM_1  // 使用UART1
#define UART_BAUD_RATE 115200  // 波特率
#define UART_TX_PIN (GPIO_NUM_17)  // TX引脚
#define UART_RX_PIN (GPIO_NUM_16)  // RX引脚


void uart_rx_task(void *pvParameters);
void uart_init(void);

#endif

### 回答1: asr01是一个实时语音识别的接口服务。通过HTTP请求,我们可以向asr01发送语音数据,并获取语音识别的结果。 首先,我们需要构建一个POST请求,其中包含一些必要的参数。这些参数包括API Key、语言、采样率、音频格式和音频数据等。API Key是用于身份验证的密钥,语言是指定要识别的语言,采样率是指定音频数据的采样频率,音频格式是指定音频的编码格式,而音频数据是要识别的语音内容。 接着,我们将构建请求的头部信息,包含Content-Type和Authorization等。Content-Type指定请求体中的数据类型,我们可以使用multipart/form-data或application/json类型。Authorization是授权的方式,通常是将API Key加密生成一个token,并作为请求头部的一部分。 然后,我们需要将请求体中的参数和音频数据进行编码,并发送到asr01的接口地址。音频数据可以是一个音频文件,或者是通过麦克风实时录制的音频。 当请求发送成功后,asr01会开始对音频数据进行实时语音识别,识别的结果会以HTTP响应的形式返回给我们。我们可以从响应中解析出识别的文本结果,并进行后续的处理和分析。 总之,通过HTTP请求,我们可以方便地使用asr01进行实时语音识别。我们只需构建请求、发送数据并解析响应,即可获取到准确的语音识别结果。这为语音识别在语音助手、智能客服、语音翻译等领域的应用提供了便捷和高效的工具。 ### 回答2: ASR01是一个HTTP请求的缩写,HTTP是超文本传输协议(Hypertext Transfer Protocol)的简称,它是一种用于在计算机网络上进行通信的协议。ASR01表示的可能是对某个API或服务器发起的HTTP请求。 HTTP请求包括请求行、请求头和请求体三个部分。请求行由请求方法、请求目标和HTTP协议版本组成。常见的请求方法有GET、POST、PUT、DELETE等,它们分别代表着获取、创建、更新和删除资源的操作。请求目标是URL,表示请求的资源的位置。协议版本则是HTTP的版本号,如HTTP/1.1。 请求头是用来传递相关信息的,包括User-Agent、Accept、Content-Type等。User-Agent标识了发起请求的客户端类型,可用于服务器识别、适配不同设备。Accept表示客户端可接受的响应类型。Content-Type表示请求体的媒体类型,如application/json、application/x-www-form-urlencoded等,用于告诉服务器请求体的格式。 请求体则是可选的,用于传递请求参数或数据。它通常用于POST请求,可以是表单数据、JSON数据等。例如,在向服务器提交表单注册新用户时,请求体中会包含用户名、密码等信息。 ASR01 HTTP请求的具体内容取决于调用的API或服务器的要求。在发起请求前,我们需要知道API的URL、请求方法、请求头和请求体的格式。通过构建合适的请求,可以向服务器请求数据、提交数据或执行特定操作。 总之,ASR01 HTTP请求是一种用来发起与服务器通信的协议,通过定义好请求行、请求头和请求体,我们可以向服务器请求所需的资源,进行数据交互和操作。 ### 回答3: asr01是一种常见的用于进行HTTP请求的技术方法。ASR(Application Session Relay)是一种将请求从一个应用程序传递到另一个应用程序的过程。ASR可以用于不同的场景,例如将用户的请求在系统之间进行传递,或者在不同的网络节点之间进行通信。 ASR01ASR技术的一种具体实现,它主要针对HTTP请求。HTTP是一种常用的互联网协议,用于在客户端与服务器之间传输数据。ASR01通过HTTP请求来实现应用程序之间的通信。 使用ASR01进行HTTP请求的过程如下: 1. 首先,应用程序发起HTTP请求,包括请求的方法(如GET、POST等)、URL地址和请求头等信息。 2. ASR01接收到HTTP请求后,解析请求,获取请求的目标地址和相关参数。 3. ASR01将解析后的请求通过网络发送给目标服务器。 4. 目标服务器处理请求,并将响应返回给ASR01。 5. ASR01接收到响应后,将其解析为合适的格式,并将响应返回给发起请求的应用程序。 ASR01可以实现请求的中继功能,它可以将请求从一个应用程序传递到另一个应用程序,以实现不同系统之间的数据交互。同时,ASR01还可以进行请求的转发、过滤、验证等操作,以提供更加灵活的功能。 总之,ASR01是一种通过HTTP请求来实现应用程序之间通信的技术方法。通过ASR01,可以实现请求的中继、转发、过滤等功能,为不同系统之间的数据交互提供便利。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值