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

ESP-IDF学习记录(6)

这篇不知道起什么标题,因为已经卡滞很久了,从年前到现在,但也没停止探索

1.烧录

用的小型加热台,这步对我来说最难,自己没有焊接过QFN32的封装

总结一下目前遇到的问题:

1)5V供电选成了12V转5V芯片,电脑USb口只有5V,能工作,但是不稳定

2)qfn32,16pintypec对于我这种新手来说还是不太好焊接

3)usb下载有问题,目前没找到解决办法。因为实物没有焊接usb转串口部分,所以我是把串口脚直接接到外部ttl转usb上进行下载。或者直接焊接串口电路下载。

4)uart0还是乐鑫芯片首选验证方式,自己设计板子需要保留,并且与调试相关的都要设计成焊接针脚引出

5)下次设计要装上2P的typec接口,专门供电使用

好歹是主芯片运行起来了,氛围灯亮了,详情见:

蛇年RGB律动收音机 - 立创开源硬件平台蛇年RGB律动收音机,RGB随着收音机播放律动。支持usb或者串口烧录。主要是做块板子研究ESP-IDF框架的,学习软件是关键https://oshwhub.com/houyawei/year-of-the-snake-atmosphere-lamicon-default.png?t=O83Ahttps://oshwhub.com/houyawei/year-of-the-snake-atmosphere-lam不过硬件其他部分还是有问题

2.WiFi测试

这部分测试正常,但是信号不好,板子放在电脑主机上不容易连到WiFi。

用开发板测试没有这个问题。

说明天线布置的有问题,主芯片可以正常工作。

3.音频驱动

ES8311目前是我遇到最大的问题,使用官方idf 的demo,会崩溃,显示的i2c写入或者读取失败。

问题记录在乐鑫论坛上:

When running the demo of i2S ES8311, it crashes - ESP32 ForumEspressif ESP32 Official Forumicon-default.png?t=O83Ahttps://www.esp32.com/viewtopic.php?f=13&t=44240运行i2S ES8311的demo时,崩溃 - ESP32 ForumEspressif ESP32 Official Forumicon-default.png?t=O83Ahttps://www.esp32.com/viewtopic.php?f=25&t=44239运行i2S ES8311的demo时,崩溃了

es8311_init()就出问题了
es8311_write_reg i2c全报错,I2C read/write error
但是运行demo i2c tool,可以正常读写ES8311的寄存器,读到的地址是0x18U。
请教一下需要从哪判断问题。
试过ESP IDF5.3.2,ESP IDF5.1.4都是一样的问题。i2s es8311 codec example start
-----------------------------
I (363) i2s_es8311: i2s driver init success
E (1363) ES8311: es8311_init(329): I2C read/write error
ESP_ERROR_CHECK failed: esp_err_t 0x107 (ESP_ERR_TIMEOUT) at 0x42007890
--- 0x42007890: es8311_codec_init at E:/ESPproject/i2s_es8311/main/i2s_es8311_example.c:61 (discriminator 1)file: "./main/i2s_es8311_example.c" line 61在i2c tool里面都是正常的i2c-tools> i2cdetect0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- 18 -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
i2c-tools> i2cset -c 0x18 -r 0x00 0x1A
I (538875) cmd_i2ctools: Write OK
i2c-tools>  i2cget -c 0x18 -r 0x00 -l 1
0x1a 
i2c-tools> i2cset -c 0x18 -r 0x00 0x2B
I (570835) cmd_i2ctools: Write OK
i2c-tools>  i2cget -c 0x18 -r 0x00 -l 1
0x2bi2c tool的i2c在5.1.3上用的旧驱动#include "driver/i2c.h"在5.3.2上用的新驱动#include "driver/i2c_master.h"测试起来都正常
i2s es8311里面一直是旧的I2C#include "driver/i2c.h"

在论坛也发现别的用户发此类帖子了

i2s_es8311 example not working with ESP32-S3-LCD-EV-Board - ESP32 Forumi2s_es8311 example not working with ESP32-S3-LCD-EV-Boardi2s_es8311 example not working with ESP32-S3-LCD-EV-Board - ESP32 Forum

不得不说乐鑫论坛是真的拉跨,发帖子没人理,过年的时候论坛一直有问题,搜索就未反应。

在隔壁STC发的帖子永远有人回应,有的时候只是大佬的顺嘴一提,就能解决我这种小喽啰的大问题。

后面就不用es8311的组件,使用codec试了试

用了codec之后起码是不崩溃了,i2c也可以成功加载了,但是i2s没有数据,这点是有可能的,因为我的焊接技术很拉,qfn焊接不上很正常

/** SPDX-FileCopyrightText: 2010-2022 Espressif Systems (Shanghai) CO LTD** SPDX-License-Identifier: CC0-1.0*/#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "esp_system.h"
#include "esp_idf_version.h"
#include "unity.h"
#include "esp_codec_dev.h"
#include "esp_codec_dev_defaults.h"#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
#include "driver/i2s_std.h"
#include "driver/i2s_tdm.h"
#include "soc/soc_caps.h"
#else
#include "driver/i2s.h"
#endif#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0) && !CONFIG_CODEC_I2C_BACKWARD_COMPATIBLE
#include "driver/i2c_master.h"
#define USE_IDF_I2C_MASTER
#else
#include "driver/i2c.h"
#endif#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
#define I2S_MAX_KEEP SOC_I2S_NUM
typedef struct {i2s_chan_handle_t tx_handle;i2s_chan_handle_t rx_handle;
} i2s_keep_t;static i2s_comm_mode_t i2s_in_mode = I2S_COMM_MODE_STD;
static i2s_comm_mode_t i2s_out_mode = I2S_COMM_MODE_STD;
static i2s_keep_t *i2s_keep[I2S_MAX_KEEP];
#endifstatic void codec_max_sample(uint8_t *data, int size, int *max_value, int *min_value)
{int16_t *s = (int16_t *) data;size >>= 1;int i = 1, max, min;max = min = s[0];while (i < size) {if (s[i] > max) {max = s[i];} else if (s[i] < min) {min = s[i];}i++;}*max_value = max;*min_value = min;
}static int ut_i2c_init(uint8_t port)
{
#ifdef USE_IDF_I2C_MASTERi2c_master_bus_config_t i2c_bus_config = {0};i2c_bus_config.clk_source = I2C_CLK_SRC_DEFAULT;i2c_bus_config.i2c_port = port;i2c_bus_config.scl_io_num = TEST_BOARD_I2C_SCL_PIN;i2c_bus_config.sda_io_num = TEST_BOARD_I2C_SDA_PIN;i2c_bus_config.glitch_ignore_cnt = 7;i2c_bus_config.flags.enable_internal_pullup = true;return i2c_new_master_bus(&i2c_bus_config, &i2c_bus_handle);
#elsei2c_config_t i2c_cfg = {.mode = I2C_MODE_MASTER,.sda_pullup_en = GPIO_PULLUP_ENABLE,.scl_pullup_en = GPIO_PULLUP_ENABLE,.master.clk_speed = 100000,};i2c_cfg.sda_io_num = GPIO_NUM_0;i2c_cfg.scl_io_num = GPIO_NUM_1;esp_err_t ret = i2c_param_config(port, &i2c_cfg);if (ret != ESP_OK) {return -1;}return i2c_driver_install(port, i2c_cfg.mode, 0, 0, 0);
#endif
}static int ut_i2s_init(uint8_t port)
{
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)if (port >= I2S_MAX_KEEP) {return -1;}// Already installedif (i2s_keep[port]) {return 0;}i2s_chan_config_t chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM_0, I2S_ROLE_MASTER);i2s_std_config_t std_cfg = {.clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG(16000),.slot_cfg = I2S_STD_PHILIPS_SLOT_DEFAULT_CONFIG(16, I2S_SLOT_MODE_STEREO),.gpio_cfg ={.mclk = GPIO_NUM_10,.bclk = GPIO_NUM_8,.ws = GPIO_NUM_12,.dout = GPIO_NUM_11,.din = GPIO_NUM_7,},};i2s_keep[port] = (i2s_keep_t *) calloc(1, sizeof(i2s_keep_t));if (i2s_keep[port] == NULL) {return -1;}
#if SOC_I2S_SUPPORTS_TDM i2s_tdm_slot_mask_t slot_mask = I2S_TDM_SLOT0 | I2S_TDM_SLOT1 | I2S_TDM_SLOT2 | I2S_TDM_SLOT3;i2s_tdm_config_t tdm_cfg = {.slot_cfg = I2S_TDM_PHILIPS_SLOT_DEFAULT_CONFIG(16, I2S_SLOT_MODE_STEREO, slot_mask),.clk_cfg  = I2S_TDM_CLK_DEFAULT_CONFIG(16000),.gpio_cfg = {.mclk = GPIO_NUM_10,.bclk = GPIO_NUM_8,.ws = GPIO_NUM_12,.dout = GPIO_NUM_11,.din = GPIO_NUM_7,},};tdm_cfg.slot_cfg.total_slot = 4;
#endifint ret = i2s_new_channel(&chan_cfg, &i2s_keep[port]->tx_handle, &i2s_keep[port]->rx_handle);if(ret == ESP_OK)  printf("i2s_new_channel success.\n");else printf("i2s_new_channel failed.\n");if (i2s_out_mode == I2S_COMM_MODE_STD) {ret = i2s_channel_init_std_mode(i2s_keep[port]->tx_handle, &std_cfg);}
#if SOC_I2S_SUPPORTS_TDM else if (i2s_out_mode == I2S_COMM_MODE_TDM) {ret = i2s_channel_init_tdm_mode(i2s_keep[port]->tx_handle, &tdm_cfg);}
#endifif(ret == ESP_OK)  printf("2 success.\n");else printf("2 failed.\n");if (i2s_in_mode == I2S_COMM_MODE_STD) {ret = i2s_channel_init_std_mode(i2s_keep[port]->rx_handle, &std_cfg);} 
#if SOC_I2S_SUPPORTS_TDM else if (i2s_in_mode == I2S_COMM_MODE_TDM) {ret = i2s_channel_init_tdm_mode(i2s_keep[port]->rx_handle, &tdm_cfg);}
#endifif(ret == ESP_OK)  printf("3 success.\n");else printf("3 failed.\n");// For tx master using duplex modei2s_channel_enable(i2s_keep[port]->tx_handle);
#elsei2s_config_t i2s_config = {.mode = (i2s_mode_t) (I2S_MODE_TX | I2S_MODE_RX | I2S_MODE_MASTER),.sample_rate = 44100,.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,.communication_format = I2S_COMM_FORMAT_STAND_I2S,.intr_alloc_flags = ESP_INTR_FLAG_LEVEL2 | ESP_INTR_FLAG_IRAM,.dma_buf_count = 2,.dma_buf_len = 128,.use_apll = true,.tx_desc_auto_clear = true,};int ret = i2s_driver_install(port, &i2s_config, 0, NULL);i2s_pin_config_t i2s_pin_cfg = {.mck_io_num = TEST_BOARD_I2S_MCK_PIN,.bck_io_num = TEST_BOARD_I2S_BCK_PIN,.ws_io_num = TEST_BOARD_I2S_DATA_WS_PIN,.data_out_num = TEST_BOARD_I2S_DATA_OUT_PIN,.data_in_num = TEST_BOARD_I2S_DATA_IN_PIN,};i2s_set_pin(port, &i2s_pin_cfg);
#endifreturn ret;
}void app_main(void)
{// Need install driver (i2c and i2s) firstlyint ret = ut_i2c_init(0);if(ret == ESP_OK)  printf("ut_i2c_init success.\n");else printf("ut_i2c_init failed.\n");ret = ut_i2s_init(0);if(ret == ESP_OK)  printf("ut_i2s_init success.\n");else printf("ut_i2s_init failed.\n");// Do initialize of related interface: data_if, ctrl_if and gpio_ifaudio_codec_i2s_cfg_t i2s_cfg = {#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0).rx_handle = i2s_keep[0]->rx_handle,.tx_handle = i2s_keep[0]->tx_handle,#endif};const audio_codec_data_if_t *data_if = audio_codec_new_i2s_data(&i2s_cfg);TEST_ASSERT_NOT_NULL(data_if);audio_codec_i2c_cfg_t i2c_cfg = {.addr = ES8311_CODEC_DEFAULT_ADDR};#ifdef USE_IDF_I2C_MASTERi2c_cfg.bus_handle = i2c_bus_handle;#endifconst audio_codec_ctrl_if_t *out_ctrl_if = audio_codec_new_i2c_ctrl(&i2c_cfg);TEST_ASSERT_NOT_NULL(out_ctrl_if);// i2c_cfg.addr = ES7210_CODEC_DEFAULT_ADDR;// const audio_codec_ctrl_if_t *in_ctrl_if = audio_codec_new_i2c_ctrl(&i2c_cfg);// TEST_ASSERT_NOT_NULL(in_ctrl_if);const audio_codec_gpio_if_t *gpio_if = audio_codec_new_gpio();TEST_ASSERT_NOT_NULL(gpio_if);// New output codec interfacees8311_codec_cfg_t es8311_cfg = {.codec_mode = ESP_CODEC_DEV_WORK_MODE_BOTH,.ctrl_if = out_ctrl_if,.gpio_if = gpio_if,.pa_pin = GPIO_NUM_13,.use_mclk = true,};const audio_codec_if_t *out_codec_if = es8311_codec_new(&es8311_cfg);TEST_ASSERT_NOT_NULL(out_codec_if);// New output codec deviceesp_codec_dev_cfg_t dev_cfg = {.codec_if = out_codec_if,.data_if = data_if,.dev_type = ESP_CODEC_DEV_TYPE_IN_OUT,};esp_codec_dev_handle_t codec_dev = esp_codec_dev_new(&dev_cfg);TEST_ASSERT_NOT_NULL(codec_dev);// New input codec device// dev_cfg.codec_if = in_codec_if;// dev_cfg.dev_type = ESP_CODEC_DEV_TYPE_IN;// esp_codec_dev_handle_t record_dev = esp_codec_dev_new(&dev_cfg);// TEST_ASSERT_NOT_NULL(record_dev);ret = esp_codec_dev_set_out_vol(codec_dev, 80.0);TEST_ESP_OK(ret);// ret = esp_codec_dev_set_in_gain(record_dev, 30.0);// TEST_ESP_OK(ret);esp_codec_dev_sample_info_t fs = {.sample_rate = 48000,.channel = 2,.bits_per_sample = 16,};ret = esp_codec_dev_open(codec_dev, &fs);TEST_ESP_OK(ret);uint8_t data[256];printf("录制.\n");esp_codec_dev_set_in_gain(codec_dev, 30.0);esp_codec_dev_read(codec_dev, data, sizeof(data));printf("播放.\n");esp_codec_dev_write(codec_dev, data, sizeof(data));printf("结束.\n");}

4.解决思路

感觉不能卡在一个硬件上了,多准备几个硬件试试,在网上找到了两个别人的PCB扩展板
es8311 - 立创开源硬件平台ES8311音频编解码芯片icon-default.png?t=O83Ahttps://oshwhub.com/Karmurphy/es8311

ES8311单声道I2S数字音频功放板 - 硬创社便宜的音频播放方案,电路全国产芯片。icon-default.png?t=O83Ahttps://x.jlc.com/platform/detail/599a993831d94f72a79ec35d067bad2d好东西值得被大家看到

简介: 便宜的音频播放方案,电路全国产芯片。
1.产品简介
一款便宜的高音质的单声道音频播放功能板板。2.应用场景
低成本高音质音频开发,MP3等。3.产品概述
使用低功耗低纹波的LDO给ES8311供电保证电源干扰最小
功放芯片通过排针选择使用LDO供电或者外部5V供电
一个3.5mm耳机接口,单声道,预留耳机插入检测
预留麦克风接口
预留功放芯片使能控制口
PCB四角有安装孔位Φ2.2mm
推荐使用8Ω的1.7W内喇叭,4Ω的声音小4.产品参数
1.功能板输入电压:4V-5V2.功能板输入电流:平均值120mA,最大值为900mA3.音频芯片为ES8311,工作电压1.8-3.3V,功耗14mW4.功放芯片为NS4150,工作电压3.0-5.25V,最大3W输出功率5.电源芯片为ME6210A33M3G,输入耐压18V,输出电压3.3V,输出最大电流500mA6.供电接口为2.54排针,通讯接口为2.54排针,喇叭接口为2.54排针,3.5mm耳机接口为PJ-3427.PCB尺寸:51.7*34.1mm, 两层PCB设计。5.使用说明
与ESP32 WROOM开发板连接板子 ------------ ESP32I2C_SDA -- GPIO18I2C_SCK -- GPIO23I2S_SCLK -- GPIO22I2S_LRCK -- GPIO21I2S_DSDIN -- GPIO17VCC_IN -- VINGND -- GNDES8311通过可选10K电阻选择I2C地址(默认拉低)NS4150通过可选10K电阻选择启动或关闭(默认拉高)功放电源选择建议5V四角安装孔径Φ2.2mm

我这次直接在嘉立创上下单,并且ES8311让官方贴片,使用Esp32c3的开发板连接,就不信了。

有的东西是扩展库,我没让立创贴片,比如NS4150我自己贴。

另外看到这个作者用arduino写的蓝牙音箱,好家伙,只有短短几行,就可以实现,心态崩了。

#include <Arduino.h>
#include <btMusicBox.h>
#include <WiFi.h>
// 设置音频设备的名称
btMusicBox audio = btMusicBox("esp001");
String command;
#define I2C_SDA   18
#define I2C_SCL   23
#define I2S_SCLK  22  
#define I2S_DSDIN 17
#define I2S_LRCK  21
void setup()
{WiFi.mode(WIFI_OFF);Serial.begin(115200);Wire.end();Wire.begin(I2C_SDA, I2C_SCL); //SDA SCLAudio_codeC(ES8311);audio.begin();audio.I2S(I2S_SCLK, I2S_DSDIN, I2S_LRCK);audio.volume(1.0);      // 音量audio.reconnect();      // 重新连接到上次连接的设备//music.compress(thresh, attack, release, ratio, width, gain);Serial.printf("蓝牙示例开始...\n");
}
void loop()
{}

但是俺的目的是理解单片机底层程序,比如i2c,i2s这些都是我这种做上位机没有接触过的,所以还是要学学ESP-IDF,不眼馋Arduino了。

相关文章:

ESP-IDF学习记录(6)

这篇不知道起什么标题&#xff0c;因为已经卡滞很久了&#xff0c;从年前到现在&#xff0c;但也没停止探索 1.烧录 用的小型加热台&#xff0c;这步对我来说最难&#xff0c;自己没有焊接过QFN32的封装 总结一下目前遇到的问题&#xff1a; 1&#xff09;5V供电选成了12V转…...

Day84:数据可视化

数据可视化是数据分析的重要组成部分,它能直观地展现数据规律,使复杂数据变得易懂。Python 提供了多个数据可视化库,其中最常用的是 Matplotlib 和 Seaborn。今天,我们将学习如何使用这些工具绘制折线图、柱状图、散点图等。 1. 安装和导入库 如果你的 Python 没有安装 Ma…...

【机器学习与数据挖掘实战】案例13:基于BP神经网络模型的家用热水器用户行为分析与事件识别

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈机器学习与数据挖掘实战 ⌋ ⌋ ⌋ 机器学习是人工智能的一个分支&#xff0c;专注于让计算机系统通过数据学习和改进。它利用统计和计算方法&#xff0c;使模型能够从数据中自动提取特征并做出预测或决策。数据挖掘则是从大型数…...

数据结构 动态顺序表-vector

一、创建vector #include <vector> // 头⽂件 using namespace std; const int N 20; struct node {int a, b, c; }; // 1. 创建 void init() {vector<int> a1; // 创建⼀个空的可变⻓数组 vector<int> a2(N); // 指定好了⼀个空间&#xff0c;⼤⼩为 N …...

Windows 植物大战僵尸杂交版

植物大战僵尸杂交版 链接&#xff1a;https://pan.xunlei.com/s/VOIjttp8EzfL9fXO6S6ekvZYA1?pwdw8cm# 作者: B站UP主 潜艇伟伟迷...

【学习笔记】计算机网络(三)

第3章 数据链路层 文章目录 第3章 数据链路层3.1数据链路层的几个共同问题3.1.1 数据链路和帧3.1.2 三个基本功能3.1.3 其他功能 - 滑动窗口机制 3.2 点对点协议PPP(Point-to-Point Protocol)3.2.1 PPP 协议的特点3.2.2 PPP协议的帧格式3.2.3 PPP 协议的工作状态 3.3 使用广播信…...

SpringBoot和Spring主要区别

SpringBoot和Spring主要区别 1. 核心定位2. 配置方式3. 依赖管理4. 内嵌服务器5. 开发效率6. 监控与管理7. 适用场景8. 总结 Spring Boot 和 Spring 是 Java 生态中密切相关的两个框架&#xff0c;但它们的定位和使用场景有明显区别。以下是主要区别&#xff1a; 1. 核心定位 S…...

Blazor-<select>

今天我们来说说<select>标签的用法&#xff0c;我们还是从一个示例代码开始 page "/demoPage" rendermode InteractiveAuto inject ILogger<InjectPage> logger; <h3>demoPage</h3> <select multiple>foreach (var item in list){<…...

力扣-数组-20 有效的括号

思路 有效的括号符合栈的思想&#xff0c;先进后出 代码 class Solution { public:bool isValid(string s) {stack <char> sign;sign.push(s[0]);for(int i 1; i < s.size(); i){if(s[i] { || s[i] [ || s[i] (){sign.push(s[i]);}else if(s[i] } && …...

Best practice-ThreadLocal高并发场景的最佳实践

关于ThreadLocal基础信息 引用一段来自ThreadLocal源码中的doc注释来说明其特性&#xff1a; This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its get or set method) has …...

WiFi配网流程—SmartConfig 配网流程

目录 &#x1f4cc; SmartConfig 配网流程 &#x1f449; 阶段 1&#xff1a;设备进入配网模式 &#x1f449; 阶段 2&#xff1a;手机 App 发送 Wi-Fi 配置信息 &#x1f449; 阶段 3&#xff1a;设备解析 Wi-Fi 配置&#xff0c;连接家庭网络 &#x1f449; 阶段 4&…...

【鸿蒙HarmonyOS Next实战开发】多媒体视频播放-GSYVideoPlayer

简介 GSYVideoPlayer是一个视频播放器库&#xff0c;支持切换内核播放器&#xff08;IJKPlayer、avplayer&#xff09;&#xff0c;并且支持视频截图能力、 视频生成gif能力、边播边缓存能力、视频全屏能力等多种能力。 效果展示&#xff1a; 下载安装 ohpm install ohos/gs…...

IDEA中常见问题汇总

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…...

基于蜘蛛蜂优化算法的无人机集群三维路径规划Matlab实现

代码下载&#xff1a;私信博主回复基于蜘蛛蜂优化算法的无人机集群三维路径规划Matlab实现 《基于蜘蛛蜂优化算法的无人机集群三维路径规划》 摘要 本研究针对无人机集群三维路径规划问题&#xff0c;提出了一种基于蜘蛛蜂优化算法的解决方案。以5个无人机构成的集群为研究对…...

React中使用​​useReducer​​​高阶钩子来管理状态

在React开发中&#xff0c;状态管理是一个重要的概念。useState钩子用于管理简单的局部状态&#xff0c;但对于复杂的状态逻辑&#xff0c;useReducer钩子提供了更强大和灵活的解决方案。本文将详细介绍如何在React中使用 useReducer高阶钩子来管理状态。 一、useReducer概述 …...

一步一步生成音乐类小程序的详细指南,结合AI辅助开发的思路

以下是一步一步生成音乐类小程序的详细指南,结合AI辅助开发的思路: 需求分析阶段核心功能梳理 音乐播放器(播放/暂停/进度条/音量)歌单分类(流行/古典/摇滚等)用户系统(登录/收藏/历史记录)搜索功能(歌曲/歌手/专辑)推荐系统(根据用户偏好推荐)技术选型 前端:微信…...

聚类算法概念、分类、特点及应用场景【机器学习】【无监督学习】

概念 机器学习聚类算法‌是一种无监督学习方法&#xff0c;旨在将数据集分割成不同的类或簇&#xff0c;使得同一簇内的数据对象相似性尽可能大&#xff0c;而不同簇之间的数据对象差异性也尽可能大。聚类算法广泛应用于新闻自动分组、用户分群、图像分割等领域。‌ 主要聚类算…...

Oracle数据连接 Dblink

拓展&#xff1a; oracle远程登陆数据库 1.oracle客户端或者服务端 2.修改你的电脑如下路径文件&#xff08;服务器IP,服务器的数据库名&#xff0c;服务器的数据库端口号&#xff09; c:\oracle\product\10.2.0\db_1\NETWORK\ADMIN\tnsnames.ora orcl_109 (DESCRIPTION …...

Deepseek系列从v3到R易背面经版

deepseek v3 base要点 MTP : Multi-Token Prediction 训练时&#xff1a; 1. 把前一个block中input tokens经过embedding layer和transformer block的输出&#xff0c;进入output head之前的内容记为h&#xff0c;与下一个block的input tokens经过embedding layer输出的内容都…...

Maven入门核心知识点总结

Maven 1. POM&#xff08;Project Object Model&#xff09;2. 坐标&#xff08;Coordinates&#xff09;3. 依赖管理&#xff08;Dependency Management&#xff09;4. 常用五个生命周期&#xff08;Life Circle&#xff09;5. Maven 仓库&#xff08;Maven Repository&#x…...

Blocked aria-hidden on an element because its descendant retained focus.

在使用el-popover和el-radio-group实现弹窗选择数据后调用el-popover的doClose()方法时一直报错&#xff01; 经过分析发现el-popover及el-radio__original有aria-hidden属性&#xff0c;具体aria-hidden属性应用自行搜索了解。既然是这个玩意引起的&#xff0c;则在显示时将a…...

JavaScript 基础语法:变量、数据类型、运算符、条件语句、循环

JavaScript 是一种动态类型的脚本语言&#xff0c;广泛用于前端开发。以下是 JavaScript 基础语法的核心内容&#xff0c;包括变量、数据类型、运算符、条件语句和循环。 --- ### 1. 变量 变量用于存储数据。JavaScript 中有三种声明变量的方式&#xff1a; - **var**&…...

ElementUI的常用组件及使用技巧

1. 引言 项目背景与目标 随着前端技术的快速发展,构建高效、美观的用户界面变得越来越重要。ElementUI作为一款基于Vue.js的组件库,提供了丰富的组件和工具,帮助开发者快速构建高质量的Web应用。本文旨在介绍ElementUI的常用组件及其使用技巧,帮助开发者更好地利用Elemen…...

python爬虫--简单登录

1&#xff0c;使用flask框架搭建一个简易网站 后端代码app.py from flask import Flask, render_template, request, redirect, url_for, sessionapp Flask(__name__) app.secret_key 123456789 # 用于加密会话数据# 模拟用户数据库 users {user1: {password: password1}…...

三次握手,四次挥手,服务器模型(多进程并发,线程),基于套接字的UDP通信

三次握手&#xff1a; 第一次握手&#xff1a;客户端向服务器发送SYN待确认数据x, 客户端进入SYN_SEND状态​ 第二次握手&#xff1a;服务器向客户端回传一条ACK应答数据x1, 同时发送一条SYN待确认数据y&#xff0c;服务器进入SYN_RECV状态​ 第三次握手&#xff1a;客户端向服…...

Linux TCP 编程详解与实例

一、引言 在网络编程的领域中&#xff0c;TCP&#xff08;Transmission Control Protocol&#xff09;协议因其可靠的数据传输特性而被广泛应用。在 Linux 环境下&#xff0c;使用 C 或 C 进行 TCP 编程可以实现各种强大的网络应用。本文将深入探讨 Linux TCP 编程的各个方面&…...

Vue.js 如何自定义主题和样式

Vue.js 如何自定义主题和样式 今天我们来聊聊如何在 Vue 项目中自定义主题和样式。无论是你想让自己的应用看起来独一无二&#xff0c;还是想快速适配设计稿&#xff0c;自定义主题和样式都是必不可少的一环。下面我将和大家分享几种常见的自定义方法和技巧。 为什么要自定义…...

Elasticsearch 开放推理 API 增加了 Azure AI Studio 支持

作者&#xff1a;来自 Elastic Mark Hoy Elasticsearch 开放推理 API 现已支持 Azure AI Studio。在此博客中了解如何将 Azure AI Studio 功能与 Elasticsearch 结合使用。 作为我们持续致力于为 Microsoft Azure 开发人员提供他们选择的工具的一部分&#xff0c;我们很高兴地宣…...

提示工程:少样本提示(Few-shot Prompting)

少样本提示&#xff08;Few-shot Prompting&#xff09;是一种利用大语言模型从少量示例样本中学习并处理任务的方法。它的核心思想是利用大语言模型的上下文学习能力&#xff0c;通过在提示中增加“示例样本”来启发大语言模型达到举一反三的效果。这种方法避免了重新训练或者…...

封装descriptions组件,描述,灵活

效果 1、组件1&#xff0c;dade-descriptions.vue <template><table><tbody><slot></slot></tbody> </table> </template><script> </script><style scoped>table {width: 100%;border-collapse: coll…...