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,其中 X为 SDO配置状态,SDO低电平时器件地址为 11101100(0XEC),SDO高电平时器件地址为 11101110(0XEE)。从原理图可以看到,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;}
}
四、实验效果

五、资料获取
项目分享
相关文章:
BMP280气压传感器详解(STM32)
目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.传感器数据获取流程 三、程序设计 main.c文件 bmp280.h文件 bmp280.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 BMP280是一款基于博世公司APSM工艺的小封装低功耗数字复合传感器,它可以测…...
DWPD指标:为何不再适用于大容量SSD?
固态硬盘(Solid State Drives, SSD)作为计算机行业中最具革命性的技术之一,凭借其更快的读写速度、增强的耐用性和能效,已经成为大多数用户的首选存储方案。然而,如同任何其他技术一样,SSD也面临自身的挑战…...
路由器的固定ip地址是啥意思?固定ip地址有什么好处
在当今数字化时代,路由器作为连接互联网的重要设备,扮演着举足轻重的角色。其中,路由器的固定IP地址是一个常被提及但可能让人困惑的概念。下面跟着虎观代理小二一起将深入探讨路由器的固定IP地址的含义,揭示其背后…...
Java——踩坑Arrays.asList()
坑1:不能直接使用 Arrsys.asList() 来转换基本类型数据 public static void test1(){// 1、不能直接使用asList来转换基本类型数组int[] arr {1, 2, 3};List list Arrays.asList(arr);System.out.printf("list:%s size:%s class:%s", list, list.size(…...
前缀列表(ip-prefix)配置
一. 实验简介 本来前缀列表是要和访问控制列表放在一起讲的,但是这里单拎出来是为了更详细的讲解两者的区别 1.前缀列表针对IP比访问控制更加灵活。 2.前缀列表在后面被引用时是无法对数据包进行过滤的 实验拓扑 二. 实验目的 R4路由器中只引入子网LoopBack的…...
每日OJ_牛客_电话号码(简单哈希模拟)
目录 牛客_电话号码(简单哈希模拟) 解析代码 牛客_电话号码(简单哈希模拟) 电话号码__牛客网 解析代码 #include <iostream> #include <unordered_map> #include <set> #include <string> using name…...
鸿蒙轻内核M核源码分析系列十二 事件Event
往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 轻内核M核源码分析系列一 数据结构-双向循环链表 轻内核M核源码分析系列二 数据结构-任务就绪队列 鸿蒙轻内核M核源码分析系列三 数据结构-任务排序链表 轻…...
基于 RocketMQ 的云原生 MQTT 消息引擎设计
作者:沁君 概述 随着智能家居、工业互联网和车联网的迅猛发展,面向 IoT(物联网)设备类的消息通讯需求正在经历前所未有的增长。在这样的背景下,高效和可靠的消息传输标准成为了枢纽。MQTT 协议作为新一代物联网场景中…...
AWVS/Acunetix Premium V24.8
前言 Acunetix Premium 是一款网络安全 漏洞扫描 工具,主要用于自动化网站漏洞扫描和管理。它的特点包括深度扫描和发现各种类型的漏洞(如 SQL 注入和跨站脚本),支持多种技术和平台,提供详尽的报告和修复建议…...
[数据集][目标检测]灭火器检测数据集VOC+YOLO格式3255张1类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):3255 标注数量(xml文件个数):3255 标注数量(txt文件个数):3255 标注…...
【技术警报】Redis故障启示录:当主节点宕机,如何避免数据“雪崩”?
在高并发的互联网世界中,Redis作为一个高性能的键值存储系统,常被用于缓存、消息队列等场景,为应用提速增效。然而,技术的光芒背后也隐藏着潜在的危机——今天,我们就来探讨一个真实发生的案例:Redis主节点…...
【基础】Three.js加载纹理贴图、加载外部gltf格式文件
1. 模型使用纹理贴图 const geometry new THREE.BoxGeometry(10, 10, 10);const textureLoader new THREE.TextureLoader(); // 创建纹理贴图加载器const texture textureLoader.load("/crate.gif"); // 加载纹理贴图const material new THREE.MeshLambertMater…...
【区块链 + 人才服务】FISCO BCOS 区块链实训和管理平台 | FISCO BCOS应用案例
中博数科 FISCO BCOS 区块链实训和管理平台主要应用于区块链领域的教育和实训,目的是为学生、教师等用户 提供高效的区块链技术学习和实践体验,同时也为学校提供了一套完整的区块链解决方案。 该平台提供了一套完整的区块链课程体系,包括理论…...
联众优车持续加大汽车金融服务投入与创新,赋能汽车消费新生态
近年来,中国汽车消费市场呈现出蓬勃发展的态势,而汽车金融服务作为降低购车门槛、优化购车体验的重要手段,正日益受到市场的青睐。《2023中国汽车消费趋势调查报告》显示,相较于前一年,今年选择汽车金融服务的市场消费…...
基于yolov8的西红柿检测系统python源码+onnx模型+评估指标曲线+精美GUI界面
【算法介绍】 基于YOLOv8的西红柿检测系统是一种利用深度学习技术的创新应用,旨在通过自动化和智能化手段提高西红柿成熟度检测的准确性和效率。该系统采用YOLOv8算法,该算法是深度学习领域中的先进目标检测模型,具备实时检测和多目标识别的…...
PHP轻量级高性能HTTP服务框架 - webman
摘要 webman 是一款基于 workerman 开发的高性能 HTTP 服务框架。webman 用于替代传统的 php-fpm 架构,提供超高性能可扩展的 HTTP 服务。你可以用 webman 开发网站,也可以开发 HTTP 接口或者微服务。 除此之外,webman 还支持自定义进程&am…...
Python实现人工鱼群算法
博客目录 引言 什么是人工鱼群算法(AFSA)?人工鱼群算法的应用场景为什么使用人工鱼群算法? 人工鱼群算法的原理 人工鱼群算法的基本概念人工鱼的三种行为模式人工鱼群算法的流程人工鱼群算法的特点与优势 人工鱼群算法的实现步骤…...
【网络安全】密码学概述
1. 密码学概述 1.1 定义与目的 密码学是一门研究信息加密和解密技术的科学,其核心目的是确保信息在传输和存储过程中的安全性。密码学通过加密算法将原始信息(明文)转换成难以解读的形式(密文),只有拥有正…...
Java连接SSH
使用JSch库建立SSH连接 JSch是一个纯Java实现的SSH2库,可以用来建立安全的SSH连接。要使用JSch,首先需要将其依赖项添加到您的项目中。如果您使用Maven作为构建工具,可以在pom.xml文件中添加如下依赖: <dependency><gr…...
怎么取消MAC 输入首字母总是自动变大写
一、打开系统偏好设置 点击屏幕左上角的苹果图标()。 在弹出的菜单中选择“系统偏好设置”。偏好设置”。二、进入键盘设置 在系统偏好设置窗口中,找到并点击“键盘”选项。三、调整文本输入设置 在键盘设置窗口中,点击“文本…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
