ESP32开发之LED闪烁和呼吸的实现
- 硬件电路介绍
- GPIO输出模式
- GPIO配置过程
- 闪烁灯的源码
- LED PWM的控制器(LEDC)概述
- LEDC配置过程及现象
- 整体流程
硬件电路介绍
电路图如下:
只要有硬件基础的应该都知道上图中,当GPIO4的输出电平为高时,LED灯亮,反之则熄灭。如果每间隔一段时间进行一次电平的反转,则将使LED产生闪烁的效果。
GPIO模式
在进行GPIO控制之前,需要熟悉一下ESP32的GPIO几种模式:
GPIO模式 | 模式宏定义 | 说明 |
---|---|---|
输入模式 | GPIO_MODE_INPUT | 可以通过配置项pull_up_en或pull_down_en配置上拉或者下拉 |
推挽输出模式 | GPIO_MODE_OUTPUT | 高低电平输出 |
开漏输出模式 | GPIO_MODE_OUTPUT_OD | 通常用于I2C |
中断 | 可通过intr_type配置项配置触发方式:上升沿/下降沿/双沿/电平触发等 | |
禁用 | GPIO_MODE_DISABLE | 禁用GPIO,不作为输入也不作为输出 |
输入输出模式 | GPIO_MODE_INPUT_OUTPUT | |
输入及开漏输出 | GPIO_MODE_INPUT_OUTPUT_OD |
注意:
- 使用中断时,将GPIO模式设置为输入模式
- 如果GPIO用于I2C的SDA,设置模式为GPIO_MODE_INPUT_OUTPUT_OD,且需要配置上拉,也可在芯片相关引脚增加上拉电路
GPIO配置过程
-
配置GPIO
使用结构体gpio_config_t对GPIO相关参数进行配置
-
注册GPIO
通过函数gpio_config函数将以上配置注册进系统
- 通过GPIO相关API函数对GPIO进行控制
比如此次实验是控制LED闪烁,那么则是使用gpio_set_level函数进行输出电平控制
闪烁灯的源码
/*** Copyright (C) 2024-2034 HalfMoon2.* All rights reserved.* * @file Filename without the absolute path* @brief Brief description* @author HalfMoon2* @date 2025-05-20* @version v0.1* * @revision history:* 2025-05-20 - Initial version.*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"#define LED_GPIO GPIO_NUM_4 //根据实际的连接方式更改void ledCtlTask(void *pvParam)
{while(1){gpio_set_level(LED_GPIO, 1); // 设置为高电平(点亮 LED)vTaskDelay(pdMS_TO_TICKS(500)); // 延时 0.5 秒gpio_set_level(LED_GPIO, 0); // 设置为低电平(熄灭 LED)vTaskDelay(pdMS_TO_TICKS(500)); // 延时 0.5 秒}
}void app_main(void)
{// 配置 GPIOgpio_config_t io_conf = {.pin_bit_mask = (1ULL << LED_GPIO), // 选择 GPIO.mode = GPIO_MODE_OUTPUT, // 设置为输出模式.pull_up_en = GPIO_PULLUP_DISABLE, // 不启用上拉.pull_down_en = GPIO_PULLDOWN_DISABLE, // 不启用下拉.intr_type = GPIO_INTR_DISABLE // 不启用中断};gpio_config(&io_conf);xTaskCreatePinnedToCore(ledCtlTask,"ledCtlTask",2048,NULL,3,NULL,1);
}
LED PWM的控制器(LEDC)概述
从以上案例可以看出,对于通用GPIO的控制要么是高电平,要么是低电平。所以只能控制LED的闪烁现象。而对于ESP32-S3却有专用控制LED的控制器,称之LED PWM。它有8路低速通道。专用于控制LED。当然也可以产生PWM控制电机等。ESP32有两组LED PWM控制器,一组为8路高速通道,另一组为8路低速通道。
LED PWM 控制器可在无需 CPU 干预的情况下自动改变占空比,实现亮度渐变,如果是RGB LED,还能实现颜色的渐变。
LEDC的配置过程及现象
- 定时器的配置过程
-
创建定时器配置结构体
typedef struct {ledc_mode_t speed_mode; /* LEDC速度模式, high-speed mode (only exists on esp32) or low-speed mode */ledc_timer_bit_t duty_resolution; /* LEDC占空比分辨率 */ledc_timer_t timer_num; /* The timer source of channel (0 - LEDC_TIMER_MAX-1) */uint32_t freq_hz; /* LEDC 的时钟频率 */ledc_clk_cfg_t clk_cfg; /*配置LEDC的时钟源. */bool deconfigure; /*是否取消此配置之前的配置,取消之前先要关闭定时器 */ } ledc_timer_config_t
-
使用相关函数将结构体完成配置
esp_err_t ledc_timer_config(const ledc_timer_config_t *timer_conf);//参数为以上定义的结构体
/*返回值:
* ESP_OK 成功
* ESP_ERR_INVALID_ARG 参数错误
* ESP_FAIL 无法根据给定频率和当前占空比分辨率找到合适的预分频器编号
*ESP_ERR_INVALID_STATE 定时器未配置或未暂停
*/
- 配置通道以及指定GPIO
- 创建配置通道结构体
typedef struct {int gpio_num; /* LEDC的输出GPIO*/ledc_mode_t speed_mode; /* LEDC 速度模式,ESP32S3只能配置为低速 */ledc_channel_t channel; /*LED PWM的控制器(LEDC) LEDC的通道 */ledc_intr_type_t intr_type; /*是否开启渐变中断 */ledc_timer_t timer_sel; /*选择定时器l (0 - LEDC_TIMER_MAX-1) */uint32_t duty; /*!< LEDC 通道占空比*/int hpoint; /*!< LEDC channel hpoint value, the range is [0, (2**duty_resolution)-1] */struct {unsigned int output_invert: 1;/*!< Enable (1) or disable (0) gpio output invert */} flags; /*!< LEDC 标志 */} ledc_channel_config_t;
- 使用函数完成配置
esp_err_t ledc_channel_config(const ledc_channel_config_t *ledc_conf);
- 配置占空比改变PWM信号
- 使能硬件PWM
//参数intr_alloc_flags为分配的中断优先级
esp_err_t ledc_fade_func_install(int intr_alloc_flags)
- 配置渐变参数
/*
参数:speed_mode:LEDC的速度模式,只有ESP32有高速模式channel:通道,0-7target_duty:占空比,取值范围 [0, (2**duty_resolution)]max_fade_time_ms:最大的渐变时间
*/
esp_err_t ledc_set_fade_with_time(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t target_duty, int max_fade_time_ms)
- 开启渐变
/*
参数:speed_mode:LEDC的速度模式channel:通道,0-7
fade_mode:是否阻塞直到渐变完成,如果设置成LEDC_FADE_WAIT_DONE模式,则不渐变到预定值则不返回
*/
esp_err_t ledc_fade_start(ledc_mode_t speed_mode, ledc_channel_t channel, ledc_fade_mode_t fade_mode)
- 第一阶段实例:实现LED缓慢亮灯
/*** Copyright (C) 2024-2034 HalfMoon2.* All rights reserved.* * @file Filename without the absolute path* @brief Brief description* @author HalfMoon2* @date 2025-05-27* @version v0.1* * @revision history:* 2025-05-27 - Initial version.*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include <driver/ledc.h>#define LEDC_MODE LEDC_LOW_SPEED_MODE
#define LEDC_DUTY_RES LEDC_TIMER_13_BIT
#define LEDC_TIMER_NUM LEDC_TIMER_0
#define LEDC_FREQ 5000
#define LEDC_CHANNEL LEDC_CHANNEL_0
#define LEDC_GPIO GPIO_NUM_4
#define LEDC_DUTY 4095 //2^13-1void ledc_init(void)
{ledc_timer_config_t timer_config={.speed_mode= LEDC_MODE,.duty_resolution= LEDC_DUTY_RES,.timer_num= LEDC_TIMER_NUM,.clk_cfg=LEDC_AUTO_CLK,.freq_hz=LEDC_FREQ};ledc_timer_config(&timer_config);ledc_channel_config_t ledc_channel={.speed_mode = LEDC_MODE,.channel = LEDC_CHANNEL,.gpio_num = LEDC_GPIO,.intr_type = LEDC_INTR_DISABLE,.duty = 0,.hpoint = 0};ledc_channel_config(&ledc_channel);
}void app_main(void)
{ledc_init();ledc_fade_func_install(0);ledc_set_fade_with_time(LEDC_MODE,LEDC_CHANNEL,4095,10000);ledc_fade_start(LEDC_MODE,LEDC_CHANNEL,LEDC_FADE_NO_WAIT);
}
波形说明:可以明显的看到PWM的占空比的变化,LED也缓慢的亮起。
那么接下来就是实现从亮起再缓慢的熄灭,以此循环则实现了LED呼吸的效果。
- 渐变回调函数
LEDC控制器在使能渐变后,每个通道都可以有一个回调函数,通过ledc_cb_register()进行注册
esp_err_t ledc_cb_register(ledc_mode_t speed_mode, ledc_channel_t channel, ledc_cbs_t *cbs, void *user_arg)/*参数:speed_mode:速度模式,只有ESP32有高速模式channel: LEDC通道,低速模式有8个通道cbs:回调函数原型定义在 ledc_cbs_t 结构体中user_arg:用户注册时的数据,用于给回调函数传参 */
- 通过事件组的方式将此时LED的状态发送出去,即设置事件值
在中断中避免处理复杂的内容,所以在渐变回调函数中只使用事件组方式发送相关事件。不了解这块的知识可以参考我之前的文章
《ESP32开发之freeRTOS的事件组》
bool IRAM_ATTR ledc_fade_cb(const ledc_cb_param_t *param, void *user_arg)
{BaseType_t pxHigherPriorityTaskWoken;//如果当前LEDC占空比最大,说明此时LED为开灯状态,反之为关灯状态if(param->duty){xEventGroupSetBitsFromISR(s_ledc_ev,LED_ON_EV,&pxHigherPriorityTaskWoken);}else{xEventGroupSetBitsFromISR(s_ledc_ev,LED_OFF_EV,&pxHigherPriorityTaskWoken);}return pxHigherPriorityTaskWoken;
}
- 创建一个任务来接收事件并做渐变过程的改变
void ledc_fade_task(void* param)
{EventBits_t ev;while(1){ev=xEventGroupWaitBits(s_ledc_ev,LED_OFF_EV|LED_ON_EV,pdTRUE,pdFALSE,portMAX_DELAY);if(ev){if(ev&LED_OFF_EV){ledc_set_fade_with_time(LEDC_MODE,LEDC_CHANNEL,LEDC_DUTY,1000);ledc_fade_start(LEDC_MODE,LEDC_CHANNEL,LEDC_FADE_NO_WAIT);}if(ev&LED_ON_EV){ledc_set_fade_with_time(LEDC_MODE,LEDC_CHANNEL,0,1000);ledc_fade_start(LEDC_MODE,LEDC_CHANNEL,LEDC_FADE_NO_WAIT);}}//处理完成需要再次注册回调函数,产生循环ledc_cbs_t cbs={.fade_cb=ledc_fade_cb};ledc_cb_register(LEDC_MODE,LEDC_CHANNEL,&cbs,NULL);}
}
- 第二阶段实例:完整实现渐变的循环
/*** Copyright (C) 2024-2034 HalfMoon2.* All rights reserved.* * @file Filename without the absolute path* @brief Brief description* @author HalfMoon2* @date 2025-05-27* @version v0.1* * @revision history:* 2025-05-27 - Initial version.*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include <driver/ledc.h>#define LEDC_MODE LEDC_LOW_SPEED_MODE
#define LEDC_DUTY_RES LEDC_TIMER_13_BIT
#define LEDC_TIMER_NUM LEDC_TIMER_0
#define LEDC_FREQ 5000
#define LEDC_CHANNEL LEDC_CHANNEL_0
#define LEDC_GPIO GPIO_NUM_4
#define LEDC_DUTY 4095 //2^13-1//通知渐变完成
static EventGroupHandle_t s_ledc_ev = NULL;//此时为关灯状态
#define LED_OFF_EV (1<<0)//事件组bit0设置为关灯事件//此时为开灯状态
#define LED_ON_EV (1<<1)//事件组bit1设置为开灯事件/*** @brief 渐变结束回调函数* @param *param:LEDC callback parameter* @param *user_arg:User registered data* @return 返回是否唤醒高优先级任务* @note 此函数为中断服务函数,所以不应处理过多的操作,那么在此函数中通过发送事件的方式,由渐变任务函数处理事件*/
bool IRAM_ATTR ledc_fade_cb(const ledc_cb_param_t *param, void *user_arg)
{BaseType_t pxHigherPriorityTaskWoken;//如果当前LEDC占空比最大,说明此时LED为开灯状态,反之为关灯状态if(param->duty){xEventGroupSetBitsFromISR(s_ledc_ev,LED_ON_EV,&pxHigherPriorityTaskWoken);}else{xEventGroupSetBitsFromISR(s_ledc_ev,LED_OFF_EV,&pxHigherPriorityTaskWoken);}return pxHigherPriorityTaskWoken;
}/*** @brief led渐变任务* @param 任务参数* @note 接收事件并做LED操作*/
void ledc_fade_task(void* param)
{EventBits_t ev;while(1){ev=xEventGroupWaitBits(s_ledc_ev,LED_OFF_EV|LED_ON_EV,pdTRUE,pdFALSE,portMAX_DELAY);if(ev){if(ev&LED_OFF_EV){ledc_set_fade_with_time(LEDC_MODE,LEDC_CHANNEL,LEDC_DUTY,1000);ledc_fade_start(LEDC_MODE,LEDC_CHANNEL,LEDC_FADE_NO_WAIT);}if(ev&LED_ON_EV){ledc_set_fade_with_time(LEDC_MODE,LEDC_CHANNEL,0,1000);ledc_fade_start(LEDC_MODE,LEDC_CHANNEL,LEDC_FADE_NO_WAIT);}}//处理完成需要再次注册回调函数,产生循环ledc_cbs_t cbs={.fade_cb=ledc_fade_cb};ledc_cb_register(LEDC_MODE,LEDC_CHANNEL,&cbs,NULL);}
}void ledc_init(void)
{ledc_timer_config_t timer_config={.speed_mode= LEDC_MODE,.duty_resolution= LEDC_DUTY_RES,.timer_num= LEDC_TIMER_NUM,.clk_cfg=LEDC_AUTO_CLK,.freq_hz=LEDC_FREQ};ledc_timer_config(&timer_config);ledc_channel_config_t ledc_channel={.speed_mode = LEDC_MODE,.channel = LEDC_CHANNEL,.gpio_num = LEDC_GPIO,.intr_type = LEDC_INTR_DISABLE,.duty = 0,.hpoint = 0};ledc_channel_config(&ledc_channel);//创建事件组,用于接收和发送渐变事件s_ledc_ev = xEventGroupCreate();//开启硬件PWMledc_fade_func_install(0);//设置渐变参数ledc_set_fade_with_time(LEDC_MODE,LEDC_CHANNEL,LEDC_DUTY,1000);//启动渐变ledc_fade_start(LEDC_MODE,LEDC_CHANNEL,LEDC_FADE_NO_WAIT);//注册渐变回调函数ledc_cbs_t cbs={.fade_cb=ledc_fade_cb,};ledc_cb_register(LEDC_MODE,LEDC_CHANNEL,&cbs,NULL);xTaskCreatePinnedToCore(ledc_fade_task,"ledc_fade_task",2048,NULL,3,NULL,1);
}void app_main(void)
{ledc_init();
}
整体流程
相关文章:

ESP32开发之LED闪烁和呼吸的实现
硬件电路介绍GPIO输出模式GPIO配置过程闪烁灯的源码LED PWM的控制器(LEDC)概述LEDC配置过程及现象整体流程 硬件电路介绍 电路图如下: 只要有硬件基础的应该都知道上图中,当GPIO4的输出电平为高时,LED灯亮,反之则熄灭。如果每间…...

【产品业务设计】支付业务设计规范细节记录,含订单记录、支付业务记录、支付流水记录、退款业务记录
【产品业务设计】支付业务设计规范细节记录,含订单记录、支付业务记录、支付流水记录 前言 我为什么要写这个篇文章 总结设计经验生成设计模板方便后期快速搭建 一个几张表 一共5张表; 分别是: 订单主表:jjy_orderMain订单产…...

2025软件供应链安全最佳实践︱证券DevSecOps下供应链与开源治理实践
项目背景:近年来,云计算、AI人工智能、大数据等信息技术的不断发展、各行各业的信息电子化的步伐不断加快、信息化的水平不断提高,网络安全的风险不断累积,金融证券行业面临着越来越多的威胁挑战。特别是近年以来,开源…...
Linux安装jdk、tomcat
1、安装jdk sudo yum install -y java-1.8.0-openjdk-devel碰到的问题:/var/run/yum.pid 已被锁定 Another app is currently holding the yum lock; waiting for it to exit… https://blog.csdn.net/u013669912/article/details/131259156 参考&#…...

WebRTC通话原理与入门难度实战指南
波煮的实习公司主要是音视频业务,所以最近在补习WebRTC的相关内容,会不定期给大家分享学习心得和笔记。 文章目录 WebRTC通话原理进行媒体协商:彼此要了解对方支持的媒体格式网络协商:彼此要了解对方的网络情况,这样才…...

N元语言模型 —— 一文讲懂!!!
目录 引言 一. 基本知识 二.参数估计 三.数据平滑 一.加1法 二.减值法/折扣法 编辑 1.Good-Turing 估计 编辑 2.Back-off (后备/后退)方法 3.绝对减值法 编辑4.线性减值法 5.比较 三.删除插值法(Deleted interpolation) 四.模型自适应 引言 本章节讲的…...

.NET 9中的异常处理性能提升分析:为什么过去慢,未来快
一、为什么要关注.NET异常处理的性能 随着现代云原生、高并发、分布式场景的大量普及,异常处理(Exception Handling)早已不再只是一个冷僻的代码路径。在高复杂度的微服务、网络服务、异步编程环境下,服务依赖的外部资源往往不可…...

Mac 安装git心路历程(心累版)
省流版:直接安装Xcode命令行工具即可,不用安Xcode。 git下载官网 第一部分 上网初步了解后,打算直接安装Binary installer,下载完安装时,苹果还阻止安装,只好在“设置–安全性与隐私”最下面的提示进行安…...

计算机网络第2章(下):物理层传输介质与核心设备全面解析
目录 一、传输介质1.1 传输介质的分类1.2 导向型传输介质1.2.1 双绞线(Twisted Pair)1.2.2 同轴电缆(Coaxial Cable)1.2.3 光纤(Optical Fiber)1.2.4 以太网对有线传输介质的命名规则 1.3 非导向型传输介质…...
Qt Creator 11.0创建ROS2 Humble工程
Qt Creator 11.0创建ROS2 Humble项目工程 安装ROSProjectManager插件创建ROS2项目在src下添加packagegit clone ROS2功能包编译运行安装ROSProjectManager插件 安装ROSProjectManager的主要流程参考官方的流程,地址(ros_qtc_plugin)。 此处采用二进制安装: sudo apt inst…...

C# 类和继承(扩展方法)
扩展方法 在迄今为止的内容中,你看到的每个方法都和声明它的类关联。扩展方法特性扩展了这个边 界,允许编写的方法和声明它的类之外的类关联。 想知道如何使用这个特性,请看下面的代码。它包含类MyData,该类存储3个double类型 的…...
机器学习复习3--模型的选择
选择合适的机器学习模型是机器学习项目成功的关键一步。这通常不是一个一蹴而就的过程,而是需要综合考虑多个因素,并进行实验和评估。 1. 理解问题本质 这是模型选择的首要步骤。需要清晰地定义试图解决的问题类型: 监督学习 : 数据集包含…...

MySQL复杂SQL(多表联查/子查询)详细讲解
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 MySQL复杂SQL(多表联查/子查询&a…...

STM32使用土壤湿度传感器
1.1 介绍: 土壤湿度传感器是一种传感装置,主要用于检测土壤湿度的大小,并广泛应用于汽车自动刮水系统、智能灯光系统和智能天窗系统等。传感器采用优质FR-04双料,大面积5.0 * 4.0厘米,镀镍处理面。 它具有抗氧化&…...
在C++中,头文件(.h或.hpp)的标准写法
目录 1.头文件保护(Include Guards)2.包含必要的标准库头文件3.前向声明(Forward Declarations)4.命名空间5.注释示例1:基础头文件示例2:包含模板和内联函数的头文件示例3:C11风格的枚举类头文件…...
Axios学习笔记
Axios简介 axios前端异步请求库类似JQuery ajax技术, ajax用来在页面发起异步请求到后端服务,并将后端服务响应数据渲染到页面上, jquery推荐ajax技术,但vue里面并不推荐在使用jquery框架,vue推荐使用axios异步请求库。…...
Langchain学习笔记(十一):Chain构建与组合技巧
注:本文是Langchain框架的学习笔记;不是教程!不是教程!内容可能有所疏漏,欢迎交流指正。后续将持续更新学习笔记,分享我的学习心得和实践经验。 前言 在LangChain的发展过程中,API设计经历了重…...
【判断既约分数】2022-4-3
缘由既约分数,除了辗转相除法-编程语言-CSDN问答 void 判断既约分数() {int a 1, b 2020, aa b, y 2, gs 0;while (aa){while (a < b){while (y < a && y < aa)if (a%y 0 && aa%y 0)a, y 2;elsey;if (a < b)gs; else;a, y 2;…...

Windows平台RTSP/RTMP播放器C#接入详解
大牛直播SDK在Windows平台下的RTSP、RTMP播放器模块,基于自研高性能内核,具备极高的稳定性与行业领先的超低延迟表现。相比传统基于FFmpeg或VLC的播放器实现,SmartPlayer不仅支持RTSP TCP/UDP自动切换、401鉴权、断网重连等网络复杂场景自适应…...
深圳SMT贴片工艺优化关键步骤
内容概要 深圳SMT贴片工艺优化作为现代电子制造的核心环节,聚焦于提升生产精度与稳定性。其技术框架围绕三大核心维度展开:温度动态调控、设备协同适配与工艺缺陷预判。通过精密温度曲线控制系统,实现回流焊环节的热能梯度精准匹配ÿ…...

从 JDK 8 到 JDK 17:Swagger 升级迁移指南
点击上方“程序猿技术大咖”,关注并选择“设为星标” 回复“加群”获取入群讨论资格! 随着 Java 生态向 JDK 17 及 Jakarta EE 的演进,许多项目面临从 JDK 8 升级的挑战,其中 Swagger(API 文档工具)的兼容性…...
配置git命令缩写
以下是 Git 命令缩写的配置方法及常用方案,适用于 Linux/macOS/Windows 系统: 🔧 一、配置方法 1. 命令行设置(推荐) # 基础命令缩写 git config --global alias.st status git config --global alias.co che…...
Redis 缓存问题及其解决方案
1. 缓存雪崩 概念:缓存雪崩是指在缓存层出现大范围缓存失效或缓存服务器宕机的情况下,大量请求直接打到数据库,导致数据库压力骤增,甚至可能引发数据库宕机。 影响:缓存雪崩会导致系统性能急剧下降,甚至导…...

使用 Coze 工作流一键生成抖音书单视频:全流程拆解与技术实现
使用 Coze 工作流一键生成抖音书单视频:全流程拆解与技术实现(提供工作流) 摘要:本文基于一段关于使用 Coze 平台构建抖音爆火书单视频的详细讲解,总结出一套完整的 AI 视频自动化制作流程。内容涵盖从思路拆解、节点配…...

【发布实录】云原生+AI,助力企业全球化业务创新
5 月 22 日,在最新一期阿里云「飞天发布时刻」,阿里云云原生应用平台产品负责人李国强重磅揭晓面向 AI 场景的云原生产品体系升级,通过弹性智能的一体化架构、开箱即用的云原生 AI 能力,为中国企业出海提供新一代技术引擎。 发布会…...
vue中的派发事件与广播事件,及广播事件应用于哪些场景和一个表单验证例子
在 Vue 2.X 中,$dispatch 和 $broadcast 方法已经被废弃。官方认为基于组件树结构的事件流方式难以理解,并且在组件结构扩展时容易变得脆弱。因此,Vue 2.X 推荐使用其他方式来实现组件间的通信,例如通过 $emit 和 $on 方法&#x…...
DeepSeek 赋能智能养老:情感陪伴机器人的温暖革新
目录 一、引言二、智能养老情感陪伴机器人的市场现状与需求2.1 市场现状2.2 老年人情感陪伴需求分析 三、DeepSeek 技术详解3.1 DeepSeek 的技术特点3.2 与其他类似技术的对比优势 四、DeepSeek 在智能养老情感陪伴机器人中的具体应用4.1 自然语言处理与对话交互4.2 情感识别与…...

LabVIEW主轴故障诊断案例
LabVIEW 开发主轴机械状态识别与故障诊断系统,适配工业场景主轴振动监测需求。通过整合品牌硬件与软件算法,实现从信号采集到故障定位的全流程自动化,为设备维护提供数据支撑,提升数控机床运行可靠性。 面向精密制造企业数控机…...
gRPC 的四种通信模式完整示例
gRPC 的四种基本通信模式,包括完整的 .proto 文件定义和 Go 语言实现代码: 1. 简单 RPC (Unary RPC) - 请求/响应模式 客户端发送单个请求,服务端返回单个响应 calculator.proto protobuf syntax "proto3";package calculato…...
C#中Struct与IntPtr转换:实用扩展方法
C#中Struct与IntPtr转换:实用扩展方法 在 C# 编程的世界里,我们常常会遇到需要与非托管代码交互,或者进行一些底层内存操作的场景。这时,IntPtr类型就显得尤为重要,它可以表示一个指针或句柄,用来指向非托…...