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.rhkb.cn/news/445395.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux内核USB3.0驱动框架分析--USB Hub代码分析

一、Linux 下USB Hub热插拔处理 1.1 Linux下USB HUB的驱动的实现和分析&#xff1a; USB设备是热插拔&#xff0c;因此在hub_probe函数中调用hub_configure函数来配置hub&#xff0c;在这个函数中主要是利用函数usb_alloc_urb函数来分配一个urb&#xff0c;利用usb_fill_int_u…

金九银十软件测试面试题(800道)

今年你的目标是拿下大厂offer&#xff1f;还是多少万年薪&#xff1f;其实这些都离不开日积月累的过程。 为此我特意整理出一份&#xff08;超详细笔记/面试题&#xff09;它几乎涵盖了所有的测试开发技术栈&#xff0c;非常珍贵&#xff0c;人手一份 肝完进大厂 妥妥的&#…

【Linux】操作系统基础

1.冯诺依曼体系结构介绍 冯诺依曼体系结构如下&#xff1a; 在上图中「输⼊设备」和「输出设备」⼀般被称为计算机的外设&#xff0c;⽽「存储器」在冯 诺依曼体系结构中表示「内存」 输⼊设备⼀般包括&#xff1a;⽹卡、磁盘、键盘、触摸屏等 输出设备⼀般包括&#xff1a;…

java 自定义填充excel并导出

首先在resources下面放一个excel模板 1. 方法签名和请求映射 RequestMapping(value "/ExportXls") public ResponseEntity<byte[]> rwzcExportXls(HttpServletRequest request, RequestBody JSONArray jsonArray) throws IOException { RequestMapping(val…

剧场的客户端形式区别,APP,小程序,H5的不同优势以及推广方案

剧场的客户端形式区别与推广策略 在数字化时代&#xff0c;剧场的线上化成为大势所趋。不同的线上平台如APP、小程序和H5各有千秋&#xff0c;如何选择最适合自己的平台&#xff0c;并制定有效的推广方案&#xff0c;成为了剧场管理者需要考虑的重要问题。 APP&#xff1a;深度…

【ONE·Web || HTML】

总言 主要内容&#xff1a;HTML基本知识入门&#xff0c;主要介绍了常见的一些标签使用&#xff0c;以及简单案例演示。       文章目录 总言0、前置说明1、认识HTML1.1、是什么1.2、初识 HTML 标签、HTML 文件基本结构1.2.1、相关说明1.2.2、vscode如何快速生成代码 2、HT…

污水排放口细粒度检测数据集,污-水排放口的类型包括10类目标,10000余张图像,yolo格式目标检测,9GB数据量。

污水排放口细粒度检测数据集&#xff0c;污-水排放口的类型包括10类目标&#xff08;1 合流下水道&#xff0c;2 雨水&#xff0c;3 工业废水&#xff0c;4 农业排水&#xff0c;5 牲畜养殖&#xff0c;6 水产养殖&#xff0c;7 地表径流&#xff0c;8 废水处理厂&…

三菱FX3U PLC绝对定位- DRVA指令

指令格式 相关软元件一览 功能和动作 这是采用绝对驱动的单速定位指令。采用从原点(0点)开始的距离指定方式&#xff0c; 也被称为绝对驱动方式。 1、在指令执行过程中&#xff0c;即使改变操作数的内容&#xff0c;也不反映到当前的运行中。 在下次的指令驱动时才有效…

QT 中如何保存matlab 能打开的.mat数据矩阵!

Windows 上安装并使用 MATIO 库来保存 MATLAB 格式的 .mat 文件&#xff0c;需要进行以下步骤&#xff1a; 1. 下载并安装 CMake MATIO 使用 CMake 构建项目&#xff0c;因此你需要先安装 CMake。 前往 CMake 官网下载适用于 Windows 的安装程序并安装。 2. 下载 MATIO 库源…

Windows,MySQL主从复制搭建

前提&#xff1a;windows环境&#xff0c;同一个服务器安装多个相同版本的mysql数据库 多个MySQL服务搭建完成后&#xff0c;下面我们进行主从复制的相关配置 1.主数据库 执行指令 #创建用户 CREATE USER slavelocalhost IDENTIFIED BY 123456;#授权 GRANT REPLICATION SLA…

专线监控的使用方法:运维团队的全面实战指南

在当今高度信息化的时代&#xff0c;专线网络已成为企业连接不同地域、保障业务连续性的重要基础设施。然而&#xff0c;随着网络架构的复杂化和业务需求的多样化&#xff0c;运维团队面临着前所未有的挑战。为了有效应对这些挑战&#xff0c;运维团队需要深入了解并熟练掌握专…

前端埋点学习

前端埋点 前端数据埋点是在前端页面中通过代码的方式手机用户行为数据和页面性能的过程&#xff0c;通过在页面中插入指定的代码&#xff0c;实现实时监控用户在页面上的操作行为。 通常包括一下事件 定义事件: 定义需要手机的数据事件&#xff0c;如点击&#xff0c;浏览等添…

Linux系列-常见的指令(二)

&#x1f308;个人主页&#xff1a; 羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” mv 剪切文件&#xff0c;目录 重命名 比如说&#xff0c;我们在最开始创建一个新的文件hello.txt 然后我们将这个文件改一个名字&#xff0c;改成world.txt 所以&#xff0c;…

UE5 武器IK瞄准系统

创建空项目 创建基础蓝图类My_GameMode&#xff0c;My_HUD&#xff0c;My_PlayChar&#xff0c;My_PlayController 项目设置地图模式 近裁平面 0.1 My_PlayChar蓝图中添加摄像机&#xff0c;角色骨骼网格体&#xff0c;武器骨骼网格体 编辑角色骨骼&#xff0c;预览控制器使用…

本地生活服务项目入局方案解析!本地生活服务商系统能实现怎样的作业效果?

当前&#xff0c;各大平台的本地生活服务业务日渐兴盛&#xff0c;提高创业者入局意向的同时&#xff0c;也让本地生活服务项目有哪些等问题也成为了多个创业者社群中的热议对象。而从目前的讨论情况来看&#xff0c;在创业者们所询问的众多本地生活服务项目中&#xff0c;通过…

apisix云原生网关

定义 企业级网关通过域名、路由将请求分发到对应的应用上&#xff0c;通常承载数千个服务的流量&#xff0c;对稳定性有较高要求。 CNCF全景图 选型 Kubernetes抽象出两个核心概念&#xff1a;Service&#xff0c;为多个Pod提供统一的访问入口&#xff1b;Ingress&#xff…

DBA | 如何将 .mdf 与 .ldf 的数据库文件导入到SQL Server 数据库中?

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 原文链接&#xff1a;DBA | 如何将 .mdf 与 .ldf 的数据库文件导入到SQL Server 数据库中? 如何将 (.mdf) 和 (.ldf) 的SQL Server 数据库文件导入到当前数据库中? Step 1.登录到 Sql Server 服…

18770 差值最大

### 思路 为了找到两个数x和y使得x - y的值最大&#xff0c;并且x在y的右侧&#xff0c;我们可以使用以下方法&#xff1a; 1. 从右向左遍历数组&#xff0c;记录当前遍历到的最大值max_right。 2. 对于每个元素a[i]&#xff0c;计算max_right - a[i]&#xff0c;并更新最大差…

《RabbitMQ篇》消息应答和发布确认

消息应答 消息应答机制&#xff1a;消费者接收信息并处理完之后&#xff0c;告诉rabbitmq该信息已经处理&#xff0c;rabbitmq可以把该信息删除了. 消息自动重新入队&#xff1a;如果处理某个消息的消费者异常关闭了&#xff0c;没有发送ACK确认&#xff0c;rabbitmq会将其重…

C++ | Leetcode C++题解之第463题岛屿的周长

题目&#xff1a; 题解&#xff1a; class Solution {constexpr static int dx[4] {0, 1, 0, -1};constexpr static int dy[4] {1, 0, -1, 0}; public:int dfs(int x, int y, vector<vector<int>> &grid, int n, int m) {if (x < 0 || x > n || y <…