ESP32学习笔记(52)————三轴加速度ADXL345使用(SPI方式)

一、简介

ADXL345 是一款 ADI 公司推出的基于 iMEMS 技术的超低功耗3轴加速度计,分辨率高(13位),测量范围达 ±16g。数字输出数据为 16 位二进制补码格式,可通过 SPI(3线或4线)I2C 数字接口访问。ADXL345 非常适合移动设备应用。它可以在倾斜检测应用中测量静态重力加速度,还可以测量运动或冲击导致的动态加速度。其高分辨率(3.9mg/LSB),能够测量不到 1.0° 的倾斜角度变化。

该器件提供多种特殊检测功能。活动和非活动检测功能通过比较任意轴上的加速度与用户设置的阈值来检测有无运动发生。敲击检测功能可以检测任意方向的单振和双振动作。自由落体检测功能可以检测器件是否正在掉落。这些功能可以独立映射到两个中断输出引脚中的一个。正在申请专利的集成式存储器管理系统采用一个32级先进先出(FIFO)缓冲器,可用于存储数据,从而将主机处理器负荷降至最低,并降低整体系统功耗。低功耗模式支持基于运动的智能电源管理,从而以极低的
功耗进行阈值感测和运动加速度测量。

官方数据手册:https://pan.baidu.com/s/1-UCkno6kQFugSy8NEhNhHg?pwd=tp7p 提取码:tp7p

二、硬件连接

功能口引脚
MISO17
MOSI18
SCLK20
CS19

三、添加SPI驱动

查看 ESP32学习笔记(19)——SPI(主机)接口使用

四、SPI通信注意事项

4.1 SPI模式

一般内置 SPI 功能的单片机上,都有两个寄存器配置位 CPOL 和 CPHA。
CPOL 就是决定 SCLK 这个时钟信号线,在没有数据传输的时候的电平状态。
CPHA 就是决定数据位传输是从第一个时钟 (SCLK) 边沿开始,还是第二个从二个时钟 (SCLK) 边沿开始。
因此 CPOL 和 CPHA 合体就形成了SPI四种模式。

  • 模式0(CPOL=0,CPHA=0)
    CPOL = 0:空闲时是低电平,第1个跳变沿是上升沿,第2个跳变沿是下降沿
    CPHA = 0:数据在第1个跳变沿(上升沿)采样

  • 模式1(CPOL=0,CPHA=1)
    CPOL = 0:空闲时是低电平,第1个跳变沿是上升沿,第2个跳变沿是下降沿
    CPHA = 1:数据在第2个跳变沿(下降沿)采样

  • 模式2(CPOL=1,CPHA=0)
    CPOL = 1:空闲时是高电平,第1个跳变沿是下降沿,第2个跳变沿是上升沿
    CPHA = 0:数据在第1个跳变沿(下降沿)采样

  • 模式3(CPOL=1,CPHA=1)
    CPOL = 1:空闲时是高电平,第1个跳变沿是下降沿,第2个跳变沿是上升沿
    CPHA = 1:数据在第2个跳变沿(上升沿)采样

查看ADXL345中文数据手册第15页,得知ADXL345 SPI模式应为 模式3(CPOL=1,CPHA=1)

4.2 SPI读写以及多字节读取指令的区别

查看ADXL345中文数据手册第14、15页,得知读的时候,地址的最高位为1;写的时候,地址的最高位为0;在进行多字节读取的时候,次高位为1,这样才可以多字节写和读

4.3 SPI时钟要求

查看ADXL345中文数据手册第14页,得知在设置读取速率的时候,要和SPI的时钟匹配起来,否则可能读到错误的数据,比如设置1600HZ,SPI时钟要大于2MHZ。SPI读取数据时钟最大5MHZ

4.4 器件ID寄存器

查看ADXL345中文数据手册第23页,得知寄存器0x00保存0xE5的固定器件ID代码,可用于校验SPI是否通信成功

五、移植文件

5.1 board_spi.c

#include <math.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"#include "board_spi.h"
#include "board_adxl345.h"static void delayMs(uint32_t time);void ADXL345_Init(void)
{ADXL345_SPI_Init();while(ADXL345_GetDeviceId() != 0xE5){printf("ADXL345 Init Fail!\n");delayMs(1000);}ADXL345_WriteReg(DATA_FORMAT, 0x0B);    // 13位全分辨率,输出数据右对齐,16g量程ADXL345_WriteReg(BW_RATE, 0x0A);        // 数据输出速度为100HzADXL345_WriteReg(POWER_CTL, 0x08);      // 无链接,测量模式ADXL345_WriteReg(INT_ENABLE, 0x80);     // DATA_READY中断printf("ADXL345 Init Success!\n");
}uint8_t ADXL345_GetDeviceId(void)
{uint8_t ret = ADXL345_ReadReg(DEVICE_ID);return ret;
}void ADXL345_ReadXYZ(short *x, short *y, short *z)
{uint8_t x0,y0,z0;uint8_t x1,y1,z1;x0 = ADXL345_ReadReg(DATA_X0);y0 = ADXL345_ReadReg(DATA_Y0);z0 = ADXL345_ReadReg(DATA_Z0);x1 = ADXL345_ReadReg(DATA_X1);y1 = ADXL345_ReadReg(DATA_Y1);z1 = ADXL345_ReadReg(DATA_Z1);// printf("--------------x0:%d,y0:%d,z0:%d\tx1:%d,y1:%d,z1:%d", x0,y0,z0,x1,y1,z1);*x = (short)(((uint16_t)x1 << 8) + x0); // DATA_X1为高位有效字节*y = (short)(((uint16_t)y1 << 8) + y0); // DATA_Y1为高位有效字节*z = (short)(((uint16_t)z1 << 8) + z0); // DATA_Z1为高位有效字节// printf("--------------x%d,y%d,z%d",*x,*y,*z);
}/*读取ADXL345的数据并做滤波处理,读times次再取平均值*/
void ADXL345_ReadAverage(short *x, short *y, short *z, uint8_t times)
{if(0 == times){return;}uint8_t i;short x_temp,y_temp,z_temp;*x = 0;*y = 0;*z = 0;for(i = 0; i < times; i++){ADXL345_ReadXYZ(&x_temp, &y_temp, &z_temp);*x += x_temp;*y += y_temp;*z += z_temp;delayMs(5);}*x /= times;*y /= times;*z /= times;
}/*使用偏移寄存器,进行偏移校准*/
void ADXL345_AutoAdjust(void)
{uint8_t i;short x_temp,y_temp,z_temp;short x_offset = 0;short y_offset = 0;short z_offset = 0;char x_calib = 0;char y_calib = 0;char z_calib = 0;ADXL345_WriteReg(DATA_FORMAT, 0x0B);    // 13位全分辨率,输出数据右对齐,16g量程ADXL345_WriteReg(BW_RATE, 0x0A);        // 数据输出速度为100HzADXL345_WriteReg(POWER_CTL, 0x08);      // 无链接,测量模式ADXL345_WriteReg(INT_ENABLE, 0x80);     // DATA_READY中断delayMs(12);for(i = 0; i < 10; i++){ADXL345_ReadAverage(&x_temp, &y_temp, &z_temp, 10);x_offset += x_temp;y_offset += y_temp;z_offset += z_temp;}x_offset /= 10;y_offset /= 10;z_offset /= 10;x_calib =- x_offset / 4;y_calib =- y_offset / 4;z_calib =- (z_offset - 256) / 4;ADXL345_WriteReg(OFSX, x_calib);ADXL345_WriteReg(OFSY, y_calib);ADXL345_WriteReg(OFSZ, z_calib);
}/*计算ADXL345角度,x/y/表示各方向上的加速度分量,dir表示要获得的角度*/
short ADXL345_GetAngle(float x, float y, float z, uint8_t dir)
{float temp;float res = 0;	                        // 弧度值switch(dir){case 0:                             // 0表示与Z轴的角度temp = sqrt((x*x + y*y)) / z;res = atan(temp);break;case 1:                             // 1表示与X轴的角度temp = x / sqrt((y*y + z*z));res = atan(temp);break;case 2:                             // 2表示与Y轴的角度temp = y / sqrt((x*x + z*z));res = atan(temp);break;}return res * 180 / 3.14;                // 返回角度值// return res*180/3.14*10;      //乘以10是为了取一位小数,角度精确到0.1°所以要乘以10
}/**@brief 写寄存器@param addr -[in] 寄存器地址@param data -[in] 写入数据@return 无
*/
void ADXL345_WriteReg(uint8_t addr, uint8_t data)
{uint8_t send_data[2];uint32_t size = 2;addr &= 0x3F;send_data[0] = addr;send_data[1] = data;SPI_CS_LOW;ADXL345_SPI_Write(send_data, size);SPI_CS_HIGH;
}/**@brief 读寄存器@param addr -[in] 寄存器地址@return 读出一字节数据
*/
uint8_t ADXL345_ReadReg(uint8_t addr)
{uint8_t receive_data;uint32_t size = 1;addr &= 0x3F;addr |= 0x80;SPI_CS_LOW;ADXL345_SPI_Write(&addr, size);ADXL345_SPI_Read(&receive_data, size);SPI_CS_HIGH;return receive_data;
}/**@brief 毫秒级延时函数@param time -[in] 延时时间(毫秒)@return 无
*/
static void delayMs(uint32_t time)
{vTaskDelay(time / portTICK_PERIOD_MS);
}

5.2 board_spi.h

#ifndef _BOARD_SPI_H_
#define _BOARD_SPI_H_/********************************************************************** INCLUDES*/
#include <stdint.h>
#include "driver/gpio.h"/********************************************************************** DEFINITIONS*/
#define ADXL345_SPI_MISO_PIN        GPIO_NUM_19
#define ADXL345_SPI_MOSI_PIN        GPIO_NUM_23
#define ADXL345_SPI_SCLK_PIN        GPIO_NUM_18
#define ADXL345_SPI_CS_PIN          GPIO_NUM_5#define DMA_CHAN                	2#define SPI_CS_LOW              	ADXL345_SPI_CS_Set(0)
#define SPI_CS_HIGH             	ADXL345_SPI_CS_Set(1)/********************************************************************** API FUNCTIONS*/
void ADXL345_SPI_Init(void);
void ADXL345_SPI_Write(uint8_t *pData, uint32_t dataLen);
void ADXL345_SPI_Read(uint8_t *pData, uint32_t dataLen);
void ADXL345_SPI_CS_Set(uint8_t level);#endif /* _BOARD_SPI_H_ */

5.3 board_adxl345.c

#include <math.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"#include "board_spi.h"
#include "board_adxl345.h"static void delayMs(uint32_t time);void ADXL345_Init(void)
{ADXL345_SPI_Init();while(ADXL345_GetDeviceId() != 0xE5){printf("ADXL345 Init Fail!\n");delayMs(1000);}ADXL345_WriteReg(DATA_FORMAT, 0x0B);    // 13位全分辨率,输出数据右对齐,16g量程ADXL345_WriteReg(BW_RATE, 0x0A);        // 数据输出速度为100HzADXL345_WriteReg(POWER_CTL, 0x08);      // 无链接,测量模式ADXL345_WriteReg(INT_ENABLE, 0x80);     // DATA_READY中断printf("ADXL345 Init Success!\n");
}uint8_t ADXL345_GetDeviceId(void)
{uint8_t ret = ADXL345_ReadReg(DEVICE_ID);return ret;
}void ADXL345_ReadXYZ(short *x, short *y, short *z)
{uint8_t x0,y0,z0;uint8_t x1,y1,z1;x0 = ADXL345_ReadReg(DATA_X0);y0 = ADXL345_ReadReg(DATA_Y0);z0 = ADXL345_ReadReg(DATA_Z0);x1 = ADXL345_ReadReg(DATA_X1);y1 = ADXL345_ReadReg(DATA_Y1);z1 = ADXL345_ReadReg(DATA_Z1);// printf("--------------x0:%d,y0:%d,z0:%d\tx1:%d,y1:%d,z1:%d", x0,y0,z0,x1,y1,z1);*x = (short)(((uint16_t)x1 << 8) + x0); // DATA_X1为高位有效字节*y = (short)(((uint16_t)y1 << 8) + y0); // DATA_Y1为高位有效字节*z = (short)(((uint16_t)z1 << 8) + z0); // DATA_Z1为高位有效字节// printf("--------------x%d,y%d,z%d",*x,*y,*z);
}/*读取ADXL345的数据并做滤波处理,读times次再取平均值*/
void ADXL345_ReadAverage(short *x, short *y, short *z, uint8_t times)
{if(0 == times){return;}uint8_t i;short x_temp,y_temp,z_temp;*x = 0;*y = 0;*z = 0;for(i = 0; i < times; i++){ADXL345_ReadXYZ(&x_temp, &y_temp, &z_temp);*x += x_temp;*y += y_temp;*z += z_temp;delayMs(5);}*x /= times;*y /= times;*z /= times;
}/*使用偏移寄存器,进行偏移校准*/
void ADXL345_AutoAdjust(void)
{uint8_t i;short x_temp,y_temp,z_temp;short x_offset = 0;short y_offset = 0;short z_offset = 0;char x_calib = 0;char y_calib = 0;char z_calib = 0;ADXL345_WriteReg(DATA_FORMAT, 0x0B);    // 13位全分辨率,输出数据右对齐,16g量程ADXL345_WriteReg(BW_RATE, 0x0A);        // 数据输出速度为100HzADXL345_WriteReg(POWER_CTL, 0x08);      // 无链接,测量模式ADXL345_WriteReg(INT_ENABLE, 0x80);     // DATA_READY中断delayMs(12);for(i = 0; i < 10; i++){ADXL345_ReadAverage(&x_temp, &y_temp, &z_temp, 10);x_offset += x_temp;y_offset += y_temp;z_offset += z_temp;}x_offset /= 10;y_offset /= 10;z_offset /= 10;x_calib =- x_offset / 4;y_calib =- y_offset / 4;z_calib =- (z_offset - 256) / 4;ADXL345_WriteReg(OFSX, x_calib);ADXL345_WriteReg(OFSY, y_calib);ADXL345_WriteReg(OFSZ, z_calib);
}/*计算ADXL345角度,x/y/表示各方向上的加速度分量,direction表示要获得的角度*/
short ADXL345_GetAngle(float x, float y, float z, uint8_t direction)
{float temp;float res = 0;	                        // 弧度值switch(direction){case 0:                             // 0表示与Z轴的角度temp = sqrt((x*x + y*y)) / z;res = atan(temp);break;case 1:                             // 1表示与X轴的角度temp = x / sqrt((y*y + z*z));res = atan(temp);break;case 2:                             // 2表示与Y轴的角度temp = y / sqrt((x*x + z*z));res = atan(temp);break;}return res * 180 / 3.14;                // 返回角度值// return res*180/3.14*10;      //乘以10是为了取一位小数,角度精确到0.1°所以要乘以10
}/**@brief 写寄存器@param addr -[in] 寄存器地址@param data -[in] 写入数据@return 无
*/
void ADXL345_WriteReg(uint8_t addr, uint8_t data)
{uint8_t send_data[2];uint32_t size = 2;addr &= 0x3F;send_data[0] = addr;send_data[1] = data;SPI_CS_LOW;ADXL345_SPI_Write(send_data, size);SPI_CS_HIGH;
}/**@brief 读寄存器@param addr -[in] 寄存器地址@return 读出一字节数据
*/
uint8_t ADXL345_ReadReg(uint8_t addr)
{uint8_t receive_data;uint32_t size = 1;addr &= 0x3F;addr |= 0x80;SPI_CS_LOW;ADXL345_SPI_Write(&addr, size);ADXL345_SPI_Read(&receive_data, size);SPI_CS_HIGH;return receive_data;
}/**@brief 毫秒级延时函数@param time -[in] 延时时间(毫秒)@return 无
*/
static void delayMs(uint32_t time)
{vTaskDelay(time / portTICK_PERIOD_MS);
}

5.4 board_adxl345.h

#ifndef _BOARD_ADXL345_H_
#define _BOARD_ADXL345_H_#ifdef __cplusplus
extern "C"
{
#endif#include <stdint.h>#define DEVICE_ID		0X00 	// 器件ID,0XE5
#define THRESH_TAP		0X1D   	// 敲击阀值寄存器
#define OFSX			0X1E
#define OFSY			0X1F
#define OFSZ			0X20
#define DUR				0X21
#define Latent			0X22
#define Window  		0X23
#define THRESH_ACT		0X24	// 运动阈值寄存器
#define THRESH_INACT	0X25 	// 静止阈值寄存器
#define TIME_INACT		0X26	// 静止时间			比例1 sec /LSB
#define ACT_INACT_CTL	0X27	// 启用运动/静止检测
#define THRESH_FF		0X28	// 自由下落阈值	建议采用300 mg与600 mg(0x05至0x09)之间的值 比例62.5 mg/LSB
#define TIME_FF			0X29 	// 自由下落时间	建议采用100 ms与350 ms(0x14至0x46)之间的值 比例5ms/LSB
#define TAP_AXES		0X2A
#define ACT_TAP_STATUS  0X2B
#define BW_RATE			0X2C
#define POWER_CTL		0X2D
#define INT_ENABLE		0X2E	// 设置中断配置
#define INT_MAP			0X2F
#define INT_SOURCE  	0X30
#define DATA_FORMAT	    0X31
#define DATA_X0			0X32
#define DATA_X1			0X33
#define DATA_Y0			0X34
#define DATA_Y1			0X35
#define DATA_Z0			0X36
#define DATA_Z1			0X37
#define FIFO_CTL		0X38
#define FIFO_STATUS		0X39#define Z_AXIS          0
#define X_AXIS          1
#define Y_AXIS          2void ADXL345_Init(void);
uint8_t ADXL345_GetDeviceId(void);
void ADXL345_ReadXYZ(short *x, short *y, short *z);
void ADXL345_ReadAverage(short *x, short *y, short *z, uint8_t times);
short ADXL345_GetAngle(float x, float y, float z, uint8_t direction);
void ADXL345_WriteReg(uint8_t addr, uint8_t data);
uint8_t ADXL345_ReadReg(uint8_t addr);#ifdef __cplusplus
}
#endif#endif /* _BOARD_ADXL345_H_ */

六、初始化流程

开机先等待 1.1ms——>设置数据格式——>设置功耗模式——>使能相应中断——>结束。

七、角度值转换公式

八、API调用

需包含头文件 board_adxl345.h

ADXL345_Init

功能ADXL345的初始化函数
函数定义void ADXL345_Init(void)
参数
返回

ADXL345_GetDeviceId

功能检查SPI通信,返回值为0xE5则通信正常
函数定义uint8_t ADXL345_GetDeviceId(void)
参数
返回固定器件ID值,0xE5

ADXL345_ReadXYZ

功能读取X、Y、Z轴加速度值
函数定义void ADXL345_ReadXYZ(short *x, short *y, short *z)
参数要读取的方向X,Y,Z轴返回值
返回

ADXL345_GetAngle

功能读取角度
函数定义short ADXL345_GetAngle(float x, float y, float z, uint8_t direction)
参数x,y,z:X、Y、Z轴加速度值
direction:要读取的方向X,Y,Z轴
返回角度数

九、使用例子

1)添加头文件

#include "board_adxl345.h"

2)添加初始化代码(main.c的main函数中)
首先调用 ADXL345_SPI_Init() 初始化 SPI 通信,最后调用 ADXL345_Init() 初始化加速度传感器模块功能。

#include <stdio.h>
#include <stdbool.h>
#include <unistd.h>void app_main(void)
{ADXL345_Init();/*-------------------------- 创建线程 ---------------------------*/xTaskCreate(monitor_task, "monitor_task", 2048, NULL, 4, NULL);
}

3)添加任务,定时读取数据

static void monitor_task(void *arg)
{while(1)                                                                // 任务都是一个无限循环,不能返回{short x_value,y_value,z_value;short x_angle,y_angle,z_angle;ADXL345_ReadAverage(&x_value, &y_value, &z_value, 10);x_angle = ADXL345_GetAngle(x_value, y_value, z_value, X_AXIS);y_angle = ADXL345_GetAngle(x_value, y_value, z_value, Y_AXIS);z_angle = ADXL345_GetAngle(x_value, y_value, z_value, Z_AXIS);printf("x_ang:%d y_ang:%d z_ang:%d\n", x_angle, y_angle, z_angle);vTaskDelay(1000 / portTICK_PERIOD_MS);                                                        // 1s}
}

4)查看打印

十、测量方向


• 由 Leung 写于 2023 年 8 月 7 日

• 参考:STC8H开发(六): SPI驱动ADXL345三轴加速度检测模块
    STM32 HAL库学习笔记-(SPI驱动ADXL345)
    STM32CubeMX系列|ADXL345传感器
    ADXL345 三轴加速度数据SPI读取、多字节读取、DMA SPI读取和FIFO数据读取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/27347.shtml

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

相关文章

电商数据获取:网络爬虫还是付费数据接口?

随着电商行业的迅速发展&#xff0c;对电商数据的需求也越来越大。在获取电商数据时&#xff0c;常常面临一个选择&#xff1a;是自己编写网络爬虫进行数据爬取&#xff0c;还是使用现有的付费数据接口呢&#xff1f;本文将从成本、可靠性、数据质量等多个角度进行分析&#xf…

揭示CTGAN的潜力:利用生成AI进行合成数据

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可编辑的3D应用场景 我们都知道&#xff0c;GAN在生成非结构化合成数据&#xff08;如图像和文本&#xff09;方面越来越受欢迎。然而&#xff0c;在使用GAN生成合成表格数据方面所做的工作很少。合成数据具有许多好处&#x…

排序第二课【选择排序】直接选择排序 与 堆排序

目录 1. 排序的概念&#xff1a; 2.选择排序的基本思想 3.直接选择排序 4.堆排序 1. 排序的概念&#xff1a; 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xf…

Gof23设计模式之享元模式

1.定义 运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销&#xff0c;从而提高系统资源的利用率。 2.结构 享元&#xff08;Flyweight &#xff09;模式中存在以下两种状态&#xff1a; 内…

vue+iviewUi+oss直传阿里云上传文件

前端实现文件上传到oss&#xff08;阿里云&#xff09;适用于vue、react、uni-app&#xff0c;获取视频第一帧图片 用户获取oss配置信息将文件上传到阿里云&#xff0c;保证了安全性和减轻服务器负担。一般文件资源很多直接上传到服务器会加重服务器负担此时可以选择上传到oss&…

SpringBoot容器--注解的使用

文章目录 容器功能--注解Spring 注入组件的注解Component、Controller、Service、Repository案例演示 Configuration应用实例传统方式应用实例使用SpringBoot 的Configuration 添加/注入组件 Configuration 注意事项和细节 Import应用实例 ConditionalConditional 介绍应用实例…

VSCode配置SSH远程免密登录服务器

VScode远程开发时&#xff0c;每次都需要输入密码&#xff0c;其实同理可以和其他应用类似配置免密登录&#xff0c;流程也类似。 1.在本地主机生成公钥和秘钥 ssh-keygen 2.将公钥内容添加至服务器 将生成钥对时会给出其保存路径&#xff0c;找到公钥&#xff0c;复制内容&am…

最小二乘拟合二维直线

目录 1. 原理概述2. python实现3. matlab实现4. C实现 爬虫网站自重。 1. 原理概述 平面直线的表达式为&#xff1a; y k x b (1) ykxb \tag{1} ykxb(1)   假设有 n n n个点 ( x i , y i ) &#xff08; 0 ≤ i < n &#xff09; (x_i, y_i)&#xff08;0≤i<n&…

一起来看看 Compose Accompanist

好久不见&#xff0c;真的挺久了&#xff0c;之前一个月写的文章比现在多半年的都多。今年第一篇文章是简单写了下 Android 14 的适配&#xff1a;Android 14 又来了&#xff1f;别扶&#xff01;抬起我来吧&#xff01; 今天咱们来一起看看 Compose Accompanist 吧&#xff0…

docker菜谱

DockerHub&#xff1a;https://hub.docker.com/ 记录docker常用软件安装&#xff0c;欢迎大家投稿。&#x1f60e;&#x1f60e;&#x1f60e; 文章目录 1. Redis 1. Redis 1、下载redis镜像&#xff1a; docker pull redis:6.2.8 docker pull redis:7.0.02、启动容器&#x…

DAY02_Spring—第三方资源配置管理Spring容器Spring注解开发Spring整合Mybatis和Junit

目录 一 第三方资源配置管理1 管理DataSource连接池对象问题导入1.1 管理Druid连接池1.2 管理c3p0连接池 2 加载properties属性文件问题导入2.1 基本用法2.2 配置不加载系统属性2.3 加载properties文件写法 二 Spring容器1 Spring核心容器介绍问题导入1.1 创建容器1.2 获取bean…

sigmoid ReLU 等激活函数总结

sigmoid ReLU sigoid和ReLU对比 1.sigmoid有梯度消失问题&#xff1a;当sigmoid的输出非常接近0或者1时&#xff0c;区域的梯度几乎为0&#xff0c;而ReLU在正区间的梯度总为1。如果Sigmoid没有正确初始化&#xff0c;它可能在正区间得到几乎为0的梯度。使模型无法有效训练。 …

TCP和UDP

目录 TCP和UDP是什么&#xff1f; TCP和UDP有什么区别? 三次握手和四次挥手 TCP维护可靠的通信方式 拥塞控制 滑动窗口的原理 什么是粘包以及粘包的原因 粘包的处理方式 TCP和UDP使用场景 TCP和UDP是什么&#xff1f; TCP&#xff1a; 传输控制协议&#xff08;TCP&am…

HarmonyOS元服务开发实践:桌面卡片字典

一、项目说明 1.DEMO创意为卡片字典。 2.不同卡片显示不同内容&#xff1a;微卡、小卡、中卡、大卡&#xff0c;根据不同卡片特征显示同一个字的不同内容&#xff0c;基于用户习惯可选择喜欢的卡片。 3.万能卡片刷新&#xff1a;用户点击卡片刷新按钮查看新内容&#xff0c;同时…

Java课题笔记~ AspectJ 的开发环境(掌握)

AspectJ 的开发环境(掌握) &#xff08;1&#xff09; maven 依赖 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></depe…

深度学习和OpenCV的对象检测(MobileNet SSD图像识别)

基于深度学习的对象检测时,我们主要分享以下三种主要的对象检测方法: Faster R-CNN(后期会来学习分享)你只看一次(YOLO,最新版本YOLO3,后期我们会分享)单发探测器(SSD,本节介绍,若你的电脑配置比较低,此方法比较适合R-CNN是使用深度学习进行物体检测的训练模型; 然而,…

项目实战 — 消息队列(4){消息持久化}

目录 一、消息存储格式设计 &#x1f345; 1、queue_data.txt&#xff1a;保存消息的内容 &#x1f345; 2、queue_stat.txt&#xff1a;保存消息的统计信息 二、消息序列化 三、自定义异常类 四、创建MessageFileManger类 &#x1f345; 1、约定消息文件所在的目录和文件名…

探索CSS计数器:优雅管理网页元素的计数与序号

113. 探索CSS计数器&#xff1a;优雅管理网页元素的计数与序号 在前端开发中&#xff0c;我们经常需要对网页元素进行计数与序号&#xff0c;如有序列表、表格行号、步骤指示等。为了优雅地管理这些计数与序号&#xff0c;CSS提供了一种强大的功能&#xff1a;CSS计数器&#…

掌握 JVM 调优命令

常用命令 1、jps查看当前 java 进程2、jinfo实时查看和调整 JVM 配置参数3、jstat查看虚拟机统计信息4、jstack查看线程堆栈信息5、jmap查看堆内存的快照信息 JVM 日常调优总结起来就是&#xff1a;首先通过 jps 命令查看当前进程&#xff0c;然后根据 pid 通过 jinfo 命令查看…

MemFire教程|FastAPI+MemFire Cloud+LangChain开发ChatGPT应用-Part2

基本介绍 上篇文章我们讲解了使用FastAPIMemFire CloudLangChain进行GPT知识库开发的基本原理和关键路径的代码实现。目前完整的实现代码已经上传到了github&#xff0c;感兴趣的可以自己玩一下&#xff1a; https://github.com/MemFire-Cloud/memfirecloud-qa 目前代码主要…