BMP280气压传感器详解(STM32)

目录

一、介绍

二、传感器原理

1.原理图

2.引脚描述

3.传感器数据获取流程

三、程序设计

main.c文件

bmp280.h文件

bmp280.c文件

四、实验效果 

五、资料获取

项目分享


一、介绍

        BMP280是一款基于博世公司APSM工艺的小封装低功耗数字复合传感器,它可以测量环境温度和大气压强。气压敏感元件是一个低噪高精度高分辨率绝对大气压力压电式感应元件;温度感测元件具有低噪高分辨率特性,温度值可以对气压进行温度补偿自校正。

以下是BMP280气压传感器的参数:

供电电压 

DC:1.7~3.6V

温度测量范围

0~65

气压测量范围

300~1100hPa(百帕斯卡)

气压测量误差

±1hPa

数字接口类型

IIC(从模式3.4MHz)

SPI(3线或4线制从模式10MHz)

哔哩哔哩视频:

BMP280气压传感器详解(STM32)

(资料分享见文末) 

二、传感器原理

1.原理图

2.引脚描述

引脚名称

描述

VCC

电源正

GND

SCL

IIC串行时钟线

SDA

IIC串行数据线

3线SPI串行数据输入/输出端口

4线SPI串行数据输入端口

CSB

片选,接高电平(默认)IIC通信,低电平为SPI通信

SDO

IIC地址选择位

4线SPI串行输出端口

3.传感器数据获取流程

   BMP280的测试启动流程 :  

BMP280内部有一个温度传感器和一个压力传感器,通过 I2C接口,可读取温度和压力的数据

BMP280八位的器件地址为 111011X0,其中 XSDO配置状态,SDO低电平时器件地址为 111011000XECSDO高电平时器件地址为 111011100XEE)。从原理图可以看到,SDO默认接地,那么咱们不需要连接任何东西,在找IIC地址时就是(0xEC

BMP280读取到的数据是芯片内部 ADC转换后的原始数值,并非最终的大气压力值。需要进行转换才能得到气压值,根据 BMP280的寄存器中的系数进行计算转换。

三、程序设计

1.使用STM32F103C8T6读取BMP280气压传感器采集的数据

2.将读取得到的温湿度数据同时在OLED上显示

BMP280_SCL

PB6

BMP280_SDA

PB7

OLED_SCL

PB11

OLED_SDA

PB10

串口

串口1

main.c文件

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"	 
#include "OLED.h"
#include "string.h" 	
#include "bmp280.h"/*****************辰哥单片机设计******************STM32* 项目			:	BMP280气压传感器实验                   * 版本			: V1.0* 日期			: 2024.8.20* MCU			:	STM32F103C8T6* 接口			:	见bmp280.h							* BILIBILI	:	辰哥单片机设计* CSDN			:	辰哥单片机设计* 作者			:	辰哥**********************BEGIN***********************/u8 buff[30];//参数显示缓存数组
u16 Pre;		//气压检测值static float bmp280_press,bmp280;				//气压int main(void)
{delay_init(72);	  LED_Init();		  				//初始化与控制设备连接的硬件接口OLED_Init();					//OLED初始化delay_ms(50);OLED_Clear();						//清屏USART1_Config();//串口初始化BMP280Init();//显示“气压:”OLED_ShowChinese(0,0,0,16,1);OLED_ShowChinese(16,0,1,16,1);OLED_ShowChar(40,0,':',16,1);while(1){BMP280GetData(&bmp280_press,&bmp280,&bmp280);Pre = bmp280_press;sprintf((char*)buff,"%2dhpa     ",Pre);OLED_ShowString(50,0,buff,16,1);}
}

bmp280.h文件

#ifndef __BMP280_H
#define __BMP280_H
#include "sys.h"
#include "stdbool.h"/*****************辰哥单片机设计******************STM32* 文件			:	BMP280传感器h文件                   * 版本			: V1.0* 日期			: 2024.8.20* MCU			:	STM32F103C8T6* 接口			:	见代码							* BILIBILI	:	辰哥单片机设计* CSDN			:	辰哥单片机设计* 作者			:	辰哥**********************BEGIN***********************///==============================================BMP280硬件接口==================================================
#define		BMP280_IIC_CLK				RCC_APB2Periph_GPIOB
#define		BMP280_IIC_PORT				GPIOB
#define		BMP280_IIC_SCL_PIN		GPIO_Pin_6
#define		BMP280_IIC_SDA_PIN		GPIO_Pin_7#define 	BMP280_IIC_SCL				PBout(6)
#define 	BMP280_IIC_SDA				PBout(7)
#define 	BMP280_READ_SDA   		PBin(7)  	//输入SDA //=============================================================================================================#define BMP280_ADDR						(0xEC)
#define BMP280_DEFAULT_CHIP_ID			(0x58)#define BMP280_CHIP_ID					(0xD0)                                 /* Chip ID Register */
#define BMP280_RST_REG					(0xE0)                                 /* Softreset Register */
#define BMP280_STAT_REG					(0xF3)                                 /* Status Register */
#define BMP280_CTRL_MEAS_REG			(0xF4)                                 /* Ctrl Measure Register */
#define BMP280_CONFIG_REG				(0xF5)                                 /* Configuration Register */
#define BMP280_PRESSURE_MSB_REG			(0xF7)                                 /* Pressure MSB Register */
#define BMP280_PRESSURE_LSB_REG			(0xF8)                                 /* Pressure LSB Register */
#define BMP280_PRESSURE_XLSB_REG		(0xF9)                                 /* Pressure XLSB Register */
#define BMP280_TEMPERATURE_MSB_REG		(0xFA)                                 /* Temperature MSB Reg */
#define BMP280_TEMPERATURE_LSB_REG		(0xFB)                                 /* Temperature LSB Reg */
#define BMP280_TEMPERATURE_XLSB_REG		(0xFC)                                 /* Temperature XLSB Reg */#define BMP280_SLEEP_MODE				(0x00)
#define BMP280_FORCED_MODE				(0x01)
#define BMP280_NORMAL_MODE				(0x03)#define BMP280_TEMPERATURE_CALIB_DIG_T1_LSB_REG             (0x88)
#define BMP280_PRESSURE_TEMPERATURE_CALIB_DATA_LENGTH       (24)
#define BMP280_DATA_FRAME_SIZE			(6)#define BMP280_OVERSAMP_SKIPPED			(0x00)
#define BMP280_OVERSAMP_1X				(0x01)
#define BMP280_OVERSAMP_2X				(0x02)
#define BMP280_OVERSAMP_4X				(0x03)
#define BMP280_OVERSAMP_8X				(0x04)
#define BMP280_OVERSAMP_16X				(0x05)//IIC所有操作函数
void BMP_IIC_Init(void);                                                           //初始化IIC的IO口				 
void BMP_IIC_Start(void);				                                           //发送IIC开始信号
void BMP_IIC_Stop(void);	  			                                           //发送IIC停止信号
void BMP_IIC_Send_Byte(u8 txd);			                                           //IIC发送一个字节
u8 BMP_IIC_Read_Byte(unsigned char ack);                                           //IIC读取一个字节
u8 BMP_IIC_Wait_Ack(void); 				                                           //IIC等待ACK信号
void BMP_IIC_Ack(void);					                                           //IIC发送ACK信号
void BMP_IIC_NAck(void);				                                           //IIC不发送ACK信号void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
u8 IIC_Read_One_Byte(u8 daddr,u8 addr);	u8 iicDevReadByte(u8 devaddr,u8 addr);	                                       /*读一字节*/
void iicDevWriteByte(u8 devaddr,u8 addr,u8 data);	                           /*写一字节*/
void iicDevRead(u8 devaddr,u8 addr,u8 len,u8 *rbuf);                           /*连续读取多个字节*/
void iicDevWrite(u8 devaddr,u8 addr,u8 len,u8 *wbuf);                          /*连续写入多个字节*/bool BMP280Init(void);
void BMP280GetData(float* pressure, float* temperature, float* asl);#endif

bmp280.c文件

#include <math.h>
#include "stdbool.h"
#include "bmp280.h"
#include "delay.h"
#include "usart.h"/*****************辰哥单片机设计******************STM32* 文件			:	BMP280传感器c文件                   * 版本			: V1.0* 日期			: 2024.8.20* MCU			:	STM32F103C8T6* 接口			:	见bmp280.h文件							* BILIBILI	:	辰哥单片机设计* CSDN			:	辰哥单片机设计* 作者			:	辰哥**********************BEGIN***********************///注意:
//模块5V供电
//SD0接地,模块使用IIC通信/*bmp280 气压和温度过采样 工作模式*/
#define BMP280_PRESSURE_OSR			(BMP280_OVERSAMP_8X)
#define BMP280_TEMPERATURE_OSR		(BMP280_OVERSAMP_16X)
#define BMP280_MODE					(BMP280_PRESSURE_OSR<<2|BMP280_TEMPERATURE_OSR<<5|BMP280_NORMAL_MODE)typedef struct 
{u16 dig_T1;                                                                /* calibration T1 data */s16 dig_T2;                                                                /* calibration T2 data */s16 dig_T3;                                                                /* calibration T3 data */u16 dig_P1;                                                                /* calibration P1 data */s16 dig_P2;                                                                /* calibration P2 data */s16 dig_P3;                                                                /* calibration P3 data */s16 dig_P4;                                                                /* calibration P4 data */s16 dig_P5;                                                                /* calibration P5 data */s16 dig_P6;                                                                /* calibration P6 data */s16 dig_P7;                                                                /* calibration P7 data */s16 dig_P8;                                                                /* calibration P8 data */s16 dig_P9;                                                                /* calibration P9 data */s32 t_fine;                                                                /* calibration t_fine data */
} bmp280Calib;bmp280Calib  bmp280Cal;static u8 bmp280ID=0;
static bool isInit=false;
static s32 bmp280RawPressure=0;
static s32 bmp280RawTemperature=0;static void bmp280GetPressure(void);
static void presssureFilter(float* in,float* out);
static float bmp280PressureToAltitude(float* pressure/*, float* groundPressure, float* groundTemp*/);//BMP280引脚输出模式控制
void BMP280_IIC_SDA_OUT(void)//SDA输出方向配置
{GPIO_InitTypeDef GPIO_InitStructure;	GPIO_InitStructure.GPIO_Pin=BMP280_IIC_SDA_PIN;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//SDA推挽输出GPIO_Init(BMP280_IIC_PORT,&GPIO_InitStructure); 						}void BMP280_IIC_SDA_IN(void)//SDA输入方向配置
{GPIO_InitTypeDef GPIO_InitStructure;	GPIO_InitStructure.GPIO_Pin=BMP280_IIC_SDA_PIN;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//SCL上拉输入GPIO_Init(BMP280_IIC_PORT,&GPIO_InitStructure);}//初始化IIC
void BMP_IIC_Init(void)
{					     GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(BMP280_IIC_CLK, ENABLE );	GPIO_InitStructure.GPIO_Pin=BMP280_IIC_SCL_PIN|BMP280_IIC_SDA_PIN;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP ;                            //推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(BMP280_IIC_PORT,&GPIO_InitStructure);BMP280_IIC_SCL=1;BMP280_IIC_SDA=1;}
//产生IIC起始信号
void BMP_IIC_Start(void)
{BMP280_IIC_SDA_OUT();                                                                 //sda线输出BMP280_IIC_SDA=1;	  	  BMP280_IIC_SCL=1;delay_us(4);BMP280_IIC_SDA=0;                                                                 //START:when CLK is high,DATA change form high to low delay_us(4);BMP280_IIC_SCL=0;                                                                 //钳住I2C总线,准备发送或接收数据 
}	  
//产生IIC停止信号
void BMP_IIC_Stop(void)
{BMP280_IIC_SDA_OUT();                                                                 //sda线输出BMP280_IIC_SCL=0;BMP280_IIC_SDA=0;                                                                 //STOP:when CLK is high DATA change form low to highdelay_us(4);BMP280_IIC_SCL=1; BMP280_IIC_SDA=1;                                                                 //发送I2C总线结束信号delay_us(4);							   	
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 BMP_IIC_Wait_Ack(void)
{u8 ucErrTime=0;BMP280_IIC_SDA_IN();                                                                  //SDA设置为输入  BMP280_IIC_SDA=1;delay_us(1);	   BMP280_IIC_SCL=1;delay_us(1);	 while(BMP280_READ_SDA){ucErrTime++;if(ucErrTime>250){BMP_IIC_Stop();return 1;}}BMP280_IIC_SCL=0;                                                                 //时钟输出0 	   return 0;  
} 
//产生ACK应答
void BMP_IIC_Ack(void)
{BMP280_IIC_SCL=0;BMP280_IIC_SDA_OUT();BMP280_IIC_SDA=0;delay_us(2);BMP280_IIC_SCL=1;delay_us(2);BMP280_IIC_SCL=0;
}
//不产生ACK应答		    
void BMP_IIC_NAck(void)
{BMP280_IIC_SCL=0;BMP280_IIC_SDA_OUT();BMP280_IIC_SDA=1;delay_us(2);BMP280_IIC_SCL=1;delay_us(2);BMP280_IIC_SCL=0;
}					 				     
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答			  
void BMP_IIC_Send_Byte(u8 txd)
{                        u8 t;   BMP280_IIC_SDA_OUT(); 	    BMP280_IIC_SCL=0;                                                                 //拉低时钟开始数据传输for(t=0;t<8;t++){              BMP280_IIC_SDA=(txd&0x80)>>7;txd<<=1; 	  delay_us(2);                                                           //对TEA5767这三个延时都是必须的BMP280_IIC_SCL=1;delay_us(2); BMP280_IIC_SCL=0;	delay_us(2);}	 
} 	    
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
u8 BMP_IIC_Read_Byte(unsigned char ack)
{unsigned char i,receive=0;BMP280_IIC_SDA_IN();                                                                  //SDA设置为输入for(i=0;i<8;i++ ){BMP280_IIC_SCL=0; delay_us(2);BMP280_IIC_SCL=1;receive<<=1;if(BMP280_READ_SDA)receive++;   delay_us(1); }					 if (!ack)BMP_IIC_NAck();                                                            //发送nACKelseBMP_IIC_Ack();                                                             //发送ACK   return receive;
}//从指定地址读出一个数据
//ReadAddr:开始读数的地址  
//返回值  :读到的数据
u8 iicDevReadByte(u8 devaddr,u8 addr)
{				  u8 temp=0;		  	    																 BMP_IIC_Start();  BMP_IIC_Send_Byte(devaddr);                                                    //发送器件写命令 	   BMP_IIC_Wait_Ack(); BMP_IIC_Send_Byte(addr);                                                       //发送低地址BMP_IIC_Wait_Ack();	BMP_IIC_Start();  	 	   BMP_IIC_Send_Byte(devaddr|1);                                                  //发送器件读命令			   BMP_IIC_Wait_Ack();	 temp=BMP_IIC_Read_Byte(0);			   BMP_IIC_Stop();                                                                //产生一个停止条件	    return temp;
}//连续读多个字节
//addr:起始地址
//rbuf:读数据缓存
//len:数据长度
void iicDevRead(u8 devaddr,u8 addr,u8 len,u8 *rbuf)
{int i=0;BMP_IIC_Start();  BMP_IIC_Send_Byte(devaddr);  BMP_IIC_Wait_Ack();	BMP_IIC_Send_Byte(addr);                                                       //地址自增  BMP_IIC_Wait_Ack();	BMP_IIC_Start();  	BMP_IIC_Send_Byte(devaddr|1);  	BMP_IIC_Wait_Ack();	for(i=0; i<len; i++){if(i==len-1){rbuf[i]=BMP_IIC_Read_Byte(0);                                          //最后一个字节不应答}elserbuf[i]=BMP_IIC_Read_Byte(1);}BMP_IIC_Stop( );	
}//从指定地址写入一个数据
//WriteAddr :写入数据的目的地址    
//DataToWrite:要写入的数据
void iicDevWriteByte(u8 devaddr,u8 addr,u8 data)
{				   	  	    																 BMP_IIC_Start();  BMP_IIC_Send_Byte(devaddr);                                                    //发送器件写命令 	 BMP_IIC_Wait_Ack();	   BMP_IIC_Send_Byte(addr);                                                       //发送低地址BMP_IIC_Wait_Ack(); 	 										  		   BMP_IIC_Send_Byte(data);                                                       //发送字节							   BMP_IIC_Wait_Ack();  		    	   BMP_IIC_Stop();		                                                           //产生一个停止条件 	 
}//连续写多个字节
//addr:起始地址
//wbuf:写数据缓存
//len:数据的长度
void iicDevWrite(u8 devaddr,u8 addr,u8 len,u8 *wbuf)
{int i=0;BMP_IIC_Start();  BMP_IIC_Send_Byte(devaddr);  	BMP_IIC_Wait_Ack();	BMP_IIC_Send_Byte(addr);  //地址自增BMP_IIC_Wait_Ack();	for(i=0; i<len; i++){BMP_IIC_Send_Byte(wbuf[i]);  BMP_IIC_Wait_Ack();		}BMP_IIC_Stop( );	
}bool BMP280Init(void)
{	if (isInit)return true;BMP_IIC_Init();		                                                           /*初始化I2C*/delay_ms(20);bmp280ID=iicDevReadByte(BMP280_ADDR,BMP280_CHIP_ID);	                   /* 读取bmp280 ID*/if(bmp280ID==BMP280_DEFAULT_CHIP_ID)printf("BMP280 ID IS: 0x%X\n",bmp280ID);elsereturn false;/* 读取校准数据 */iicDevRead(BMP280_ADDR,BMP280_TEMPERATURE_CALIB_DIG_T1_LSB_REG,24,(u8 *)&bmp280Cal);	iicDevWriteByte(BMP280_ADDR,BMP280_CTRL_MEAS_REG,BMP280_MODE);iicDevWriteByte(BMP280_ADDR,BMP280_CONFIG_REG,5<<2);		               /*配置IIR滤波*/isInit=true;return true;
}static void bmp280GetPressure(void)
{u8 data[BMP280_DATA_FRAME_SIZE];// read data from sensoriicDevRead(BMP280_ADDR,BMP280_PRESSURE_MSB_REG,BMP280_DATA_FRAME_SIZE,data);bmp280RawPressure=(s32)((((uint32_t)(data[0]))<<12)|(((uint32_t)(data[1]))<<4)|((uint32_t)data[2]>>4));bmp280RawTemperature=(s32)((((uint32_t)(data[3]))<<12)|(((uint32_t)(data[4]))<<4)|((uint32_t)data[5]>>4));
}// Returns temperature in DegC, resolution is 0.01 DegC. Output value of "5123" equals 51.23 DegC
// t_fine carries fine temperature as global value
static s32 bmp280CompensateT(s32 adcT)
{s32 var1,var2,T;var1=((((adcT>>3)-((s32)bmp280Cal.dig_T1<<1)))*((s32)bmp280Cal.dig_T2))>>11;var2=(((((adcT>>4)-((s32)bmp280Cal.dig_T1))*((adcT>>4)-((s32)bmp280Cal.dig_T1)))>>12)*((s32)bmp280Cal.dig_T3))>>14;bmp280Cal.t_fine=var1+var2;T=(bmp280Cal.t_fine*5+128)>>8;return T;
}// 以 Q24.8 格式(24 个整数位和 8 个小数位)将压力以 Pa 为单位返回为无符号 32 位整数。
// “24674867”的输出值表示 24674867/256 = 96386.2 Pa = 963.862 hPa
static uint32_t bmp280CompensateP(s32 adcP)
{int64_t var1,var2,p;var1=((int64_t)bmp280Cal.t_fine)-128000;var2=var1*var1*(int64_t)bmp280Cal.dig_P6;var2=var2+((var1*(int64_t)bmp280Cal.dig_P5)<<17);var2=var2+(((int64_t)bmp280Cal.dig_P4)<<35);var1=((var1*var1*(int64_t)bmp280Cal.dig_P3)>>8)+((var1*(int64_t)bmp280Cal.dig_P2)<<12);var1=(((((int64_t)1)<<47)+var1))*((int64_t)bmp280Cal.dig_P1)>>33;if (var1==0)return 0;p=1048576-adcP;p=(((p<<31)-var2)*3125)/var1;var1=(((int64_t)bmp280Cal.dig_P9)*(p>>13)*(p>>13))>>25;var2=(((int64_t)bmp280Cal.dig_P8)*p)>>19;p=((p+var1+var2)>>8)+(((int64_t)bmp280Cal.dig_P7)<<4);return(uint32_t)p;
}#define FILTER_NUM	5
#define FILTER_A	0.1f/*限幅平均滤波法*/
static void presssureFilter(float* in,float* out)
{	static u8 i=0;static float filter_buf[FILTER_NUM]={0.0};double filter_sum=0.0;u8 cnt=0;	float deta;if(filter_buf[i]==0.0f){filter_buf[i]=*in;*out=*in;if(++i>=FILTER_NUM)	i=0;} else {if(i)deta=*in-filter_buf[i-1];else deta=*in-filter_buf[FILTER_NUM-1];if(fabs(deta)<FILTER_A){filter_buf[i]=*in;if(++i>=FILTER_NUM)	i=0;}for(cnt=0;cnt<FILTER_NUM;cnt++){filter_sum+=filter_buf[cnt];}*out=filter_sum /FILTER_NUM;}
}void BMP280GetData(float* pressure,float* temperature,float* asl)
{static float t;static float p;bmp280GetPressure();t=bmp280CompensateT(bmp280RawTemperature)/100.0;		p=bmp280CompensateP(bmp280RawPressure)/25600.0;		presssureFilter(&p,pressure);*temperature=(float)t;                                                   /*单位度*/*pressure=(float)p ;	                                                   /*单位hPa*/	*asl=bmp280PressureToAltitude(pressure);	                               /*转换成海拔*/	
}#define CONST_PF 0.1902630958	                                               //(1/5.25588f) Pressure factor
#define FIX_TEMP 25				                                               // Fixed Temperature. ASL is a function of pressure and temperature, but as the temperature changes so much (blow a little towards the flie and watch it drop 5 degrees) it corrupts the ASL estimates.// TLDR: Adjusting for temp changes does more harm than good.
/** Converts pressure to altitude above sea level (ASL) in meters
*/
static float bmp280PressureToAltitude(float* pressure/*, float* groundPressure, float* groundTemp*/)
{if (*pressure>0){return((pow((1015.7f/ *pressure),CONST_PF)-1.0f)*(FIX_TEMP+273.15f))/0.0065f;}else{return 0;}
}

四、实验效果 

五、资料获取

项目分享

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

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

相关文章

大模型书籍丨国内顶尖院校出品,非常火爆的LLM大模型入门中文书来了

最近有一本人工智能入门的书比较火&#xff0c;这本书集合了最新的产品、技术&#xff0c;并通过顶尖院校的教授书写而成。我今天阅读了第一章&#xff0c;感觉浅显易懂&#xff0c;顺便把笔记也做出来了&#xff0c;供大家参考。 大语言模型入门 第一部分 背景与基础知识 第…

[数据集][目标检测]电动车入梯进电梯电单车入梯检测数据集VOC+YOLO格式7106张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;7106 标注数量(xml文件个数)&#xff1a;7106 标注数量(txt文件个数)&#xff1a;7106 标注…

未来数据中心网络的创新光互连解决方案

随着应用场景的发展&#xff0c;企业对数据中心网络及光模块的需求也在不断变化。对于长距离波分复用应用&#xff0c;企业优先考虑性能&#xff0c;追求更长的传输距离和更高的光谱效率。相比之下&#xff0c;对于数据中心内部的短距离应用&#xff0c;企业更注重成本&#xf…

002 JavaClent操作RabbitMQ

Java Client操作RabbitMQ 文章目录 Java Client操作RabbitMQ1.pom依赖2.连接工具类3.简单模式4.工作队列模式&#xff08;work&#xff09;公平调度示例 5.发布/订阅模式&#xff08;fanout&#xff09;交换机绑定示例代码 6.路由模式&#xff08;direct&#xff09;7.Topic匹配…

LVS--负载均衡调度器

文章目录 集群和分布式集群分布式 LVS介绍LVS特点LVS工作原理LVS集群架构 LVS集群中的术语CIPVIPRSDIPRIP LVS集群的工作模式NAT模式DR模式DR的工作原理DR的特点:DR的网络配置1.配置负载均衡器2.配置后端服务器lo接口的作用 3.测试连接&#xff1a; DR的典型应用场景 TUN模式 L…

《深度学习》【项目】 OpenCV 身份证号识别

目录 一、项目实施 1、自定义函数 2、定位模版图像中的数字 1&#xff09;模版图二值化处理 运行结果&#xff1a; 2&#xff09;展示所有数字 运行结果&#xff1a; 3、识别身份证号 1&#xff09;灰度图、二值化图展示 运行结果 2&#xff09;定位身份证号每一个数…

❤Node08-Express-jwt身份认证

❤Node08-Express-jwt身份认证 1、token基本概念​ Session认证的局限性​ Session 认证机制需要配合Cookie才能实现。由于 Cookie 默认不支持跨域访问&#xff0c;所以&#xff0c;当涉及到前端跨域请求后端接口的时候&#xff0c;需要做很多额外的配置&#xff0c;才能实现…

【JVM】JVM栈帧中的动态链接 与 Java的面向对象特性--多态

栈帧 每一次方法调用都会有一个对应的栈帧被压入栈&#xff08;虚拟机栈&#xff09;中&#xff0c;每一个方法调用结束后&#xff0c;都会有一个栈帧被弹出。 每个栈帧中包括&#xff1a;局部变量表、操作数栈、动态链接、方法返回地址。 JavaGuide&#xff1a;Java内存区域…

Debian项目实战——环境搭建篇

Debian系统安装 准备工作 1、系统镜像&#xff1a;根据自己的需要选择合适的版本格式&#xff1a;x86 / arm 架构 | 最好下载离线安装版本 | 清华镜像源 2、制作工具&#xff1a;balenaEtcher 3、系统媒介&#xff1a;16G以上U盘最佳 烧录镜像 打开balenaEtcher进行烧录&am…

改变事件

窗口的某些属性的状态发生改变时就会触发该事件 对应的事件类型包括 QEvent::ToolBarChange, QEvent::ActivationChange, QEvent::EnabledChange, QEvent::FontChange,QEvent::StyleChange, QEvent::PaletteChange, QEvent::WindowTitleChange, QEvent::IconTextChange, QEve…

【练习9】大数加法

链接&#xff1a;大数加法__牛客网 (nowcoder.com) 分析&#xff1a; 当作竖式计算 import java.util.*;public class Solution {public String solve (String s, String t) {StringBuffer ret new StringBuffer();//i是字符串s的最后一个字符的索引int i s.length() - 1;//j…

新能源汽车安全问题如何解决?细看“保护罩”连接器的守护使命

「当前市场上绝大部分电池的安全系数远远不够」。 在一场世界动力电池大会上&#xff0c;宁德时代的董事长曾毓群这样犀利直言。 从汽车开始向电动化转型升级那天起&#xff0c;动力电池的安全隐患就一直是个老生常谈的话题了。曾毓群的这句话&#xff0c;直接点明了行业的发展…

参数传了报错没传参数识别不到参数传丢

【记一次参数传值了但报错未传值的问题解决历程】 问题描述&#xff1a;同一个接口&#xff0c;用测试类调可以成功&#xff0c;用postman调用一直报错少参数&#xff0c;后又尝试了用idea自带的http调用&#xff0c;同样报错参数未传值。 如图&#xff0c;传值了报错未传值。…

Java并发:互斥锁,读写锁,Condition,StampedLock

3&#xff0c;Lock与Condition 3.1&#xff0c;互斥锁 3.1.1&#xff0c;可重入锁 锁的可重入性&#xff08;Reentrant Locking&#xff09;是指在同一个线程中&#xff0c;已经获取锁的线程可以再次获取该锁而不会导致死锁。这种特性允许线程在持有锁的情况下&#xff0c;可…

AI网盘搜索 1.2.6 智能文件搜索助手,一键搜索所有资源

对于经常需要处理大量文件的人来说&#xff0c;AI网盘检索简直是救星。它提供了智能对话式搜索功能&#xff0c;只需用自然语言描述就能找到需要的文件。此外&#xff0c;它还广泛支持各种文件类型&#xff0c;从文档到图片&#xff0c;全面覆盖。精准定位功能让您能够快速找到…

DSC+主备+异步备库搭建

DSC主备异步备库搭建 本次在DSC的基础上进行主备集群异步备库的搭建&#xff0c;实现DSC主备异步备库的集合。 这里DMDSC集群是看做一个数据库服务&#xff08;即DSC集群内的都叫主库&#xff09;&#xff0c;备库是一个单机实例 环境配置 服务器配置 端口配置 实例名PORT…

C#获取计算机信息

目录 效果 项目 代码 下载 效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Management; n…

Vulnhub:bassamCTF

靶机下载地址 信息收集 主机发现 扫描攻击机同网段存活主机。 nmap 192.168.31.0/24 -Pn -T4 靶机ip&#xff1a;192.168.31.165 端口扫描 nmap 192.168.31.165 -A -p- -T4 开放端口22&#xff0c;80。 网站信息收集 访问80端口的http服务。首页是空白页面&#xff0c;…

关于打不开SOAMANAGER如何解决

参考文章&#xff1a;https://blog.csdn.net/yannickdann/article/details/115396035 打开SE93

Django创建模型

1、根据创建好应用模块 python manage.py startapp tests 2、在models文件里创建模型 from django.db import modelsfrom book.models import User# Create your models here. class Tests(models.Model):STATUS_CHOICES ((0, 启用),(1, 停用),# 更多状态...)add_time mode…