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

基于FPGA的血氧和心率蓝牙监测系统设计-max30102

文章目录

  • 前言
  • 一、芯片手册分析
  • 二、串口接口的血氧模块使用讲解
  • 三、仿真时序分析
  • 四、代码分析
    • 1.蓝牙数据发送
    • 2.心率数据采集
  • 总结


前言

本产品的核心是基于心率传感器的智能心率监测系统,通过硬件端的心率传感器获取人体的心率和血氧浓度等信息,并进行实时监测。APP端与硬件端通过蓝牙进行通信配对,显示用户的实时心率数据并提供曲线图展示,同时也支持异常数据查询和历史数据查询功能。 在云平台端,数据流能够实时展示,并且提供数据分析和处理,方便用户更加深入地了解自身的身体状况。
模块链接如下,这个模块是一个串口接口的。
在这里插入图片描述
题外话:
最开始用的是这个模块,跟上面两个本质上是一样的,不过这个模块做的是iic的接口,我也通过芯片手册对寄存器进行了相关的配置,发送命令等等,但是最终读取出来的6字节数据为0,一直读不出数据,检查时序也没找到问题,后来换了串口接口的模块,就没什么问题。因为时间比较紧张,所以也没深究问题到底出现在哪里,反正我觉得iic通信是没什么问题的。
在这里插入图片描述
当时iic通信截的图:

在这里插入图片描述
在这里插入图片描述
iic相关的驱动以及发送数据都是正确的,但是往里面读数据就是读不出来。
就当重新学习了一些iic通信吧。

一、芯片手册分析

其实按理来说,做iic通信是需要进行芯片手册阅读,确定设备地址,字节地址,控制指令等等,进而才能完成寄存器的配置以及读取数据的操作。
下面这个图是人家芯片手册给出来的最终读取数据的一个时序图吧,因为数据是6个字节,前面3个字节是心率,后面3个字节是血氧。但是我实际读的时候时序一致,但是没数据。简单记录一下吧,做过的大佬可以评论交流一下。
在这里插入图片描述
设备地址:
在这里插入图片描述
写数据:0xAE 读数据:0xAF

字节地址:0x00-0x0a

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
相关操作都阅读上面可以知道。

二、串口接口的血氧模块使用讲解

上面的都是iic通信的相关描述,后来我换了串口接口的血氧模块,就直接用指令集就可以了。
在这里插入图片描述
其实就用两条,一条是读心率,一条是读血氧。

三、仿真时序分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如图所示,图注就可以看懂了。

四、代码分析

vivado和Quartus版本都有,代码通用。
在这里插入图片描述

1.蓝牙数据发送

module Bluetooth_data(input           clk,input           rst_n,input  [3 :0]   HEART_data_h,input  [3 :0]   HEART_data_l,input  [3 :0]   SPO2_data_h,input  [3 :0]   SPO2_data_l,input           uart_tx_done,input  [7 :0]   uart_rx_data,input           uart_rx_done,output  reg             uart_tx_en,output  reg     [7:0]   uart_tx_data);parameter IDLE              = 4'd0;parameter WAIT_1s           = 4'd1;parameter SEND              = 4'd2;parameter OVER              = 4'd3;parameter count_max              = 32'd50000000;//spo2:23.6  ---->  74 65 6D 70 3A 32 33 2E 36 0d 0a//hert:23.6  ---->  68 75 6D 69 3A 32 33 2E 36 0d 0areg  [87:0]   cmd_temp    ={8'h53,8'h50,8'h4F,8'h32,8'h3a,8'h32,8'h33,8'h2e,8'h30,8'h0d,8'h0a};reg  [87:0]   cmd_humi    ={8'h48,8'h45,8'h41,8'h52,8'h54,8'h32,8'h33,8'h2e,8'h30,8'h0d,8'h0a};reg	[3: 0]	state;reg	[31:0]	count;reg  [5 :0]   tx_count;reg	[1: 0]	tx_en_count;reg           uart_tx_en_temp;reg	[1 :0]	change_count;wire	[7:0]		HEART_data_1;wire	[7:0]		HEART_data_2;wire	[7:0]		SPO2_data_1;wire	[7:0]		SPO2_data_2;
 assign HEART_data_1=8'h30+HEART_data_h;assign HEART_data_2=8'h30+HEART_data_l;assign SPO2_data_1=8'h30+SPO2_data_h;assign SPO2_data_2=8'h30+SPO2_data_l;
  //����״̬tx_dataalways @(posedge clk or negedge rst_n) beginif(!rst_n) beginuart_tx_data <= 8'd0;endelse if(change_count==2'd0)beginif((state==SEND) && tx_count<8'd5 ) beginuart_tx_data <= cmd_temp[87 - tx_count *8 -:8];endelse if((state==SEND) && tx_count==8'd5 ) beginuart_tx_data <= SPO2_data_1;endelse if((state==SEND) && tx_count==8'd6 ) beginuart_tx_data <= SPO2_data_2;endelse if((state==SEND) && tx_count==8'd7 ) beginuart_tx_data <= cmd_temp[87 - tx_count *8 -:8];endelse if((state==SEND) && tx_count==8'd8 ) beginuart_tx_data <= 8'h30;endelse if((state==SEND) && tx_count<8'd11 ) beginuart_tx_data <= cmd_temp[87 - tx_count *8 -:8];end	endelse if(change_count==2'd1)beginif((state==SEND) && tx_count<8'd5 ) beginuart_tx_data <= cmd_humi[87 - tx_count *8 -:8];endelse if((state==SEND) && tx_count==8'd5 ) beginuart_tx_data <= HEART_data_1;endelse if((state==SEND) && tx_count==8'd6 ) beginuart_tx_data <= HEART_data_2;endelse if((state==SEND) && tx_count==8'd7 ) beginuart_tx_data <= cmd_humi[87 - tx_count *8 -:8];endelse if((state==SEND) && tx_count==8'd8 ) beginuart_tx_data <= 8'h30;endelse if((state==SEND) && tx_count<8'd11 ) beginuart_tx_data <= cmd_humi[87 - tx_count *8 -:8];end	endend
  //tx_en timealways @(posedge clk or negedge rst_n) beginif(!rst_n) begintx_en_count <= 2'b0;endelse if((state==SEND) && tx_en_count<2'd1 && tx_count==8'd0) begintx_en_count <=tx_en_count+ 1'd1;endelse if((state==SEND) && tx_en_count==2'd1 && tx_count==8'd0) begintx_en_count <= 2'd3;endelse if(state==OVER)begintx_en_count <= 2'd0;endelse begintx_en_count <= tx_en_count;end
end//����״̬tx_countalways @(posedge clk or negedge rst_n) beginif(!rst_n) begintx_count <= 8'd0;endelse if(state==SEND) beginif(uart_tx_done==1'd1)tx_count <= tx_count+1'b1;endelse begintx_count <= 8'd0;end
end
  //����״̬data_tx_enalways @(posedge clk or negedge rst_n) beginif(!rst_n) beginuart_tx_en_temp <= 1'b0;uart_tx_en <= uart_tx_en_temp;endelse if((state==SEND ) && tx_en_count==1) beginuart_tx_en_temp <= 1'b1;uart_tx_en <= uart_tx_en_temp;endelse if((state==SEND ) && tx_count<8'd10 && uart_tx_done==1)beginuart_tx_en_temp <= 1'b1;uart_tx_en <= uart_tx_en_temp;endelse beginuart_tx_en_temp <= 1'b0;uart_tx_en <= uart_tx_en_temp;endend//state go always @(posedge clk or negedge rst_n) beginif(!rst_n) begincount <= 32'd0;endelse if(state == WAIT_1s && count < count_max)begincount <= count + 32'd1;endelse if(state == WAIT_1s && count == count_max)begincount <= 32'd0;endelse begincount <= count;endend
 //state go always @(posedge clk or negedge rst_n) beginif(!rst_n) beginstate <= IDLE;change_count<=2'd0;endelse begincase(state)IDLE:beginstate<=WAIT_1s;endWAIT_1s:beginif(count==count_max)beginstate<=SEND;endelse beginstate<=WAIT_1s;endendSEND:beginif(tx_count==6'd11)beginstate <= OVER;endelse beginstate <= SEND;endendOVER:beginstate <= IDLE;if(change_count<2'd1)beginchange_count<=change_count+2'd1;endelse if(change_count==2'd1)beginchange_count<=2'd0;endenddefault:state <= IDLE;endcaseendendendmodule

2.心率数据采集

module max13012_data(input           clk,input           rst_n,input           key_rst,input           key_data,input           uart_tx_done,input  [7:0]    uart_rx_data,input           uart_rx_done,output  reg     [7:0]   HEART_data_1,output  reg     [7:0]   HEART_data_2,output  reg     [7:0]   SPO2_data_1,output  reg     [7:0]   SPO2_data_2,output  reg             uart_tx_en,output  reg     [7:0]   uart_tx_data);parameter time_20ms         = 20'd1000000;parameter IDLE              = 8'd0;parameter RST               = 8'd1;parameter HEART             = 8'd2;parameter WAK_HEART         = 8'd3;parameter SPO2              = 8'd4;parameter WAK_SPO2          = 8'd5;parameter OVER              = 8'd6;//10��reg     [79:0]   cmd_RESET         ={8'h41,8'h54,8'h2B,8'h52,8'h45,8'h53,8'h45,8'h54,8'h0D,8'h0A};//"AT+RESET\r\n"reg     [79:0]   cmd_HEATR         ={8'h41,8'h54,8'h2B,8'h48,8'h45,8'h41,8'h52,8'h54,8'h0D,8'h0A};//"AT+HEART\r\n"//9��reg     [71:0]   cmd_SPO2          ={8'h41,8'h54,8'h2B,8'h53,8'h50,8'h4f,8'h32,8'h0D,8'h0A};//"AT+SPO2\r\n"reg     [7:0]    state;reg     [7:0]    tx_count;reg     [7:0]    rx_count;reg              uart_tx_en_temp;reg     [1:0]    tx_en_count;reg     [19:0]   wait_count;
//rx_Data always @(posedge clk or negedge rst_n) beginif(!rst_n) beginHEART_data_1 <= 8'd0;HEART_data_2 <= 8'd0;SPO2_data_1<=8'd0;SPO2_data_2<=8'd0;rx_count<=8'd0;endelse if(state==WAK_HEART)beginif(uart_rx_done==1'b1 && uart_rx_data==8'h3d && rx_count==8'd0)beginrx_count<=rx_count + 1'b1;endelse if(uart_rx_done==1'b1 && rx_count==8'd1)beginrx_count<=rx_count + 1'b1;HEART_data_1<=uart_rx_data;endelse if(uart_rx_done==1'b1 && rx_count==8'd2)beginrx_count<=rx_count + 1'b1;HEART_data_1<=uart_rx_data;endendelse if(state==WAK_SPO2)beginif(uart_rx_done==1'b1 && uart_rx_data==8'h3d && rx_count==8'd0)beginrx_count<=rx_count + 1'b1;endelse if(uart_rx_done==1'b1 && rx_count==8'd1)beginrx_count<=rx_count + 1'b1;SPO2_data_1<=uart_rx_data;endelse if(uart_rx_done==1'b1 && rx_count==8'd2)beginrx_count<=rx_count + 1'b1;SPO2_data_2<=uart_rx_data;endendelse beginHEART_data_1 <= HEART_data_1;HEART_data_2 <= HEART_data_2;SPO2_data_1<=SPO2_data_1;SPO2_data_2<=SPO2_data_2;rx_count<=8'd0;end endalways @(posedge clk or negedge rst_n) beginif(!rst_n) beginuart_tx_data <= 8'd0;endelse if((state==RST) && tx_count<8'd10 ) beginuart_tx_data <= cmd_RESET[79 - tx_count *8 -:8];endelse if((state==HEART) && tx_count<8'd10 ) beginuart_tx_data <= cmd_HEATR[79 - tx_count *8 -:8];endelse if((state==SPO2) && tx_count<8'd9 ) beginuart_tx_data <= cmd_SPO2[71 - tx_count *8 -:8];endelse beginuart_tx_data <= uart_tx_data;endend//����״̬tx_countalways @(posedge clk or negedge rst_n) beginif(!rst_n) begintx_count <= 8'd0;endelse if(state==RST || state==HEART || state==SPO2) beginif(uart_tx_done==1'd1)tx_count <= tx_count+1'b1;endelse begintx_count <= 8'd0;endend//tx_en timealways @(posedge clk or negedge rst_n) beginif(!rst_n) begintx_en_count <= 2'b0;endelse if((state==RST || state==HEART || state==SPO2) && tx_en_count<2'd1 && tx_count==8'd0) begintx_en_count <=tx_en_count+ 1'd1;endelse if((state==RST || state==HEART || state==SPO2) && tx_en_count==2'd1 && tx_count==8'd0) begintx_en_count <= 2'd3;endelse if(state==OVER || state==WAK_HEART || state==WAK_SPO2 || state==IDLE)begintx_en_count <= 2'd0;endelse begintx_en_count <= tx_en_count;end
end//����״̬data_tx_enalways @(posedge clk or negedge rst_n) beginif(!rst_n) beginuart_tx_en_temp <= 1'b0;uart_tx_en <= uart_tx_en_temp;endelse if((state==RST || state==HEART || state==SPO2 ) && tx_en_count==1) beginuart_tx_en_temp <= 1'b1;uart_tx_en <= uart_tx_en_temp;endelse if((state==RST || state==HEART ) && tx_count<8'd9 && uart_tx_done==1)beginuart_tx_en_temp <= 1'b1;uart_tx_en <= uart_tx_en_temp;endelse if((state==SPO2 ) && tx_count<8'd8 && uart_tx_done==1)beginuart_tx_en_temp <= 1'b1;uart_tx_en <= uart_tx_en_temp;endelse beginuart_tx_en_temp <= 1'b0;uart_tx_en <= uart_tx_en_temp;endendalways @(posedge clk or negedge rst_n) beginif(!rst_n) beginstate <= IDLE;endelse begincase(state)IDLE:beginif(key_rst)beginstate <= RST;endelse if(key_data)beginstate <= HEART;endendRST:beginif(tx_count==8'd10)beginstate <= IDLE;endelse beginstate <= RST;endendHEART:beginif(tx_count==8'd10)beginstate <= WAK_HEART;endelse beginstate <= HEART;endendWAK_HEART:beginif(wait_count==time_20ms)beginstate <= SPO2;endelse beginstate <= WAK_HEART;end      endSPO2:beginif(tx_count==8'd9)beginstate <= WAK_SPO2;endelse beginstate <= SPO2;endendWAK_SPO2:beginif(wait_count==time_20ms)beginstate <= OVER;endelse beginstate <= WAK_SPO2;end endOVER:beginstate <= IDLE;enddefault:state <= IDLE;endcaseend
end//wait timealways @(posedge clk or negedge rst_n) beginif(!rst_n) beginwait_count <= 20'd0;endelse if((state==WAK_HEART || state==WAK_SPO2) && wait_count<time_20ms)beginwait_count <= wait_count+20'd1;endelse if((state==WAK_HEART || state==WAK_SPO2) && wait_count==time_20ms)beginwait_count <= 20'd0;endendendmodule

总结

视频展示:

基于FPGA的血氧和心率蓝牙监测系统设计

相关文章:

基于FPGA的血氧和心率蓝牙监测系统设计-max30102

文章目录 前言一、芯片手册分析二、串口接口的血氧模块使用讲解三、仿真时序分析四、代码分析1.蓝牙数据发送2.心率数据采集 总结 前言 本产品的核心是基于心率传感器的智能心率监测系统&#xff0c;通过硬件端的心率传感器获取人体的心率和血氧浓度等信息&#xff0c;并进行实…...

华为首款鸿蒙电脑正式亮相,开启国产操作系统新篇章

5 月 8 日&#xff0c;华为在深圳举办鸿蒙电脑技术与生态沟通会&#xff0c;正式推出了备受瞩目的首款鸿蒙电脑&#xff0c;这一重大举措标志着国产操作系统在个人电脑&#xff08;PC&#xff09;领域实现了关键突破&#xff0c;为行业发展注入了新的活力。​ 历经五年打磨&…...

Docker部署常见应用之Superset

文章目录 使用 Docker 部署使用 Docker Compose 部署参考文章 以下是使用 Docker 部署 Superset 并将存储配置为 MySQL 的详细步骤&#xff1a; 使用 Docker 部署 获取Superset镜像: 使用Docker从官方仓库拉取Superset镜像&#xff1a;docker pull apache/superset:4.0.0创建 …...

触想CX-3588工控主板应用于移动AI数字人,赋能新型智能交互

一、行业发展背景 随着AI智能、自主导航和透明屏显示等技术的不断进步&#xff0c;以及用户对“拟人化”、“沉浸式”交互体验的期待&#xff0c;一种新型交互终端——“移动AI数字人”正在加速实现规模化商用。 各大展厅展馆、零售导购、教学政务甚至家庭场景中&#xff0c;移…...

关系代数操作之复杂扩展操作

除&#xff08;Division&#xff09; 定义&#xff1a;关系R为n度关系&#xff0c;关系S为m度关系&#xff0c;m<n,记作RS&#xff0c;关系是K&#xff08;n-m&#xff09;度关系 数学描述&#xff1a; 相当于&#xff08;RS&#xff09;*S在R中的元组 外连接&#xff08…...

STM32G070xx将Flash页分块方式存储,固定数据块存储,实现一次擦除多次写入

STM32G070xx将Flash页分块方式存储&#xff0c;固定数据块存储&#xff0c;实现一次擦除多次写入 参考例程例程说明一、存储区数据结构二、读取存储区数据三、写入存储区数据四、测试函数五、测试结果 参考例程 STM32G0xx使用LL库将Flash页分块方式存储数据实现一次擦除可多次…...

V4L2应用程序开发-- 控制流程

使用摄像头时&#xff0c;我们可以调整很多参数&#xff0c;比如&#xff1a; 对于视频流本身&#xff1a; 设置格式&#xff1a;比如V4L2_PIX_FMT_YUYV、V4L2_PIX_FMT_MJPEG、V4L2_PIX_FMT_RGB565 设置分辨率&#xff1a;1024*768等 对于控制部分&#xff1a; 调节亮度 调…...

《大数据技术之Scala》

这是一篇关于大数据技术中Scala语言的基础教程文章&#xff0c;主要介绍了Scala语言的发展历史、与Java的关系、语言特点、环境搭建、插件安装、编程基础、变量和数据类型、运算符、流程控制、函数式编程、面向对象编程、集合操作、模式匹配、异常处理、隐式转换和泛型等核心内…...

使用thymeleaf模版导出swagger3的word格式接口文档

1.pom配置 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.8.RELEASE</version></parent><properties><skipTests>true</skipTests&g…...

Android RecyclerView自带的OnFlingListener,Kotlin

Android RecyclerView自带的OnFlingListener&#xff0c;Kotlin Android启动应用时屏蔽RecyclerView滑动&#xff0c;延时后再允许滑动&#xff0c;Kotlin-CSDN博客 使用了GestureDetectorRecyclerView的setOnTouchListener检测用户的快滑fling事件。发现RecyclerView也自带了监…...

STM32+安信可Ai-WB2-12F连接阿里云物联网平台

第一步&#xff1a;在阿里云物联网平台创建设备 具体操作流程如下 第二步&#xff1a;生成个人client_id,用户名和密码 打开该软件sign.html 将刚才复制的信息粘贴进去 生成自己的client_id,用户名和密码 第三步&#xff1a;打开MQTTfx软件 电机connect旁边的配置&#xff0…...

Python实现中文数字与阿拉伯数字映射生成器(支持0-9999)

文章目录 1. 引言2. 需求分析‌3. 核心实现思路‌4. 完整代码实现‌ 1. 引言 在中文文本处理和自然语言处理(NLP)应用中&#xff0c;经常需要将中文数字转换为阿拉伯数字。本文将介绍如何使用Python根据用户从控制台输入的数字范围&#xff0c;生成相应的中文数字到阿拉伯数字…...

链表的面试题4之合并有序链表

这篇文章我们继续来讲链表中很经典的面试题&#xff1a;合并有序链表。 目录 迭代 递归 我们首先来看一下这张图片里面的要求&#xff0c;给你两个链表&#xff0c;要求把他们按照从小到大的方式排列。 这里涉及到几个问题&#xff0c;首先&#xff0c;我们的头节点是不是要…...

CTF - PWN之ORW记录

CTF - Pwn之ORW记录https://mp.weixin.qq.com/s/uiRtqCSopn6U6NqyKJ8I7Q...

mission planner烧录ardupilot固件报错死机

问题 烧录自己编译的固件&#xff0c;upload done成功后&#xff0c;又跳出以下提示 &#xff0c;返回重新烧录仍然报错 解决 先烧录官方稳定的固件然后使用mission planner连接&#xff0c;此时可能会反复识别串口&#xff0c;因为会死机反复重启&#xff0c;导致灯闪烁又…...

单片机嵌入式滤波算法库

kw_ucFiltering库说明 本科针对常用的滤波算法进行汇总&#xff0c;主要包括&#xff1a; 一阶滤波算法 平滑滤波 中位值滤波 限幅 卡尔曼滤波 截至目前&#xff08;20250508&#xff09;滤波算法持续更新中。 本库开源连接地址&#xff1a;gitee连接 一阶滤波算法实现 原理…...

CAS、CAS自旋、CAS自旋锁、CLH锁与Java AQS:深入理解并发编程核心机制

CAS、CAS自旋、CAS自旋锁、CLH锁与Java AQS&#xff1a;深入理解并发编程核心机制 1. CAS&#xff08;Compare and Swap&#xff09; 什么是CAS&#xff1f; CAS&#xff08;Compare and Swap&#xff09;是一种无锁&#xff08;Lock-Free&#xff09;的原子操作&#xff0c;…...

《运维那些事儿》专栏总目录(持续更新)

《运维那些事儿》专栏以Linux系统为基础&#xff0c;分享作者十年运维生涯中运用到的关键技术要点。本专栏涵盖消息中间件、数据中间件、数据库、虚拟化、Web服务器、高可用架构等运维工作中涉及到的相关内容&#xff0c;每周持续交叉更新一篇高质量技术博文。学生可用于了解、…...

鸿蒙NEXT开发动画案例4

1.创建空白项目 2.Page文件夹下面新建Spin.ets文件&#xff0c;代码如下&#xff1a; /*** TODO SpinKit动画组件 - 双粒子旋转缩放动画* author: CSDN-鸿蒙布道师* since: 2025/05/08*/ ComponentV2 export struct SpinFour {// 参数定义Require Param spinSize: number 36…...

【Linux学习笔记】基础IO之理解文件

【Linux学习笔记】基础IO之理解文件 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;Linux学习笔记 前言 哈喽&#xff0c;各位小伙伴大家好!上期我们讲了进程替换 今天我们讲的是基础IO之理解文件。话不多说&#xff0c;我们进入正题&#…...

动态计算el-table高度

form、搜索框、底部导航栏设置class <el-table :height"tableHeight" /> // 计算表格高度的计算属性 const tableHeight ref(0); proxy.toTableHeight((res)>{tableHeight.value res; });tableHeight.js import { nextTick } from vue;export fun…...

【Linux系列】目录大小查看

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

数据结构*二叉树

树 树是一种非线性数据结构。 这就是抽象的树的结构。 对于一棵树来说&#xff0c;有N个结点&#xff0c;就有N-1条边 其中有许多概念&#xff1a; 根结点&#xff1a;对于上图来说就是A 子树&#xff1a;就是结点下面分开的部分。例如&#xff1a;A的子树就是以B为根结点的…...

RESTful

一&#xff1a;简介 定义 &#xff08;1&#xff09;访问网络资源的格式 &#xff08;2&#xff09;优点 &#xff08;3&#xff09;区分操作 &#xff08;4&#xff09;注意事项...

人工智能的自动驾驶新纪元:端到端智能系统挑战与前沿探索方案

一、引言:从模块化到端到端的范式革命 (一)自动驾驶技术演进的三个时代 自动驾驶技术自诞生以来,经历了从机械化辅助到智能化决策的漫长演进。早期,以定速巡航为代表的 1.0 时代,仅实现了简单的速度控制,车辆仍需驾驶员全程主导操控。随着传感器与算法发展,进入 2.0 时…...

第四章 OpenCV篇—图像梯度与边缘检测—Python

目录 一.Sobel算子 二.Scharr算子与laplacian算子 三.Canny边缘检测 1.高斯滤波器 2.梯度和方向 3.非极大值抑制 4.双阈值检测 此章节主要讲解图像梯度计算方法和边缘检测算法&#xff0c;分别主要是&#xff1a;sobel算子、scharr与lapkacian算子、canny边缘检测流程。…...

幂等的几种解决方案以及实践

目录 什么是幂等&#xff1f; 解决幂等的常见解决方案&#xff1a; 唯一标识符案例 数据库唯一约束 案例 乐观锁案例 分布式锁&#xff08;Distributed Locking&#xff09; 实践精选方案 首先 为什么不直接使用分布式锁呢&#xff1f; 自定义实现幂等组件&#xff01…...

拥塞控制 流量控制 区别

对比项拥塞控制流量控制关注对象整个网络 是否过载接收方主机 是否处理不过来控制目标避免网络路由器、链路拥塞避免发送方发太快&#xff0c;接收方来不及处理发生原因网络中有太多数据包&#xff0c;引起排队、丢包接收方缓存能力有限实现方式基于网络状态动态调整发送速率基…...

AWS VPC架构师指南:从零设计企业级云网络隔离方案

一、VPC核心概念解析 1.1 核心组件 VPC&#xff1a;逻辑隔离的虚拟网络&#xff0c;可自定义IPv4/IPv6地址范围&#xff08;CIDR块&#xff09; 子网&#xff08;Subnet&#xff09;&#xff1a; 公有子网&#xff1a;绑定Internet Gateway&#xff08;IGW&#xff09;&#…...

[逆向工程]什么是DLL注入(二十二)

[逆向工程]什么是DLL注入&#xff08;二十二&#xff09; 引言 DLL注入&#xff08;DLL Injection&#xff09; 是Windows系统下一种重要的进程控制技术&#xff0c;广泛应用于软件调试、功能扩展、安全检测等领域。然而&#xff0c;它也是一把“双刃剑”——恶意软件常借此实…...

极简远程革命:节点小宝 — 无公网IP的极速内网穿透远程解决方案

极简远程革命&#xff1a;节点小宝&#xff0c;让家庭与职场无缝互联 ——打破公网桎梏&#xff0c;重塑数字生活新体验 关键词&#xff1a;节点小宝&#xff5c;内网穿透&#xff5c;P2P直连&#xff5c;家庭网络&#xff5c;企业协作&#xff5c;智能组网节点小宝&#xff5…...

Vue生命周期脚手架工程Element-UI

一 Vue2.x生命周期 每个vue实例再被创建时都要经过一系列的初始化过程&#xff1a; 创建实例 装载模板 渲染模板等等 vue为生命周期中的每个状态都设置了钩子函数&#xff08;监听函数&#xff09;。每个vue实例处于不同的生命周期时&#xff0c;对应的函数就会触发调用 https:…...

LeetCode[226] 翻转二叉树

思路&#xff1a; 使用递归&#xff0c;归根结底还是左右节点互相倒&#xff0c;那么肯定需要一个temp节点在中间传递&#xff0c;最后就是递归&#xff0c;没什么说的 代码&#xff1a; /*** Definition for a binary tree node.* public class TreeNode {* int …...

ConcurrentHashMap解析

ConcurrentHashMap解析 以下是对 Java 8 及以后版本 ConcurrentHashMap 源码的深入解析&#xff0c;涵盖其底层数据结构、并发控制机制、核心操作流程、扩容与迁移、树化/退化策略&#xff0c;以及性能特性。总体来说&#xff0c;ConcurrentHashMap 在 JDK 8 中摒弃了原有的 S…...

windows10 系统显示mov文件格式缩略图

最近做视频剪辑&#xff0c;有些mov格式文件&#xff0c;但是尝试用各种播放器默认播放&#xff0c;都没有缩略图可看&#xff0c; 很影响查看。 遂选择了个插件&#xff0c;来在windows10系统显示mov文件的缩略图。 1.下载安装 K-Lite Codec Pack &#xff08;安装时一路Ne…...

力扣智慧思想小题,目录力扣.跳跃游戏(思想很重要)力扣.跳跃游戏II(还是思想)力扣.分发糖果力扣151.反转字符串中的单词力扣.轮转数组

目录 力扣.跳跃游戏(思想很重要) 力扣.跳跃游戏II&#xff08;还是思想) 力扣.分发糖果 力扣151.反转字符串中的单词 力扣.轮转数组 字符 a97 A65; JRE:Java运行时候的环境 JDK: JAVA开发套件(工具包) java原本是.java文件&#xff0c;编译成.class字节码文件 八种基本数据…...

【LangChain基础系列】深入全面掌握文本分类

文本分类是自然语言处理领域中的一个重要任务,旨在将文本数据自动归类到预定义的类别中。它是实现信息检索、智能推荐、情感分析等应用的基础技术之一。 应用场景 1. 垃圾邮件过滤 &#xff1a;自动识别并过滤垃圾邮件。 2. 情感分析 &#xff1a;分析用户评论或社交媒体内容…...

AI赋能高频PCB信号完整性优化

在5G通信、自动驾驶、卫星导航等高频技术快速迭代的今天&#xff0c;**信号完整性&#xff08;SI&#xff09;**已成为高频PCB设计的核心挑战。如何在高密度布线、复杂电磁环境中实现信号的精准传输&#xff1f;猎板PCB通过**AI驱动设计优化**、**材料与工艺创新**以及**智能化…...

如何从播放器构造角度研究 Media3 源码

Jetpack Media3 是 Android 提供的现代化媒体播放库。 Media3 的核心组件包括&#xff1a; ExoPlayer&#xff1a;播放器核心&#xff0c;负责协调媒体播放。MediaSource&#xff1a;定义媒体来源&#xff08;如 DASH、HLS、Progressive&#xff09;。TrackSelector&#xff…...

大模型深度思考与ReAct思维方式对比

大模型的「深度思考」与「ReAct思维方式」虽然都涉及复杂推理过程&#xff0c;但并非完全等同的概念。它们在目标、机制和应用场景上存在显著差异&#xff0c;以下是具体分析&#xff1a; 一、概念本质差异 深度思考&#xff08;Deep Reasoning&#xff09; 定义&#xff1a;泛…...

视频编解码学习六之视频采集和存储

视频采集的核心原理是用光学元件&#xff08;如摄像头&#xff09;将光信号转换为电信号进行传输和存储。 摄像头的主要功能是将光学图像转换为电信号&#xff08;模拟或数字&#xff09;&#xff0c;核心流程如下&#xff1a; 1. 光学成像 镜头组&#xff1a;聚焦光线到感光…...

Linux开发工具【中】

目录 一、vim 1.1 插入模式 1.2 底行模式 1&#xff09;set nu 2&#xff09;set nonu 3&#xff09; /XXX n 4&#xff09;&#xff01;command 5&#xff09;vs other 1.3 补充 1&#xff09; 批量化操作 2&#xff09;批量化替换 : 3&#xff09;快速定位&am…...

Django之账号登录及权限管理

账号登录及权限管理 目录 1.登录功能 2.退出登录 3.权限管理 4.代码展示合集 这篇文章, 会讲到如何实现账号登录。账号就是我们上一篇文章写的账号管理功能, 就使用那里面已经创建好的账号。这一次登录, 我们分为三种角色, 分别是员工, 领导, 管理员。不同的角色, 登录进去…...

深度学习Y7周:YOLOv8训练自己数据集

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、配置环境 1.官网下载源码 2.安装需要环境 二、准备好自己的数据 目录结构&#xff1a; 主目录 data images&#xff08;存放图片&#xff09; annotati…...

2025年渗透测试面试题总结-某服面试经验分享(附回答)(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 1. 协议类型 2. OSI七层模型 3. 网络层协议 4. HTTP请求头 5. 常见端口 6. 中间件解析漏洞 7. CS…...

手写Promise的静态方法

最近对promise原理的理解&#xff0c;手写下其中的静态方法。 手写Promise的静态方法 1. Promise.resolve2. Promise.reject3. Promise.all4. Promise.any5. Promise.race6. Promise.allSettled 1. Promise.resolve 首先就是resolve方法&#xff0c;它会接收一个值&#xff0…...

Python Cookbook-7.8 使用 Berkeley DB 数据库

任务 你想将一些数据做持久化处理&#xff0c;而且也想体验一下BerkeleyDB数据库的简洁和高效。 解决方案 如果以前在你的计算机中安装过 BerkeleyDB&#xff0c;Python标准库附带的bsddb包(以及可选的 bsddb3&#xff0c;用于访间Berkeley DBrelease 3.2数据库)可以被用来作…...

云手机虚拟地址技术的运营场景

云手机虚拟地址技术通过模拟地理位置&#xff08;GPS/IP地址&#xff09;与设备指纹&#xff0c;结合云端虚拟化能力&#xff0c;在多个商业场景中实现突破性应用。以下是其核心运营场景及技术实现路径的深度解析&#xff1a; 一、跨境电商与区域化运营 本地化合规与流量突破 目…...

操作符详解(2)

目录 9 结构成员访问操作符 9.1.2 结构体变量的定义和初始化 9.2 结构体成员的直接访问 10 操作符的属性&#xff1a;优先级、结合性 10.1 优先级 11 表达式求值 11.1 整型提升 11.2 算术转换 11.3 问题表达式解析 11.3.1 表达式1 11.3.2 表达式2 11.3.3 表达式3 1…...

责任链设计模式

一、核心接口定义 MyAbstractChainHandler<T> 接口继承自 Ordered 接口&#xff0c;用于实现链式处理逻辑。 import org.springframework.core.Ordered;public interface MyAbstractChainHandler<T> extends Ordered {void handle(T requestParam);String getCha…...