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

温湿度传感器(DHT11)以及光照强度传感器(BH1750)的使用

前言

对于一些单片机类的环境检测或者智能家居小项目中,温湿度传感器(DHT11)以及光照强度传感器(BH1750)往往是必不可少的两个外设,下面我们来剖析这两个外设的原理,以及使用。

1. 温湿度传感器(DHT11)

1.1 DHT11介绍

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。对于温度的测量范围为0到50℃,能测量的湿度范围为20~95%RH。
在这里插入图片描述
如上图所示,DTH11传感器一般有3线制和4线制两种类型,本次以3线制传感器为例进行说明,4线制传感器请参考商家提供的使用手册。对于3线制在接线上有:

  • VCC外接3.3-5V电源
  • GND外接GND
  • DATA小板开关数字量输出接口接单片机IO口

1.2 串行接口(单线双向)

DHT11的DATA口用于与单片机的通讯和同步,采用单总线数据格式,一次通讯时间为4ms左右,数据分为小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后拓展,现读出为0。操作流程如下:
一次完整的数据传输为40bit,高位先出,数据格式为:

  • 8bit湿度整数数据 + 8bit湿度小数数据
  • 8bit温度整数数据 + 8bir温度小数数据
  • 8bit校验和
    数据传送正确是校验和数据等于“8bit湿度整数数据 + 8bit湿度小数数据+8bit温度整数数据 + 8bir温度小数数据 的低8bit等于8bit校验和 ”。
    例子:
    接收40位bit数据如下:
0000 00100000 00100000 00010000 00010000 0111
湿度高8位湿度低8位温度高8位温度低8位校验和

例如:0000 0001+0000 0010+0011 0001+0000 0010=0000 0111

二进制湿度数据0000 0010 0000 0010==>转化为十进制:514,除于10即为湿度值;
即湿度=51.4%RH

二进制温度数据0000 0001 0000 0010==>转化为十进制:258,除于10即为湿度值;
即温度=25.8℃

当温度低于0℃时温度数据的最高位置1
例如:-34.1℃表示为 0000 0001 0101 0101

1.3 通信过程

  1. 用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据。从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集。采集数据后转换到低速模式。
    在这里插入图片描述
  2. 总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号。主机发送开始信号结束后,延时等待20-40us后,读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉高。
    在这里插入图片描述
  3. 总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短决定了数据位是0还是1。格式如下图所示。如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常。当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。
    数字0信号表示
    在这里插入图片描述
    数字1信号表示:
    在这里插入图片描述

1.4 DHT11代码实现

DHT11.c来源于正点原子,感谢正点原子。

#include "dht11.h"
#include "Delay.h"//	 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK精英STM32开发板
//DHT11数字温湿度传感器驱动代码	   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/12
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved									  
////复位DHT11
void DHT11_Rst(void)	   
{                 DHT11_IO_OUT(); 	//SET OUTPUTDHT11_DQ_OUT=0; 	//拉低DQDelay_ms(20);    	//拉低至少18msDHT11_DQ_OUT=1; 	//DQ=1 Delay_us(30);     	//主机拉高20~40us
}
//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
u8 DHT11_Check(void) 	   
{   u8 retry=0;DHT11_IO_IN();//SET INPUT	 while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us{retry++;Delay_us(1);};	 if(retry>=100)return 1;else retry=0;while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us{retry++;Delay_us(1);};if(retry>=100)return 1;	    return 0;
}
//从DHT11读取一个位
//返回值:1/0
u8 DHT11_Read_Bit(void) 			 
{u8 retry=0;while(DHT11_DQ_IN&&retry<100)//等待变为低电平{retry++;Delay_us(1);}retry=0;while(!DHT11_DQ_IN&&retry<100)//等待变高电平{retry++;Delay_us(1);}Delay_us(40);//等待40usif(DHT11_DQ_IN)return 1;else return 0;		   
}
//从DHT11读取一个字节
//返回值:读到的数据
u8 DHT11_Read_Byte(void)    
{        u8 i,dat;dat=0;for (i=0;i<8;i++) {dat<<=1; dat|=DHT11_Read_Bit();}						    return dat;
}
//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
u8 DHT11_Read_Data(u8 *temp,u8 *humi)    
{        u8 buf[5];u8 i;DHT11_Rst();if(DHT11_Check()==0){for(i=0;i<5;i++)//读取40位数据{buf[i]=DHT11_Read_Byte();}if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]){*humi=buf[0];*temp=buf[2];}}else return 1;return 0;	    
}
//初始化DHT11的IO口 DQ 同时检测DHT11的存在
//返回1:不存在
//返回0:存在    	 
u8 DHT11_Init(void)
{	 GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	 //使能PG端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;				 //PG11端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);				 //初始化IO口GPIO_SetBits(GPIOB,GPIO_Pin_11);						 //PG11 输出高DHT11_Rst();  //复位DHT11return DHT11_Check();//等待DHT11的回应
} 

DHT11.h同样来源于正点原子

#ifndef __DHT11_H
#define __DHT11_H 
#include "sys.h"   
//	 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK战舰STM32开发板
//DHT11数字温湿度传感器驱动代码	   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/12
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved									  
////IO方向设置
#define DHT11_IO_IN()  {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;}
#define DHT11_IO_OUT() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;}
IO操作函数											   
#define	DHT11_DQ_OUT PBout(11) //数据端口	PA0 
#define	DHT11_DQ_IN  PBin(11)  //数据端口	PA0 u8 DHT11_Init(void);//初始化DHT11
u8 DHT11_Read_Data(u8 *temp,u8 *humi);//读取温湿度
u8 DHT11_Read_Byte(void);//读出一个字节
u8 DHT11_Read_Bit(void);//读出一个位
u8 DHT11_Check(void);//检测是否存在DHT11
void DHT11_Rst(void);//复位DHT11    
#endif

2 光强度传感器(BH1750)

2.1 BH1750介绍

BH1750是一种用于两线式串行总线接口的数字型光强度传感器集成电路。所能测量的范围为1~65535Lx。最小误差变动 ± 20 % \pm20\% ±20%。且受红外线的影响很小。
图片来源于淘宝“JXINW旗舰店”
该传感器的管教定义如上所示。

名称注释
GND电源地
VCC电源(3.3~5v)
SCLIIC的时钟线
SDAIIC的数据线
ADDR设备地址引脚(空着)

2.1 BH1750代码实现

bh1750.c

#include "bh1750.h"/*应用说明:在访问I2C设备前,请先调用 i2c_CheckDevice() 检测I2C设备是否正常,该函数会配置GPIO
*/static void I2C_BH1750_GPIOConfig(void);/*
*********************************************************************************************************
* 函 数 名: i2c_Delay
* 功能说明: I2C总线位延迟,最快400KHz
* 形    参:无
* 返 回 值: 无
*********************************************************************************************************
*/
static void i2c_Delay(void)
{uint8_t i;/* 下面的时间是通过逻辑分析仪测试得到的。工作条件:CPU主频72MHz ,MDK编译环境,1级优化循环次数为10时,SCL频率 = 205KHz  循环次数为7时,SCL频率 = 347KHz, SCL高电平时间1.5us,SCL低电平时间2.87us 循环次数为5时,SCL频率 = 421KHz, SCL高电平时间1.25us,SCL低电平时间2.375us */for (i = 0; i < 10; i++);
}
/*
*********************************************************************************************************
* 函 数 名: i2c_Start
* 功能说明: CPU发起I2C总线启动信号
* 形    参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void i2c_Start(void)
{/* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */BH1750_I2C_SDA_1();BH1750_I2C_SCL_1();i2c_Delay();BH1750_I2C_SDA_0();i2c_Delay();BH1750_I2C_SCL_0();i2c_Delay();
}
/*
*********************************************************************************************************
* 函 数 名: i2c_Start
* 功能说明: CPU发起I2C总线停止信号
* 形    参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void i2c_Stop(void)
{/* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */BH1750_I2C_SDA_0();BH1750_I2C_SCL_1();i2c_Delay();BH1750_I2C_SDA_1();
}
/*
*********************************************************************************************************
* 函 数 名: i2c_SendByte
* 功能说明: CPU向I2C总线设备发送8bit数据
* 形    参:_ucByte : 等待发送的字节
* 返 回 值: 无
*********************************************************************************************************
*/
void i2c_SendByte(uint8_t _ucByte)
{uint8_t i;/* 先发送字节的高位bit7 */for (i = 0; i < 8; i++){   if (_ucByte & 0x80){BH1750_I2C_SDA_1();}else{BH1750_I2C_SDA_0();}i2c_Delay();BH1750_I2C_SCL_1();i2c_Delay();  BH1750_I2C_SCL_0();if (i == 7){BH1750_I2C_SDA_1(); // 释放总线}_ucByte <<= 1;  /* 左移一个bit */i2c_Delay();}
}
/*
*********************************************************************************************************
* 函 数 名: i2c_ReadByte
* 功能说明: CPU从I2C总线设备读取8bit数据
* 形    参:无
* 返 回 值: 读到的数据
*********************************************************************************************************
*/
uint8_t i2c_ReadByte(void)
{uint8_t i;uint8_t value;/* 读到第1个bit为数据的bit7 */value = 0;for (i = 0; i < 8; i++){value <<= 1;BH1750_I2C_SCL_1();i2c_Delay();if (BH1750_I2C_SDA_READ()){value++;}BH1750_I2C_SCL_0();i2c_Delay();}return value;
}
/*
*********************************************************************************************************
* 函 数 名: i2c_WaitAck
* 功能说明: CPU产生一个时钟,并读取器件的ACK应答信号
* 形    参:无
* 返 回 值: 返回0表示正确应答,1表示无器件响应
*********************************************************************************************************
*/
uint8_t i2c_WaitAck(void)
{uint8_t re;BH1750_I2C_SDA_1(); /* CPU释放SDA总线 */i2c_Delay();BH1750_I2C_SCL_1(); /* CPU驱动SCL = 1, 此时器件会返回ACK应答 */i2c_Delay();if (BH1750_I2C_SDA_READ())  /* CPU读取SDA口线状态 */re = 1;elsere = 0;BH1750_I2C_SCL_0();i2c_Delay();return re;
}
/*
*********************************************************************************************************
* 函 数 名: i2c_Ack
* 功能说明: CPU产生一个ACK信号
* 形    参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void i2c_Ack(void)
{BH1750_I2C_SDA_0(); /* CPU驱动SDA = 0 */i2c_Delay();BH1750_I2C_SCL_1(); /* CPU产生1个时钟 */i2c_Delay();BH1750_I2C_SCL_0();i2c_Delay();BH1750_I2C_SDA_1(); /* CPU释放SDA总线 */
}
/*
*********************************************************************************************************
* 函 数 名: i2c_NAck
* 功能说明: CPU产生1个NACK信号
* 形    参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void i2c_NAck(void)
{BH1750_I2C_SDA_1(); /* CPU驱动SDA = 1 */i2c_Delay();BH1750_I2C_SCL_1(); /* CPU产生1个时钟 */i2c_Delay();BH1750_I2C_SCL_0();i2c_Delay();  
}
/*
*********************************************************************************************************
* 函 数 名: I2C_BH1750_GPIOConfig
* 功能说明: 配置I2C总线的GPIO,采用模拟IO的方式实现
* 形    参:无
* 返 回 值: 无
*********************************************************************************************************
*/
static void I2C_BH1750_GPIOConfig(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(BH1750_RCC_I2C_PORT, ENABLE);  /* 打开GPIO时钟 */GPIO_InitStructure.GPIO_Pin = BH1750_I2C_SCL_PIN | BH1750_I2C_SDA_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;    /* 开漏输出 */GPIO_Init(BH1750_GPIO_PORT_I2C, &GPIO_InitStructure);/* 给一个停止信号, 复位I2C总线上的所有设备到待机模式 */i2c_Stop();
}
/*
*********************************************************************************************************
* 函 数 名: i2c_CheckDevice
* 功能说明: 检测I2C总线设备,CPU向发送设备地址,然后读取设备应答来判断该设备是否存在
* 形    参:_Address:设备的I2C总线地址
* 返 回 值: 返回值 0 表示正确, 返回1表示未探测到
*********************************************************************************************************
*/
uint8_t i2c_CheckDevice(uint8_t _Address)
{uint8_t ucAck;i2c_Start();    /* 发送启动信号 *//* 发送设备地址+读写控制bit(0 = w, 1 = r) bit7 先传 */i2c_SendByte(_Address | BH1750_I2C_WR);ucAck = i2c_WaitAck();  /* 检测设备的ACK应答 */i2c_Stop();     /* 发送停止信号 */return ucAck;
}
//BH1750写一个字节
//返回值 成功:0    失败:非0 
uint8_t BH1750_Byte_Write(uint8_t data)
{i2c_Start();//发送写地址i2c_SendByte(BH1750_Addr|0);if(i2c_WaitAck()==1)return 1;//发送控制命令i2c_SendByte(data);if(i2c_WaitAck()==1)return 2;i2c_Stop();return 0;
}
//BH1750读取测量数据
//返回值 成功:返回光照强度   失败:返回0
uint16_t BH1750_Read_Measure(void)
{uint16_t receive_data=0; i2c_Start();//发送读地址i2c_SendByte(BH1750_Addr|1);if(i2c_WaitAck()==1)return 0;//读取高八位receive_data=i2c_ReadByte();i2c_Ack();//读取低八位receive_data=(receive_data<<8)+i2c_ReadByte();i2c_NAck();i2c_Stop();return receive_data;  //返回读取到的数据
}//BH1750s上电
void BH1750_Power_ON(void)
{BH1750_Byte_Write(POWER_ON);
}
//BH1750s断电
void BH1750_Power_OFF(void)
{BH1750_Byte_Write(POWER_OFF);
}
//BH1750复位  仅在上电时有效
void BH1750_RESET(void)
{BH1750_Byte_Write(MODULE_RESET);
}//BH1750初始化
uint8_t BH1750_Init(void)
{I2C_BH1750_GPIOConfig();    /* 配置GPIO */BH1750_Power_ON();  //BH1750s上电//BH1750_RESET();     //BH1750复位return BH1750_Byte_Write(Measure_Mode);//SysTick_Delay_ms(120);
}
//获取光照强度
int LIght_Intensity(void)
{float v;v = (float)(BH1750_Read_Measure()/1.1f*Resolurtion);return (int) v;
}

bh1750.h

#ifndef __BH1750_H
#define __BH1750_H   
#include "stm32f10x.h"
//BH1750的地址
#define BH1750_Addr       0x46//0x46//BH1750指令码
#define POWER_OFF         0x00
#define POWER_ON          0x01
#define MODULE_RESET      0x07
#define CONTINUE_H_MODE   0x10
#define CONTINUE_H_MODE2  0x11
#define CONTINUE_L_MODE   0x13
#define ONE_TIME_H_MODE   0x20
#define ONE_TIME_H_MODE2  0x21
#define ONE_TIME_L_MODE   0x23//测量模式
#define Measure_Mode      CONTINUE_H_MODE//分辨率 光照强度(单位lx)=(High Byte  + Low Byte)/ 1.2 * 测量精度
#if ((Measure_Mode==CONTINUE_H_MODE2)|(Measure_Mode==ONE_TIME_H_MODE2))#define Resolurtion   0.5
#elif ((Measure_Mode==CONTINUE_H_MODE)|(Measure_Mode==ONE_TIME_H_MODE))#define Resolurtion   1
#elif ((Measure_Mode==CONTINUE_L_MODE)|(Measure_Mode==ONE_TIME_L_MODE))#define Resolurtion   4
#endif#define BH1750_I2C_WR 0   /* 写控制bit */
#define BH1750_I2C_RD 1   /* 读控制bit *//* 定义I2C总线连接的GPIO端口, 只需要修改下面4行代码即可任意改变SCL和SDA的引脚 */
#define BH1750_GPIO_PORT_I2C  GPIOB     /* GPIO端口 */
#define BH1750_RCC_I2C_PORT   RCC_APB2Periph_GPIOB    /* GPIO端口时钟 */
#define BH1750_I2C_SCL_PIN    GPIO_Pin_14      /* 连接到SCL时钟线的GPIO */
#define BH1750_I2C_SDA_PIN    GPIO_Pin_15      /* 连接到SDA数据线的GPIO *//* 定义读写SCL和SDA的宏,已增加代码的可移植性和可阅读性 */#define BH1750_I2C_SCL_1()  GPIO_SetBits(BH1750_GPIO_PORT_I2C, BH1750_I2C_SCL_PIN)    /* SCL = 1 */#define BH1750_I2C_SCL_0()  GPIO_ResetBits(BH1750_GPIO_PORT_I2C, BH1750_I2C_SCL_PIN)    /* SCL = 0 */#define BH1750_I2C_SDA_1()  GPIO_SetBits(BH1750_GPIO_PORT_I2C, BH1750_I2C_SDA_PIN)    /* SDA = 1 */#define BH1750_I2C_SDA_0()  GPIO_ResetBits(BH1750_GPIO_PORT_I2C, BH1750_I2C_SDA_PIN)    /* SDA = 0 */#define BH1750_I2C_SDA_READ()  GPIO_ReadInputDataBit(BH1750_GPIO_PORT_I2C, BH1750_I2C_SDA_PIN)  /* 读SDA口线状态 */void i2c_Start(void);
void i2c_Stop(void);
void i2c_SendByte(uint8_t _ucByte);
uint8_t i2c_ReadByte(void);
uint8_t i2c_WaitAck(void);
void i2c_Ack(void);
void i2c_NAck(void);
uint8_t i2c_CheckDevice(uint8_t _Address);uint8_t BH1750_Init(void);      //未包含IIC初始化
int LIght_Intensity(void);  //读取光照强度的值
uint8_t BH1750_Byte_Write(uint8_t data);
uint16_t BH1750_Read_Measure(void);
void BH1750_Power_ON(void);
void BH1750_Power_OFF(void);
void BH1750_RESET(void);#endif

3. 参考文献

[1] 原创力文档:https://max.book118.com/html/2022/0404/5140311013004211.shtm

4. 总结

以上即是本次的内容。
1.代码中的"dht11.c"、“dht11.h”、“sys.h”、“bh1750.c”、"bh1750.h"可在我的博客中下载。
2. 部分资料来源于网络和开发手册,如有侵权请联系我删除

相关文章:

温湿度传感器(DHT11)以及光照强度传感器(BH1750)的使用

前言 对于一些单片机类的环境检测或者智能家居小项目中&#xff0c;温湿度传感器&#xff08;DHT11&#xff09;以及光照强度传感器&#xff08;BH1750&#xff09;往往是必不可少的两个外设&#xff0c;下面我们来剖析这两个外设的原理&#xff0c;以及使用。 1. 温湿度传感…...

ActiveMQ 04 Linux下安装

Active MQ 04 Linux下安装 下载 解压 在init.d下建立软连接 ln -s /usr/local/activemq/bin/activemq ./设置开启启动 chkconfig activemq on 服务管理 service activemq start service activemq status service activemq stopNIO配置 默认配置为tcp&#xff0c;使用的…...

.pyc 文件是什么?是否有必要同步到 GitHub 远程仓库?

git status 时发现有很多 .pyc 的没有被 add (env) username:~/path/to/project$ git status On branch main Your branch is up to date with origin/main.Changes to be committed:(use "git restore --staged <file>..." to unstage)new file: xxx.pyCha…...

Zookeeper的集群搭建和ZAB协议详解

Zookeeper的集群搭建 1&#xff09;zk集群中的角色 Zookeeper集群中的节点有三个角色&#xff1a; Leader&#xff1a;处理集群的所有事务请求&#xff0c;集群中只有一个LeaderFollwoer&#xff1a;只能处理读请求&#xff0c;参与Leader选举Observer&#xff1a;只能处理读…...

STM32 MPU配置参数

TXE LEVEL一般只用MPU_TEX_LEVEL0 1 - 1 - 1 -0性能最强&#xff08;TEX - C - B- S&#xff09;. #define MPU_TEX_LEVEL0 ((uint8_t)0x00) #define MPU_TEX_LEVEL1 ((uint8_t)0x01) #define MPU_TEX_LEVEL2 ((uint8_t)0x02) 基于上表进行常用配置 &#xff…...

Kafka概述

目录 1、为什么需要消息队列&#xff08;MQ&#xff09; 2、使用消息队列的好处 3、消息队列的两种模式 4、Kafka 定义 5、Kafka 简介 6、Kafka 的特性 7、Kafka 系统架构 8、Partation 数据路由规则 9、分区的原因 1、为什么需要消息队列&#xff08;MQ&#xff09; …...

OpenHarmony编译构建系统

这篇来聊聊OpenHarmony的编译构建&#xff0c;经过前面的实践&#xff0c;再来看编译构建。 编译构建概述 在官网中提到了&#xff0c;OpenHarmony编译子系统是以GN和Ninja构建为基座&#xff0c;对构建和配置粒度进行部件化抽象、对内建模块进行功能增强、对业务模块进行功能…...

Qt5 编译oracle数据库驱动

库文件 1、Qt源码目录&#xff1a;D:\Qt5\5.15.2\Src\qtbase\src\plugins\sqldrivers\oci 2、oracle客户端SDK: https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html 下载各版本中的如下压缩包&#xff0c;一定要版本相同的 将两个压缩包…...

UE5学习日记——实现自定义输入及监听输入,组合出不同的按键输入~

UE5的自定义按键和UE4有所不同&#xff0c;在这里记录一下。 本文主要是记录如何设置UE5的自定义按键&#xff0c;重点是学会原理&#xff0c;实际开发时结合实际情况操作。 输入映射 1. 创建输入操作 输入操作并不是具体的按键映射&#xff0c;而是按键的激活方式&#xff0…...

为什么把script标签放在div下面?

放在底部可以优先加载页面的内容结构,提升页面渲染速度。只有等到HTML解析完成后,才会开始执行main.js,避免JS阻塞页面解析&#xff0c; 同时main.js里可能会操作DOM,如果放头部,可能会找不到节点而报错 <body><div id"root"><App></App>&l…...

Git 自定义命令

前言 在使用 hexo 搭建个人博客时&#xff0c;共两种部署的方法。分别为&#xff1a; 本地利用 hexo 的插件 hexo-deployer-git 来实现部署&#xff0c;缺点是需要多敲几个命令行且不方便对源码进行云端备份使用 Github Action 的 workflow 自动化部署&#xff0c;优势就是可…...

SpringBoot多数据源配置及使用

1.application.properties数据配置 首先现在配置文件中定义三个数据库相关信息 # 数据库1 targetLibraryMain.datasource.url jdbc:kingbase8://127.0.0.1:54321/DATA_ONE?useUnicodetrue&characterEncodingutf8&serverTimezoneGMT%2B8&allowMultiQueriestrue …...

12-项目部署_持续集成

项目部署_持续集成 1 今日内容介绍 1.1 什么是持续集成 持续集成&#xff08; Continuous integration &#xff0c; 简称 CI &#xff09;指的是&#xff0c;频繁地&#xff08;一天多次&#xff09;将代码集成到主干 持续集成的组成要素 一个自动构建过程&#xff0c; 从…...

文献阅读:LESS: Selecting Influential Data for Targeted Instruction Tuning

文献阅读&#xff1a;LESS: Selecting Influential Data for Targeted Instruction Tuning 1. 文章简介2. 方法介绍 1. Overview2. 原理说明 1. SGD上的定义2. Adam上的定义 3. 具体实现 1. Overview1. LoRA使用2. 数据选择3. LESS-T 3. 实验考察 & 结论 1. 实验设计2. 主…...

应对中年危机-高效学习

兴致勃勃的打开一本书&#xff0c;从第一行&#xff0c;第一个字开始&#xff0c;十分钟later……两眼皮一塌&#xff0c;哎&#xff0c;想睡觉了&#xff0c;真助眠。但其实我并不懒啊。 过去我是上诉这样&#xff0c;现在有了改善。如果你也是这样&#xff0c;希望看完了本文…...

Java二叉树(2)

一、二叉树的链式存储 二叉树的存储分为顺序存储和链式存储 &#xff08;本文主要讲解链式存储&#xff09; 二叉树的链式存储是通过一个一个节点引用起来的&#xff0c;常见的表示方式有二叉三叉 // 孩子表示法 class Node { int val; // 数据域 Node left; // 左孩子的引用…...

关于AG32 MCU的一些奇思妙想

1、AG32VF103的网口是100M还是10M&#xff1f; RE: 都是100M的。 2、用FPGA能不能再仿出一个网口&#xff1f;有些产品用到两个网口。 理论上可以&#xff0c;但是要考虑&#xff0c;一个是cpld实现难度&#xff0c;一个是需要的逻辑单元。因为mac逻辑多&#xff0c;内置的2KL…...

除了sql外还有那些查询语言

除了SQL&#xff08;结构化查询语言&#xff09;外&#xff0c;还有许多其他的查询语言&#xff0c;包括但不限于XQuery&#xff08;对XML的查询语言&#xff09;、MDX&#xff08;多维查询语言&#xff0c;用于分析数据仓库&#xff09;、DQL&#xff08;数据查询语言&#xf…...

构建第一个ArkTS用的资源分类与访问

应用开发过程中&#xff0c;经常需要用到颜色、字体、间距、图片等资源&#xff0c;在不同的设备或配置中&#xff0c;这些资源的值可能不同。 应用资源&#xff1a;借助资源文件能力&#xff0c;开发者在应用中自定义资源&#xff0c;自行管理这些资源在不同的设备或配置中的表…...

JVM中都有哪些引用类型

● 强引用&#xff1a;JVM中默认引用关系就是强引用&#xff0c;即是对象被局部变量、静态变量等GC Root关联的对象引用&#xff0c;只要这层关系存在&#xff0c;普通对象就不会被回收 ● 软引用&#xff1a;软引用相对于强引用是一种比较弱的引用关系&#xff0c;如果一个对象…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一&#xff1a;HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二&#xff1a;Floyd 快慢指针法&#xff08;…...

大数据治理的常见方式

大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法&#xff0c;以下是几种常见的治理方式&#xff1a; 1. 数据质量管理 核心方法&#xff1a; 数据校验&#xff1a;建立数据校验规则&#xff08;格式、范围、一致性等&#xff09;数据清洗&…...

2.2.2 ASPICE的需求分析

ASPICE的需求分析是汽车软件开发过程中至关重要的一环&#xff0c;它涉及到对需求进行详细分析、验证和确认&#xff0c;以确保软件产品能够满足客户和用户的需求。在ASPICE中&#xff0c;需求分析的关键步骤包括&#xff1a; 需求细化&#xff1a;将从需求收集阶段获得的高层需…...