STM32——温湿度采集与显示

一、I2C协议

关于I2C协议的基本原理和时序协议
12C协议使用两条线:SDA(Serial Data Line,串行数据线)和SCL(Serial Clock Line,串行时钟线)。这两条线都是开漏输出,意味着它们需要上拉电阻才能输出高电平。12C总线可以支持多个设备,每个设备都有一个唯一的地址,可以是7位或10位。
12C的时序协议
12C协议的时序是严格定义的,以确保数据的准确传输。主要时序包括:

开始条件(Start Condition):当SCL为高电平时,SDA从高电平到低电平的跳变表示一个开始条件。
停止条件(Stop Condition):当SCL为高电平时,SDA从低电平到高电平的跳变表示一个停止条件。
数据传输:数据在SCL的下降沿被放置到SDA线上,在SCL的上升沿被读取。每个数据位后面都有一个确认位(ACK或NACK)。
确认位(ACK/NACK):在发送每个字节后,接收方必须通过将SDA拉低来发送一个确认位(ACK)。如果接收方不拉低SDA,则发送一个非确认位(NACK)。
时钟延长(Clock Stretching):从设备可以通过将SCL拉低来延长时钟周期,以便有更多时间处理接收到的数据。
12C的传输过程
发送地址:主设备发送一个开始条件,然后发送它想要与之通信的从设备的地址。
读写控制位:在地址后面是一个读写控制位,'0’表示写操作,'1’表示读操作。
数据传输:从设备确认地址后,主设备可以开始发送或接收数据。
停止条件:当传输完成后,主设备发送一个停止条件以结束通信。

二、AHT20

AHT20是一款由奥松公司生产的I2C接口的MEMS温湿度传感器。这款传感器的主要特点包括体积小、精度高、成本低等。AHT20的ADC位数为20Bit,相较于AHT10,体积更小,从5x4x1.6mm缩小到3x3x1.0mm。在相对湿度方面,其精度为±2%,温度精度为±0.3°C。相对湿度测量范围为0-100%,温度测量范围为-40~85°C。
需要注意的是在实践接线时要注意正确接入管脚
在这里插入图片描述
本次实践中SCL-B6,SDA-B7.

三、stm32CubeMX创建工程

按照下图顺序进行创建工程即可
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、Keil工程中相关操作及代码

首先在工程的文件夹中新建一个文件夹ATT20,并在文件夹中新建两个文件:AHT20-21_DEMO_V1_3.c,AHT20-21_DEMO_V1_3.h。
然后在工程中新建文件夹,添加文件以及文件路径,步骤如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
添加文件代码:
AHT20-21_DEMO_V1_3.h

#ifndef _AHT20_DEMO_
#define _AHT20_DEMO_#include "main.h"  void Delay_N10us(uint32_t t);//延时函数
void SensorDelay_us(uint32_t t);//延时函数
void Delay_4us(void);		//延时函数
void Delay_5us(void);		//延时函数
void Delay_1ms(uint32_t t);	
void AHT20_Clock_Init(void);		//延时函数
void SDA_Pin_Output_High(void)  ; //将PB15配置为输出 , 并设置为高电平, PB15作为I2C的SDA
void SDA_Pin_Output_Low(void);  //将P15配置为输出  并设置为低电平
void SDA_Pin_IN_FLOATING(void);  //SDA配置为浮空输入
void SCL_Pin_Output_High(void); //SCL输出高电平,P14作为I2C的SCL
void SCL_Pin_Output_Low(void); //SCL输出低电平
void Init_I2C_Sensor_Port(void); //初始化I2C接口,输出为高电平
void I2C_Start(void);		 //I2C主机发送START信号
void AHT20_WR_Byte(uint8_t Byte); //往AHT20写一个字节
uint8_t AHT20_RD_Byte(void);//从AHT20读取一个字节
uint8_t Receive_ACK(void);   //看AHT20是否有回复ACK
void Send_ACK(void)	;	  //主机回复ACK信号
void Send_NOT_ACK(void);	//主机不回复ACK
void Stop_I2C(void);	  //一条协议结束
uint8_t AHT20_Read_Status(void);//读取AHT20的状态寄存器
uint8_t AHT20_Read_Cal_Enable(void);  //查询cal enable位有没有使能
void AHT20_SendAC(void); //向AHT20发送AC命令
uint8_t Calc_CRC8(uint8_t *message,uint8_t Num);
void AHT20_Read_CTdata(uint32_t *ct); //没有CRC校验,直接读取AHT20的温度和湿度数据
void AHT20_Read_CTdata_crc(uint32_t *ct); //CRC校验后,读取AHT20的温度和湿度数据
void AHT20_Init(void);   //初始化AHT20
void JH_Reset_REG(uint8_t addr);///重置寄存器
void AHT20_Start_Init(void);///上电初始化进入正常测量状态
#endif

AHT20-21_DEMO_V1_3.c

/*******************************************/
/*@版权所有:广州奥松电子有限公司          */
/*@作者:温湿度传感器事业部                */
/*@版本:V1.2                              */
/*******************************************/
//#include "main.h" 
#include "AHT20-21_DEMO_V1_3.h" 
#include "gpio.h"
#include "i2c.h"void Delay_N10us(uint32_t t)//延时函数
{uint32_t k;while(t--){for (k = 0; k < 2; k++);//110}
}void SensorDelay_us(uint32_t t)//延时函数
{for(t = t-2; t>0; t--){Delay_N10us(1);}
}void Delay_4us(void)		//延时函数
{	Delay_N10us(1);Delay_N10us(1);Delay_N10us(1);Delay_N10us(1);
}
void Delay_5us(void)		//延时函数
{	Delay_N10us(1);Delay_N10us(1);Delay_N10us(1);Delay_N10us(1);Delay_N10us(1);}void Delay_1ms(uint32_t t)		//延时函数
{while(t--){SensorDelay_us(1000);//延时1ms}
}//void AHT20_Clock_Init(void)		//延时函数
//{
//	RCC_APB2PeriphClockCmd(CC_APB2Periph_GPIOB,ENABLE);
//}void SDA_Pin_Output_High(void)   //将PB7配置为输出 , 并设置为高电平, PB7作为I2C的SDA
{GPIO_InitTypeDef  GPIO_InitStruct;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;//推挽输出GPIO_InitStruct.Pin = GPIO_PIN_7;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB,& GPIO_InitStruct);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);
}void SDA_Pin_Output_Low(void)  //将P7配置为输出  并设置为低电平
{GPIO_InitTypeDef  GPIO_InitStruct;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;//推挽输出GPIO_InitStruct.Pin = GPIO_PIN_7;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB,& GPIO_InitStruct);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);
}void SDA_Pin_IN_FLOATING(void)  //SDA配置为浮空输入
{GPIO_InitTypeDef  GPIO_InitStruct;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;//浮空GPIO_InitStruct.Pin = GPIO_PIN_7;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init( GPIOB,&GPIO_InitStruct);
}void SCL_Pin_Output_High(void) //SCL输出高电平,P14作为I2C的SCL
{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
}void SCL_Pin_Output_Low(void) //SCL输出低电平
{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);
}void Init_I2C_Sensor_Port(void) //初始化I2C接口,输出为高电平
{	GPIO_InitTypeDef  GPIO_InitStruct;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;//推挽输出GPIO_InitStruct.Pin = GPIO_PIN_7;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB,& GPIO_InitStruct);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET);GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;//推挽输出GPIO_InitStruct.Pin = GPIO_PIN_6;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB,& GPIO_InitStruct);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET);}
void I2C_Start(void)		 //I2C主机发送START信号
{SDA_Pin_Output_High();SensorDelay_us(8);SCL_Pin_Output_High();SensorDelay_us(8);SDA_Pin_Output_Low();SensorDelay_us(8);SCL_Pin_Output_Low();SensorDelay_us(8);   
}void AHT20_WR_Byte(uint8_t Byte) //往AHT20写一个字节
{uint8_t Data,N,i;	Data=Byte;i = 0x80;for(N=0;N<8;N++){SCL_Pin_Output_Low(); Delay_4us();	if(i&Data){SDA_Pin_Output_High();}else{SDA_Pin_Output_Low();}	SCL_Pin_Output_High();Delay_4us();Data <<= 1;}SCL_Pin_Output_Low();SensorDelay_us(8);   SDA_Pin_IN_FLOATING();SensorDelay_us(8);	
}	uint8_t AHT20_RD_Byte(void)//从AHT20读取一个字节
{uint8_t Byte,i,a;Byte = 0;SCL_Pin_Output_Low();SDA_Pin_IN_FLOATING();SensorDelay_us(8);	for(i=0;i<8;i++){SCL_Pin_Output_High();Delay_5us();a=0;//if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)) a=1;if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7)) a=1;Byte = (Byte<<1)|a;//SCL_Pin_Output_Low();HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);Delay_5us();}SDA_Pin_IN_FLOATING();SensorDelay_us(8);	return Byte;
}uint8_t Receive_ACK(void)   //看AHT20是否有回复ACK
{uint16_t CNT;CNT = 0;SCL_Pin_Output_Low();	SDA_Pin_IN_FLOATING();SensorDelay_us(8);	SCL_Pin_Output_High();	SensorDelay_us(8);	while((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7))  && CNT < 100) CNT++;if(CNT == 100){return 0;}SCL_Pin_Output_Low();	SensorDelay_us(8);	return 1;
}void Send_ACK(void)		  //主机回复ACK信号
{SCL_Pin_Output_Low();	SensorDelay_us(8);	SDA_Pin_Output_Low();SensorDelay_us(8);	SCL_Pin_Output_High();	SensorDelay_us(8);SCL_Pin_Output_Low();	SensorDelay_us(8);SDA_Pin_IN_FLOATING();SensorDelay_us(8);
}void Send_NOT_ACK(void)	//主机不回复ACK
{SCL_Pin_Output_Low();	SensorDelay_us(8);SDA_Pin_Output_High();SensorDelay_us(8);SCL_Pin_Output_High();	SensorDelay_us(8);		SCL_Pin_Output_Low();	SensorDelay_us(8);SDA_Pin_Output_Low();SensorDelay_us(8);
}void Stop_I2C(void)	  //一条协议结束
{SDA_Pin_Output_Low();SensorDelay_us(8);SCL_Pin_Output_High();	SensorDelay_us(8);SDA_Pin_Output_High();SensorDelay_us(8);
}uint8_t AHT20_Read_Status(void)//读取AHT20的状态寄存器
{uint8_t Byte_first;	I2C_Start();AHT20_WR_Byte(0x71);Receive_ACK();Byte_first = AHT20_RD_Byte();Send_NOT_ACK();Stop_I2C();return Byte_first;
}uint8_t AHT20_Read_Cal_Enable(void)  //查询cal enable位有没有使能
{uint8_t val = 0;//ret = 0,val = AHT20_Read_Status();if((val & 0x68)==0x08)return 1;else  return 0;}void AHT20_SendAC(void) //向AHT20发送AC命令
{I2C_Start();AHT20_WR_Byte(0x70);Receive_ACK();AHT20_WR_Byte(0xac);//0xAC采集命令Receive_ACK();AHT20_WR_Byte(0x33);Receive_ACK();AHT20_WR_Byte(0x00);Receive_ACK();Stop_I2C();}//CRC校验类型:CRC8/MAXIM
//多项式:X8+X5+X4+1
//Poly:0011 0001  0x31
//高位放到后面就变成 1000 1100 0x8c
//C现实代码:
uint8_t Calc_CRC8(uint8_t *message,uint8_t Num)
{uint8_t i;uint8_t byte;uint8_t crc=0xFF;for(byte=0; byte<Num; byte++){crc^=(message[byte]);for(i=8;i>0;--i){if(crc&0x80) crc=(crc<<1)^0x31;else crc=(crc<<1);}}return crc;
}void AHT20_Read_CTdata(uint32_t *ct) //没有CRC校验,直接读取AHT20的温度和湿度数据
{volatile uint8_t  Byte_1th=0;volatile uint8_t  Byte_2th=0;volatile uint8_t  Byte_3th=0;volatile uint8_t  Byte_4th=0;volatile uint8_t  Byte_5th=0;volatile uint8_t  Byte_6th=0;uint32_t RetuData = 0;uint16_t cnt = 0;AHT20_SendAC();//向AHT10发送AC命令Delay_1ms(80);//延时80ms左右	cnt = 0;while(((AHT20_Read_Status()&0x80)==0x80))//直到状态bit[7]为0,表示为空闲状态,若为1,表示忙状态{SensorDelay_us(1508);if(cnt++>=100){break;}}I2C_Start();AHT20_WR_Byte(0x71);Receive_ACK();Byte_1th = AHT20_RD_Byte();//状态字,查询到状态为0x98,表示为忙状态,bit[7]为1;状态为0x1C,或者0x0C,或者0x08表示为空闲状态,bit[7]为0Send_ACK();Byte_2th = AHT20_RD_Byte();//湿度Send_ACK();Byte_3th = AHT20_RD_Byte();//湿度Send_ACK();Byte_4th = AHT20_RD_Byte();//湿度/温度Send_ACK();Byte_5th = AHT20_RD_Byte();//温度Send_ACK();Byte_6th = AHT20_RD_Byte();//温度Send_NOT_ACK();Stop_I2C();RetuData = (RetuData|Byte_2th)<<8;RetuData = (RetuData|Byte_3th)<<8;RetuData = (RetuData|Byte_4th);RetuData =RetuData >>4;ct[0] = RetuData;//湿度RetuData = 0;RetuData = (RetuData|Byte_4th)<<8;RetuData = (RetuData|Byte_5th)<<8;RetuData = (RetuData|Byte_6th);RetuData = RetuData&0xfffff;ct[1] =RetuData; //温度}void AHT20_Read_CTdata_crc(uint32_t *ct) //CRC校验后,读取AHT20的温度和湿度数据
{volatile uint8_t  Byte_1th=0;volatile uint8_t  Byte_2th=0;volatile uint8_t  Byte_3th=0;volatile uint8_t  Byte_4th=0;volatile uint8_t  Byte_5th=0;volatile uint8_t  Byte_6th=0;volatile uint8_t  Byte_7th=0;uint32_t RetuData = 0;uint16_t cnt = 0;// uint8_t  CRCDATA=0;uint8_t  CTDATA[6]={0};//用于CRC传递数组AHT20_SendAC();//向AHT10发送AC命令Delay_1ms(80);//延时80ms左右	cnt = 0;while(((AHT20_Read_Status()&0x80)==0x80))//直到状态bit[7]为0,表示为空闲状态,若为1,表示忙状态{SensorDelay_us(1508);if(cnt++>=100){break;}}I2C_Start();AHT20_WR_Byte(0x71);Receive_ACK();CTDATA[0]=Byte_1th = AHT20_RD_Byte();//状态字,查询到状态为0x98,表示为忙状态,bit[7]为1;状态为0x1C,或者0x0C,或者0x08表示为空闲状态,bit[7]为0Send_ACK();CTDATA[1]=Byte_2th = AHT20_RD_Byte();//湿度Send_ACK();CTDATA[2]=Byte_3th = AHT20_RD_Byte();//湿度Send_ACK();CTDATA[3]=Byte_4th = AHT20_RD_Byte();//湿度/温度Send_ACK();CTDATA[4]=Byte_5th = AHT20_RD_Byte();//温度Send_ACK();CTDATA[5]=Byte_6th = AHT20_RD_Byte();//温度Send_ACK();Byte_7th = AHT20_RD_Byte();//CRC数据Send_NOT_ACK();                           //注意: 最后是发送NAKStop_I2C();if(Calc_CRC8(CTDATA,6)==Byte_7th){RetuData = (RetuData|Byte_2th)<<8;RetuData = (RetuData|Byte_3th)<<8;RetuData = (RetuData|Byte_4th);RetuData =RetuData >>4;ct[0] = RetuData;//湿度RetuData = 0;RetuData = (RetuData|Byte_4th)<<8;RetuData = (RetuData|Byte_5th)<<8;RetuData = (RetuData|Byte_6th);RetuData = RetuData&0xfffff;ct[1] =RetuData; //温度}else{ct[0]=0x00;ct[1]=0x00;//校验错误返回值,客户可以根据自己需要更改}//CRC数据
}void AHT20_Init(void)   //初始化AHT20
{	Init_I2C_Sensor_Port();I2C_Start();AHT20_WR_Byte(0x70);Receive_ACK();AHT20_WR_Byte(0xa8);//0xA8进入NOR工作模式Receive_ACK();AHT20_WR_Byte(0x00);Receive_ACK();AHT20_WR_Byte(0x00);Receive_ACK();Stop_I2C();Delay_1ms(10);//延时10ms左右I2C_Start();AHT20_WR_Byte(0x70);Receive_ACK();AHT20_WR_Byte(0xbe);//0xBE初始化命令,AHT20的初始化命令是0xBE,   AHT10的初始化命令是0xE1Receive_ACK();AHT20_WR_Byte(0x08);//相关寄存器bit[3]置1,为校准输出Receive_ACK();AHT20_WR_Byte(0x00);Receive_ACK();Stop_I2C();Delay_1ms(10);//延时10ms左右
}
void JH_Reset_REG(uint8_t addr)
{uint8_t Byte_first,Byte_second,Byte_third;I2C_Start();AHT20_WR_Byte(0x70);//原来是0x70Receive_ACK();AHT20_WR_Byte(addr);Receive_ACK();AHT20_WR_Byte(0x00);Receive_ACK();AHT20_WR_Byte(0x00);Receive_ACK();Stop_I2C();Delay_1ms(5);//延时5ms左右I2C_Start();AHT20_WR_Byte(0x71);//Receive_ACK();Byte_first = AHT20_RD_Byte();Send_ACK();Byte_second = AHT20_RD_Byte();Send_ACK();Byte_third = AHT20_RD_Byte();Send_NOT_ACK();Stop_I2C();Delay_1ms(10);//延时10ms左右I2C_Start();AHT20_WR_Byte(0x70);///Receive_ACK();AHT20_WR_Byte(0xB0|addr);寄存器命令Receive_ACK();AHT20_WR_Byte(Byte_second);Receive_ACK();AHT20_WR_Byte(Byte_third);Receive_ACK();Stop_I2C();Byte_second=0x00;Byte_third =0x00;
}void AHT20_Start_Init(void)
{JH_Reset_REG(0x1b);JH_Reset_REG(0x1c);JH_Reset_REG(0x1e);
}

main

#include "main.h"
#include "dma.h"
#include "i2c.h"
#include "usart.h"
#include "gpio.h"
#include "AHT20-21_DEMO_V1_3.h" 
#include <stdio.h>
#include <string.h>
int fputc(int ch,FILE *f)//重新printf
{HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xFFFF);    while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)!=SET){}		return ch;
}
void SystemClock_Config(void);
volatile int  c1,t1;
uint32_t CT_data[2]={0,0};
int main(void)
{HAL_Init();SystemClock_Config();MX_USART1_UART_Init();MX_DMA_Init();MX_I2C1_Init();	AHT20_Init();//放在其它之后if((AHT20_Read_Status()&0x18)!=0x18){AHT20_Start_Init(); //重新初始化寄存器Delay_1ms(10);}while (1){AHT20_Read_CTdata(CT_data);       //不经过CRC校验,直接读取AHT20的温度和湿度数据    推荐每隔大于1S读一次//AHT20_Read_CTdata_crc(CT_data);  //crc校验后,读取AHT20的温度和湿度数据 c1 = CT_data[0]*100*10/1024/1024;  //计算得到湿度值c1(放大了10倍)t1 = CT_data[1]*200*10/1024/1024-500;//计算得到温度值t1(放大了10倍)	printf("湿度:%d%s",c1/10,"%");printf("温度:%d%s",t1/10,"℃");printf("\r\n");HAL_Delay(3000);}}

五、实践结果:
在这里插入图片描述
温度变化是因为向传感器吹气。

六、总结

学习到了采集温湿度的相关操作。

七、参考文章

通过STM32Cube配置完成基于I2C协议的AHT20温湿度传感器的数据采集
该文章介绍更为详细。

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

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

相关文章

NTP对时-客户端程序

#include <QObject> class QUdpSocket;#if 0 // NTP协议帧&#xff08;未使用&#xff09; typedef struct {char LI_VN_Mode;char Stratum;char Poll;char Precision;int RootDelay;int RootDispersion;int ReferenceIdentifier;quint64 ReferenceTimeStamp; …

【AI作曲】毁掉音乐?早该来了!一个网易音乐人对于 AI 大模型音乐创作的思辨

引言&#xff1a;AI在创造还是毁掉音乐&#xff1f; 正如当初 midjourney 和 StableDiffusion 在绘画圈掀起的风波一样&#xff0c;suno 和 各大音乐大模型的来临&#xff0c;其实早该来了。 AI 在毁掉绘画&#xff1f;或者毁掉音乐&#xff1f; 没错&#xff0c;但也错了。…

MGV电源维修KUKA机器人电源模块PH2003-4840

MGV电源维修 库卡电源模块维修 机器人电源模块维修 库卡控制器维修 KUKA电源维修 库卡机器人KUKA主机维修 KUKA驱动器模块维修 机械行业维修&#xff1a;西门子系统、法那克系统、沙迪克、FIDIA、天田、阿玛达、友嘉、大宇系统&#xff1b;数控冲床、剪板机、折弯机等品牌数控…

语音相关算法学习整理

最近看了一下百度paddlespeech的一些公开课&#xff0c;把课程里的视频内容大体听了一下&#xff0c;现在整理一下笔记。教程链接见&#xff1a;飞桨AI Studio星河社区-人工智能学习与实训社区 语音识别的过程可以这样简单概括&#xff1a; 将声音信号经过预加重、加窗、fft等…

JavaWeb——Mysql的启动/登录/卸载

目录 1.Mysql服务器 2.Mysql的简单使用 2.1 启动Mysql&#xff1a; 2.2 登录Mysql 2.3 退出 3. 连接别人的数据库 4.卸载mqsql 1.Mysql服务器 安装了Mysql的计算机都成为Mysql服务器 2.Mysql的简单使用 2.1 启动Mysql&#xff1a; 第一种方法&#xff1a;搜索服务&am…

如何在微信小程序使用vant 进行自定义底部tabbar组件

在微信小程序中使用 Vant 自定义底部 TabBar 需要进行以下步骤&#xff1a; 一、首先&#xff0c;你需要在 app.json 文件中配置自定义 TabBar。 在 "tabBar" 字段中&#xff0c;设置 "custom" 为 true&#xff0c;表示使用自定义 TabBar。 app.json示例…

python18 正则表达式

python18 正则表达式 正则表达式 re.match(),re.search(),re.findall(),re.sub(),re.split() 元字符 具有特殊意义的专用字符 导入模块 improt re代码 正则表达式 re.match(),re.search(),re.findall(),re.sub(),re.split() 元字符 具有特殊意义的专用字符 导入模块 improt rei…

AQS和同步器工具类

一、 同步框架AbstractQueuedSynchronizer Java并发编程核心在于java.concurrent.util包 而juc当中的大多数同步器实现都是围绕着共同的基础行为&#xff0c;比如等待队列、条件队列、独占获取、共享获取等&#xff0c;而这个行为的抽象就是基于AbstractQueuedSynchronizer简称…

关于多线程的理解

#系列文章 关于时间复杂度o(1), o(n), o(logn), o(nlogn)的理解 关于HashMap的哈希碰撞、拉链法和key的哈希函数设计 关于JVM内存模型和堆内存模型的理解 关于代理模式的理解 关于Mysql基本概念的理解 关于软件设计模式的理解 关于Redis知识的理解 文章目录 前言一、线程…

Docker基本使用和认识

目录 基本使用 镜像仓库 镜像操作 Docker 如何实现镜像 1) namespace 2) cgroup 3) LXC Docker常见的网络类型 bridge网络如何实现 基本使用 镜像仓库 镜像仓库登录 1)docker login 后面不指定IP地址&#xff0c;则默认登录到 docker hub 上 退出 2)docker logo…

P5711 【深基3.例3】闰年判断

1. 题目链接 https://www.luogu.com.cn/problem/P5711 P5711 【深基3.例3】闰年判断 2. 题目描述 题目描述&#xff1a;判断一个数是否是闰年 输入&#xff1a;输入一个整数n 输出&#xff1a;输出1或0&#xff0c;如果是闰年&#xff0c;输出1&#xff0c;否则输出0 3. 我的…

大数据经典sql

一、连续登录问题 问题&#xff1a;1&#xff09;、每个用户连续登录最大天数 2&#xff09;、连续登录大于三天的用户数 分析&#xff1a;本质都是计算用户连续登录天数 方案一&#xff1a;利用排序窗口 select a.user_id,a.date_rslt,count(1) as cnt from (select t.…

进入容器修改内容_提交改变后的镜像_镜像保存成tar压缩包离线传输_镜像传输_镜像推送到公共仓库---分布式云原生部署架构搭建009

然后再来看,进入docker内部去看看. 用 docker exec -it imgid /bin/bash 这样就可以进入容器内部 而且关于,镜像的,内部放到什么地方了,都可以找到比如 在hub.docker的地址里面,找到nginx可以看到,对应的 /usr/share/nginx/html 可以看到这个路径. 然后去看看,进入到/usr…

Android 数据库

帮助类对象中的getWritableDatabase 和 getReadableDatabase都可以帮助我们获取一个数据库操作对象SqliteDatabase. 区别&#xff1a; getReadableDatabase: 先尝试以读写方式打开数据库&#xff0c;如果磁盘空间满了&#xff0c;他会重新尝试以只读方式打开数据库。 getWr…

如何恢复未格式化分区数据?看这里!

什么是未格式化分区&#xff1f; 未格式化或RAW文件系统的分区无法被Windows操作系统识别和挂载&#xff0c;因此&#xff0c;Windows会提示你进行格式化以创建新的文件系统。注意&#xff0c;不要进行格式化。通常&#xff0c;文件系统变为未格式化或RAW会出现以下常见错误消…

专业VS学校:高考后的选择困境与解决之道

随着2024年高考的落幕&#xff0c;数百万考生站在了人生新的十字路口。分数的揭晓&#xff0c;既是对过往努力的肯定&#xff0c;也带来了新的选择难题。在专业与学校的权衡中&#xff0c;考生们往往陷入两难&#xff1a;是追随内心选择心仪的专业&#xff0c;还是选择一个知名…

大学选专业还是选学校好 哪个更重要

​​​​​​​如果你的分数不理想&#xff0c;建议先选专业。如果你是高分考生&#xff0c;建议先选学校。具体来看一下&#xff01; 选专业还是选学校好 如果你是高分考生&#xff0c;建议先选学校 1 可以借助学校的名气 我们都知道&#xff0c;学校越有名&#xff0c;能…

(深度学习记录)第TR5周:Transformer中的位置编码详解

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 &#x1f3e1;我的环境&#xff1a; 语言环境&#xff1a;Python3.11.4编译器&#xff1a;Jupyter Notebooktorcch版本&#xff1a;2.0.…

【Matlab编程学习】 | matlab语言编程基础:常用图形绘制基础学习

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

传输层udp和tcp协议格式

UDP协议 UDP协议端格式 udp的前八个字节是报头&#xff0c;后面部分就是有效载荷。而目的端口号就保证了udp向应用层交付的问题。 而针对于报头和有效载荷分离是根据固定八字结的报头长度。数据的长度就是取决于报头中udp长度字段的大小来确定udp报文长度&#xff0c;因此也可…