一、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
:指定要比较的最大字符数。
返回值:
- 如果
s1
和s2
的前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