当前位置: 首页 > news >正文

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 interruptio_conf.intr_type = GPIO_INTR_DISABLE;//set as output modeio_conf.mode = GPIO_MODE_OUTPUT;//bit mask of the pins that you want to set,e.g.GPIO18/19io_conf.pin_bit_mask = (1ULL << GPIO_OUTPUT_IO_0);//disable pull-down modeio_conf.pull_down_en = 0;//disable pull-up modeio_conf.pull_up_en = 0;//configure GPIO with the given settingsgpio_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);// 配置UARTuart_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


http://www.mrgr.cn/news/48742.html

相关文章:

  • 《Spring Cloud 微服务:构建高效、灵活的分布式系统》
  • 优秀的面试官!通过一个问题考察了所有网络编程知识点
  • Floyd
  • 51单片机的土壤湿度检测控制系统【proteus仿真+程序+报告+原理图+演示视频】
  • CBA认证培训,业务架构师的筑梦之旅!
  • Windows,MySQL主从复制搭建
  • 状态管理(2)——@State组件内状态
  • 【pyspark学习从入门到精通2】理解pyspark_2
  • 85 外网用户通过域名访问内网服务器
  • 复盘20241012
  • 计算机网络:数据链路层 —— 可靠传输服务
  • 【工具类】hutool http请求获取S3图片流
  • 3D技术的应用场景有哪些?
  • [Gtk] 前言
  • Centos7快速安装配置RabbitMQ
  • LangChain——Embedding 智谱AI
  • 汽车免拆诊断案例 | 2022款大众捷达VS5车行驶中挡位偶尔会锁在D3挡
  • 【C++】基于红黑树封装set和map
  • 关于sql语句where限定条件不等号不生效
  • LLM - 使用 ModelScope SWIFT 测试 Qwen2-VL 的 LoRA 指令微调 教程(2)