SHT30温湿度传感器全解析——概况,性能,MCU连接,样例代码
常见温湿度传感器测量范围:(价格仅供参考,具体性能要看折线图)
型号 | DHT11 | DHT20 | AHT10 | AHT20 | AHT30 | SHT20 |
---|---|---|---|---|---|---|
价格 | ¥ 2.49 | ¥3.04 | ¥ 1.9 | ¥1.4 | ¥ 1.3 | ¥5.5 |
温度测量范围 | 20—90%RH | 0—100%RH | 0—100%RH | 0—100%RH | 0—100%RH | 0—100%RH |
湿度测量精度 | ±5%RH | ±3%RH | ±2%RH | ±2%RH | ±2%RH | ±2%RH |
温度测量范围 | 0—50℃ | -40—80℃ | -40—85℃ | -40—85℃ | -40—85℃ | -40—125℃ |
温度测量精度 | ±2℃ | ±0.5℃ | ±0.3℃ | ±0.3℃ | ±0.3℃ | ±0.3℃ |
工作电压 | DC5V/3.3V | DC5V/3.3V | DC3.3V | DC5V/3.3V | DC5V/3.3V | DC5V/3.3V |
型号 | SHT30 | SHT31 | SHT35 | SHT40 | SHT41 | SHT45 |
---|---|---|---|---|---|---|
价格 | ¥ 3.9 | ¥ 6.9 | ¥ 18.5 | ¥ 3.25 | ¥6.6 | ¥ 19 |
温度测量范围 | 0—100%RH | 0—100%RH | 0—100%RH | 0—100%RH | 0—100%RH | 0—100%RH |
湿度测量精度 | ±2%RH | ±2%RH | ±1.5%RH | ±1.8%RH | ±1.8%RH | ±1.5%RH |
温度测量范围 | -40—125℃ | -40—125℃ | -40—125℃ | -40—125℃ | -40—125℃ | -40—125℃ |
温度测量精度 | ±0.2℃ | ±0.2℃ | ±0.1℃ | ±0.2℃ | ±0.2℃ | ±0.1℃ |
工作电压 | DC5V/3.3V | DC5V/3.3V | DC5V/3.3V | DC3.3V | DC3.3V | DC3.3V |
SHT30概述
数据:
SHT30是一款完全校准的线性化的温湿度数字传感器,增强了数字信号。I2C通讯频率达1MHz。具有高可靠性及高稳定性。
供电:
供电电压2.15V-5.5V;数据接口电压可5V或3.3V(不同供电系统可对接,但尽量避免)。
功能:
单次读取或周期性读取温度和湿度传感器数值,通过公式转换为摄氏度和相对湿度值。
连接:
使用I2C进行连接,也可使用普通GPIO引脚模拟I2C进行通讯,但通讯速率较低。
SHT30引脚说明
引脚 | 名称 | 功能 |
---|---|---|
1 | SDA | 数据信号 |
2 | ADDR | 连接到高电平或低电平,不可以悬空 |
3 | ALERT | 报警引脚,不用必须悬空 |
4 | SCL | 时钟信号 |
5 | VDD | 电源正极 |
6 | nRESET | 低电平复位;如果不使用,建议悬空;也可以使用大于2Ω电阻连接到VDD |
7 | R | 无功能,请连到电源地 |
8 | VSS | 电源地 |
9 | pad | 中间引脚与电源地相通,散热引脚 |
SHT30电气特性
温度误差:
湿度误差:
SHT30 MCU连接
Rp是I2C上拉电阻,I2C总线上只连接一个设备时,推荐阻值为10K,其他视情况而定,该数值不能太小也不能太大。
SDA,SCL接上拉电阻后再接MCU,用于数据读取。
nRESET不用时悬空。
ALERT不用时悬空。
SHT30通信协议
SHT30的通讯协议是基于I2C的,这里主要理解I2C通讯协议。
SHT30写命令顺序:
1、设置I2C Start。此时I2C状态为0x08:已发送起始条件
2、发送SHT30的I2C写地址。(注意,上图中ADDR接地,则设备地址为0x44;若ADDR接高电平,则设备地址为0x45。同时该地址为7位,再加读写标志位1位才凑够8byte,写时读写标志位为零,则该byte为0x44<<1。)
3、等待收到SHT30的确认ACK。 此时I2C状态为0x18:已发送设备地址和写命令,已接收到ACK
4、发送控制命令高字节。
5、等待收到SHT30的确认ACK。 此时I2C状态为0x28:已发送1byte数据,已接收到ACK
6、发送控制命令低字节。
7、等待收到SHT30的确认ACK。 此时I2C状态为0x28:已发送1byte数据,已接收到ACK
8、如无后续数据,设置I2C Stop。(SHT30写命令只有这一种)
如周期性数据测量模式命令(Command 0x2220)
SHT30读命令顺序:(先和写命令一样,写入一个命令数据,再读取温湿度数据)
1、设置I2C Start。此时I2C状态为0x08:已发送起始条件
2、发送SHT30的I2C写地址。(注意,上图中ADDR接地,则设备地址为0x44;若ADDR接高电平,则设备地址为0x45。同时该地址为7位,再加读写标志位1位才凑够8byte,写时读写标志位为零,则该byte为0x44<<1。)
3、等待收到SHT30的确认ACK。 此时I2C状态为0x18:已发送设备地址和写命令,已接收到ACK
4、发送控制命令高字节。
5、等待收到SHT30的确认ACK。 此时I2C状态为0x28:已发送1byte数据,已接收到ACK
6、发送控制命令低字节。
7、等待收到SHT30的确认ACK。 此时I2C状态为0x28:已发送1byte数据,已接收到ACK
8、如使用周期性测量命令设定过SHT30,则无需等待,重新设置I2C Start。 此时I2C状态为0x08:已发送起始条件
9、发送SHT30的I2C读地址。(注意,上图中ADDR接地,则设备地址为0x44;若ADDR接高电平,则设备地址为0x45。同时该地址为7位,再加读写标志位1位才凑够8byte,读时读写标志位为1,则该byte为0x44<<1|0x01。)
10、等待收到SHT30的确认ACK。 此时I2C状态为0x40:已发送设备地址和读命令,已接收到ACK
11、设置使能主机应答功能,即主机进行接收数据后发送ACK确认。
12、接收温度高字节。 此时I2C状态为0x50:已接收数据字节,并已返回ACK信号
13、接收温度低字节。 此时I2C状态为0x50:已接收数据字节,并已返回ACK信号
14、接收温度CRC字节。 此时I2C状态为0x50:已接收数据字节,并已返回ACK信号
15、接收湿度高字节。 此时I2C状态为0x50:已接收数据字节,并已返回ACK信号
16、接收湿度低字节。 此时I2C状态为0x50:已接收数据字节,并已返回ACK信号
17、设置关闭主机应答功能,最后一个数据不需要ACK。
17、接收湿度CRC字节。 此时I2C状态为0x58:已接收到最后一个数据,NACK已返回
18、设置I2C Stop.
如读取周期性数据测量数据命令(Command 0xE000)
SHT30命令说明
单次测量命令:(单次读取使用,通讯中需要等待测量结果)
周期测量命令:(mps,每秒多少次。设置使用,用于设置周期测量模式)
读取周期测量结果命令:(读取使用,读取上一次周期测量的测量结果。)
加速相应时间命令:(周期测量命令一样的功能,不过更快,周期更短)
停止周期测量命令:(设置使用,用于停止周期测量))
软件重置命令:(使用命令进行重置,此外使用I2C协议的一般重置功能也能进行重置。经实验下图最后一个ACK收不到,可能是因为收到重置命令后立即重置所以就没有发送ACK。)
加热器控制命令:(可加热几摄氏度,用于检测设备好坏。)
读取状态寄存器:(可获取各种设备状态)
设备状态说明:
清除状态寄存器:
SHT30校验和计算
校验使用CRC-8:
代码说明:
uint8_t CheckCrc8(uint8_t* const message, uint8_t initial_value)
{uint8_t remainder; //余数uint8_t i = 0, j = 0; //循环变量/* 初始化 */remainder = initial_value;for(j = 0; j < 2;j++){remainder ^= message[j];/* 从最高位开始依次计算 */for (i = 0; i < 8; i++){if (remainder & 0x80){remainder = (remainder << 1)^CRC8_POLYNOMIAL;}else{remainder = (remainder << 1);}}}/* 返回计算的CRC码 */return remainder;
}
计算温度:(ST 传感器温度返回值)
计算湿度:(SRH 传感器湿度返回值)
代码说明:
/* 转换温度数据 */recv_temperature = ((uint16_t)dat[0]<<8)|dat[1];*temperature = -45 + 175*((float)recv_temperature / 65535);/* 转换湿度数据 */recv_humidity = ((uint16_t)dat[3]<<8)|dat[4];*humidity = 100 * ((float)recv_humidity / 65535);
SHT30 样例代码(基于HC32L130)
(样例代码使用周期性测量模式。先设置周期性测量模式,再通过读取周期性测量结果获得温湿度数据。)
sht3x.h文件
#ifndef __SHT3X_H__
#define __SHT3X_H__#include "gpio.h"/*
//ADDR Pin Conect to VSS
#define SHT30_ADDR_WRITE 0x44<<1 //10001000
#define SHT30_ADDR_READ (0x44<<1)+1 //10001011
*///SHT30 I2C地址
#define I2C_DEVADDR 0x44
//CRC-8多项式
#define CRC8_POLYNOMIAL 0x31typedef enum
{/* 软件复位命令 */SOFT_RESET_CMD = 0x30A2, /*单次测量模式命名格式:Repeatability_CS_CMDCS:Clock stretching*/HIGH_ENABLED_CMD = 0x2C06,MEDIUM_ENABLED_CMD = 0x2C0D,LOW_ENABLED_CMD = 0x2C10,HIGH_DISABLED_CMD = 0x2400,MEDIUM_DISABLED_CMD = 0x240B,LOW_DISABLED_CMD = 0x2416,/*周期测量模式命名格式:Repeatability_MPS_CMDMPS:measurement per second*/HIGH_0_5_CMD = 0x2032,MEDIUM_0_5_CMD = 0x2024,LOW_0_5_CMD = 0x202F,HIGH_1_CMD = 0x2130,MEDIUM_1_CMD = 0x2126,LOW_1_CMD = 0x212D,HIGH_2_CMD = 0x2236,MEDIUM_2_CMD = 0x2220,LOW_2_CMD = 0x222B,HIGH_4_CMD = 0x2334,MEDIUM_4_CMD = 0x2322,LOW_4_CMD = 0x2329,HIGH_10_CMD = 0x2737,MEDIUM_10_CMD = 0x2721,LOW_10_CMD = 0x272A,/* 周期测量模式读取数据命令 */READOUT_FOR_PERIODIC_MODE = 0xE000,
} SHT30_CMD;void I2C_Port_Init(void);
void I2C_Cfg_Init(void);
void SHT30_reset(void);
uint8_t SHT30_Init(void);
uint8_t SHT30_Send_Cmd(SHT30_CMD cmd);
uint8_t SHT30_Read_Dat(uint8_t* dat);
uint8_t SHT30_Dat_To_Float(uint8_t* const dat, float* temperature, float* humidity);#endif /* __SHT3X_H__ */
sht3x.c文件
#include "sht3x.h"
#include "gpio.h"
#include "i2c.h"// I2C端口配置
void I2C_Port_Init(void)
{stc_gpio_cfg_t stcGpioCfg;DDL_ZERO_STRUCT(stcGpioCfg);Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //开启GPIO时钟门控 stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置->输出 stcGpioCfg.enOD = GpioOdEnable; ///< 开漏输出stcGpioCfg.enPu = GpioPuEnable; ///< 端口上拉配置->使能stcGpioCfg.enPd = GpioPdDisable; ///< 端口下拉配置->禁止stcGpioCfg.bOutputVal = TRUE;Gpio_Init(GpioPortB,GpioPin13,&stcGpioCfg); ///< 端口初始化Gpio_Init(GpioPortB,GpioPin14,&stcGpioCfg);Gpio_SetAfMode(GpioPortB,GpioPin13,GpioAf2); ///< 配置PB13为SCLGpio_SetAfMode(GpioPortB,GpioPin14,GpioAf2); ///< 配置PB14为SDA
}// I2C 模块配置
void I2C_Cfg_Init(void)
{stc_i2c_cfg_t stcI2cCfg;DDL_ZERO_STRUCT(stcI2cCfg); ///< 初始化结构体变量的值为0Sysctrl_SetPeripheralGate(SysctrlPeripheralI2c1,TRUE); ///< 开启I2C0时钟门控stcI2cCfg.u32Pclk = Sysctrl_GetPClkFreq(); ///< 获取PCLK时钟stcI2cCfg.u32Baud = 100000; ///< 100kHz,SHT30最大支持1MHz,但要I2C fast mode,且硬件设计过关stcI2cCfg.enMode = I2cMasterMode; ///< 主机模式stcI2cCfg.u8SlaveAddr = 0x55; ///< 从地址,主模式无效stcI2cCfg.bGc = FALSE; ///< 广播地址应答使能关闭I2C_Init(M0P_I2C1,&stcI2cCfg); ///< 模块初始化
}// CRC-8校验
uint8_t CheckCrc8(uint8_t* const message, uint8_t initial_value)
{uint8_t remainder; //余数uint8_t i = 0, j = 0; //循环变量/* 初始化 */remainder = initial_value;for(j = 0; j < 2;j++){remainder ^= message[j];/* 从最高位开始依次计算 */for (i = 0; i < 8; i++){if (remainder & 0x80){remainder = (remainder << 1)^CRC8_POLYNOMIAL;}else{remainder = (remainder << 1);}}}/* 返回计算的CRC码 */return remainder;
}// SHT30写命令函数,只进行写命令操作
en_result_t I2C_SHT30WriteCmd(M0P_I2C_TypeDef* I2CX,uint8_t *pu8Data)
{en_result_t enRet = Error;uint8_t sendCount=0,u8State;I2C_SetFunc(I2CX,I2cStart_En); ///发送起始条件while(1){while(0 == I2C_GetIrq(I2CX)){;}u8State = I2C_GetState(I2CX);switch(u8State){case 0x08: ///已发送起始条件I2C_ClearFunc(I2CX, I2cStart_En);I2C_WriteByte(I2CX,(I2C_DEVADDR<<1)); ///发送设备地址+W写标志0break;case 0x18: ///已发送SLW+W,已接收ACKcase 0x28: ///已发送I2Cx_DATA中的数据,已接收ACKif(sendCount<2){I2C_WriteByte(I2CX,pu8Data[sendCount++]); ///发送数据}else{//发送两字节命令后收到ACK,退出sendCount++;}break;case 0x20: ///已发送SLW+W,已接收非ACKcase 0x38: ///上一次在SLA+写数据时丢失仲裁I2C_SetFunc(I2CX,I2cStart_En); ///当I2C总线空闲时发送起始条件break;case 0x30: ///已发送I2Cx_DATA中的数据,已接收非ACK,将传输一个STOP条件I2C_SetFunc(I2CX,I2cStop_En); ///发送停止条件break;default:break;} if(sendCount>2){I2C_SetFunc(I2CX,I2cStop_En); ///此顺序不能调换,出停止条件I2C_ClearIrq(I2CX);break;}I2C_ClearIrq(I2CX); ///清除中断状态标志位}enRet = Ok;return enRet;
}// 主机读取数据函数,只进行读数据操作
en_result_t I2C_MasterReadData(M0P_I2C_TypeDef* I2CX,uint16_t u8Cmd,uint8_t *pu8Data,uint32_t u32Len)
{en_result_t enRet = Error;uint8_t u8State=0;uint8_t receiveCount=0;uint8_t sendAddrCount=0;uint8_t sendCmdCount=0;I2C_SetFunc(I2CX,I2cStart_En);while(1){while(0 == I2C_GetIrq(I2CX)){;}u8State = I2C_GetState(I2CX);switch(u8State){case 0x08: ///< 已发送起始条件,将发送SLA+WsendAddrCount++;if(sendAddrCount<=1){I2C_ClearFunc(I2CX,I2cStart_En);I2C_WriteByte(I2CX,I2C_DEVADDR<<1); }if(sendAddrCount>1){I2C_ClearFunc(I2CX,I2cStart_En);I2C_WriteByte(I2CX,I2C_DEVADDR<<1|0x01);///< 发送SLA+R,开始从从机读取数据 }break;case 0x18: ///< 已发送SLA+W,并接收到ACKI2C_WriteByte(I2CX,(uint8_t)(u8Cmd>>8)); ///<命令高8位break;case 0x28: ///< 已发送数据,接收到ACK, 此处是已发送从机内存地址u8Addr并接收到ACKsendCmdCount++;I2C_WriteByte(I2CX,(uint8_t)u8Cmd); ///<命令低8位if(sendCmdCount>1)I2C_SetFunc(I2CX,I2cStart_En); ///< 发送重复起始条件break;case 0x10: ///< 已发送重复起始条件I2C_ClearFunc(I2CX,I2cStart_En);I2C_WriteByte(I2CX,I2C_DEVADDR|0x01); ///< 发送SLA+R,开始从从机读取数据break;case 0x40: ///< 已发送SLA+R,并接收到ACKif(u32Len>1){I2C_SetFunc(I2CX,I2cAck_En); ///< 使能主机应答功能}break;case 0x50: ///< 已接收数据字节,并已返回ACK信号pu8Data[receiveCount++] = I2C_ReadByte(I2CX);if(receiveCount==u32Len-1){I2C_ClearFunc(I2CX,I2cAck_En); ///< 已接收到倒数第二个字节,关闭ACK应答功能}break;case 0x58: ///< 已接收到最后一个数据,NACK已返回pu8Data[receiveCount++] = I2C_ReadByte(I2CX);I2C_SetFunc(I2CX,I2cStop_En); ///< 发送停止条件break;case 0x38: ///< 在发送地址或数据时,仲裁丢失I2C_SetFunc(I2CX,I2cStart_En); ///< 当总线空闲时发起起始条件break;case 0x48: ///< 发送SLA+R后,收到一个NACKI2C_SetFunc(I2CX,I2cStop_En); ///< 发送停止条件I2C_SetFunc(I2CX,I2cStart_En); ///< 发送起始条件break;default:I2C_SetFunc(I2CX,I2cStart_En); ///< 其他错误状态,重新发送起始条件break;}I2C_ClearIrq(I2CX); ///< 清除中断状态标志位if(receiveCount==u32Len) ///< 数据全部读取完成,跳出while循环{break;}}enRet = Ok;return enRet;
}// 向SHT30发送一条指令(16bit)
uint8_t SHT30_Send_Cmd(SHT30_CMD cmd)
{uint8_t cmd_buffer[2];cmd_buffer[0] = cmd >> 8;cmd_buffer[1] = cmd;return I2C_SHT30WriteCmd(M0P_I2C1, cmd_buffer);
}// 复位SHT30
void SHT30_reset(void)
{SHT30_Send_Cmd(SOFT_RESET_CMD);delay1us(20);
}// 初始化SHT30 周期测量模式0x2220
uint8_t SHT30_Init(void)
{return SHT30_Send_Cmd(MEDIUM_2_CMD);
}// 从SHT30读取一次数据
uint8_t SHT30_Read_Dat(uint8_t* dat)
{return I2C_MasterReadData(M0P_I2C1,READOUT_FOR_PERIODIC_MODE, dat, 6);
}// 将SHT30接收的6个字节数据进行CRC校验,并转换为温度值和湿度值
uint8_t SHT30_Dat_To_Float(uint8_t* const dat, float* temperature, float* humidity)
{uint16_t recv_temperature = 0;uint16_t recv_humidity = 0;/* 校验温度数据和湿度数据是否接收正确 */if(CheckCrc8(dat, 0xFF) != dat[2] || CheckCrc8(&dat[3], 0xFF) != dat[5])return 1;/* 转换温度数据 */recv_temperature = ((uint16_t)dat[0]<<8)|dat[1];*temperature = -45 + 175*((float)recv_temperature/65535);/* 转换湿度数据 */recv_humidity = ((uint16_t)dat[3]<<8)|dat[4];*humidity = 100 * ((float)recv_humidity / 65535);return 0;
}
main.c文件
#include "sht3x.h"
#include "gpio.h"
#include "ddl.h"
#include "i2c.h"uint8_t recv_dat[6] = {0};float temperature = 0.0;
float humidity = 0.0;int main(void)
{I2C_Cfg_Init();I2C_Port_Init();///< 向I2C总线发起开始信号I2C_SetFunc(M0P_I2C1,I2cStart_En); SHT30_Init();while (1){delay1ms(1000);if(SHT30_Read_Dat(recv_dat) == Ok){SHT30_Dat_To_Float(recv_dat, &temperature, &humidity);}}
}
相关文章:
SHT30温湿度传感器全解析——概况,性能,MCU连接,样例代码
常见温湿度传感器测量范围:(价格仅供参考,具体性能要看折线图) 型号DHT11DHT20AHT10AHT20AHT30SHT20价格¥ 2.49¥3.04¥ 1.9¥1.4¥ 1.3¥5.5温度测量范围20—90%RH0—100%RH0—100%RH0—…...
SQL server 同环比计算模板
1、计算 月 年 季度的环比和同比 计算公式如下: 环比增长率 (本期数 - 上期数) / |上期数| 100% 同比增长率 (本期数 - 同期数) / |同期数| * 100% --- dbo.ads_erp_finance_gross_profit_actual_invoice_yoy_m…...
python发送外部请求
在Python中,服务器发送外部请求是一个常见的操作,尤其是在需要集成不同服务或API时。有多种库可以帮助你完成这项任务,但最流行和广泛使用的库之一是requests。以下是如何使用requests库在Python服务器中发送外部请求的基本步骤: …...
c++并发编程面试题
1. C中lock_guard和unique_lock的区别? 在C中,lock_guard和unique_lock都是用于管理互斥锁的类,它们提供了一种 RAII(Resource Acquisition Is Initialization)机制来确保锁在作用域结束时自动释放。尽管它们的目的相…...
K8S上安装LongHorn(分布式块存储) --use
要在 Kubernetes上安装 LongHorn,您可以按照以下步骤进行操作: 准备工作 参考 官网教程将LongHorn只部署在k8s-worker5节点上。https://github.com/longhorn/longhorn 安装要求 Each node in the Kubernetes cluster where Longhorn is installed must f…...
2024年前端技术发展趋势分析
2024年的前端技术发展趋势继续受到快速变化的技术环境和不断增长的用户期望的影响。以下是2024年前端技术发展的几个关键趋势: 1. Web 组件和自定义元素 Web 组件技术(包括 Shadow DOM、HTML Templates 和 Custom Elements)正在成为构建可重…...
spring boot 笔记大杂烩
一,springboot项目创建 springboot创建时idea会打开start.spring.io失败报错 可以手动打开这个页面,然后选择maven项目,然后修改group和name名然后添加依赖web,然后生成项目包,解压缩后用idea打开就能用了 运行后报错…...
如何在香港云服务器上优化网站性能?
在香港云服务器上优化网站性能可以通过以下几种方式进行,确保用户从全球各地访问时获得快速、稳定的体验: 1. 使用内容分发网络 (CDN) 优势:CDN可以将静态内容(如图像、视频、CSS、JavaScript文件)缓存到全球多个节点…...
STM32低功耗与备用备份区域
STM的备份备用区域其实就是两个区块:BKP和RTC。低功耗则其实是STM32四种模式中的三种耗能很低的模式。 目录 一:备用区域 1.BKP 2.RTC 二:低功耗模式 1.睡眠模式: 2.停机模式: 3.待机模式: 一&…...
武汉某汽配公司携手三品软件 共绘PLM项目新蓝图
近日,三品软件与武汉某汽配公司达成战略合作,双方将共同启动PLM项目,以助力该公司在汽车制造业的研发管理领域实现全面升级。 客户简介 该公司自2008年成立以来,一直专注于为汽车制造业提供自动化输送系统、车辆装配的合装技术和…...
uniapp多图上传uni.chooseImage上传照片uni.uploadFile,默认上传9张图
uniapp多图上传uni.chooseImage上传照片uni.uploadFile 代码示例: /**上传照片 多图*/getImage() {uni.chooseImage({count: 9, //默认9sizeType: [original, compressed], //可以指定是原图还是压缩图,默认二者都有sourceType: [album], //从相册选择/…...
MySQL——内置函数
时间函数 select * from msg where date_add(sendtime, interval 2 minute) > now(); 理解: ------------------------------|-----------|-------------|------------------ 初始时间 now() 初始时间2min 字符串 length函数返回字符串长度,以字节为…...
2024年最新版小程序云开发数据模型的开通步骤,支持可视化数据库管理,支持Mysql和NoSql数据库,可以在vue3前端web里调用操作
小程序官方又改版了,搞得石头哥不得不紧急的再新出一版,教大家开通最新版的数据模型。官方既然主推数据模型,那我们就先看看看新版的数据模型到底是什么。 一,什么是数据模型 数据模型是什么 数据模型是一个用于组织和管理数据的…...
智慧水库大坝安全监测预警系统解决方案
前言 水库大坝作为重要的水利设施,承载着防洪涝、灌溉、发电等功能,关系着无数人的生命财产安全,一旦发生意外事故,后果将不堪设想,因此需要建立一套水库大坝安全监测预警系统解决方案。 系统概述 水库大坝安全监测…...
基于SpringBoot+VUE的社区团购系统(源码+文档+部署)
主要内容:Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能与大数据、单片机开发、物联网设计与开发设计、简历模板、学习资料、面试题库、技术互助、就业指导等 业务范围:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写…...
LeetCode 3151. 特殊数组 I【数组】简单【Py3,C++,Java,GO,Rust】
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...
超级字符串技能:提升你的编码游戏
嘿嘿,uu们,今天咱们来详解字符函数与字符串函数,好啦,废话不多讲,开干! 1.:字符分类函数 C语言中又一系列的函数是专门做字符分类的,也就是一个字符属于什么类型的字符的,这些函数的使用需要包含头文件ctype.h 这些函数的使用方法都十分类似,博主在这里就举两到三个…...
米联客-FPGA程序设计Verilog语法入门篇连载-16 Verilog语法_时钟分频设计
软件版本:无 操作系统:WIN10 64bit 硬件平台:适用所有系列FPGA 板卡获取平台:https://milianke.tmall.com/ 登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑! 1概述 本小节讲解Verilog语法的时钟…...
【Echarts】custom自定义图表实现甘特图
效果图 主要注意点: 1、右上角图例visualMap实现 2、visualMap增加formatter 3、series使用custom自定义图表,encode解析四维数组。核心是renderItem方法,必填项,且需要注意要全部定义在options里面!!&…...
【高等代数笔记】003线性方程组的解法(一)
1. 线性方程组的解法 1.1 解线性方程组的矩阵消元法 【例1】解线性方程组 { x 1 3 x 2 x 3 2 3 x 1 4 x 2 2 x 3 9 − x 1 − 5 x 2 4 x 3 10 2 x 1 7 x 2 x 3 1 \left\{\begin{array}{ll} x_{1}3x_{2}x_{3}2 \\ 3x_{1}4x_{2}2x_{3}9 \\ -x_{1}-5x_{2}4x_{3}10 \\…...
Scrapy入门教程
Scrapy入门教程:打造高效爬虫的第一步 1. 引言 在当今的网络世界中,信息是无价的资源。而爬虫工具则是获取这些资源的有力武器。Scrapy 是 Python 生态系统中最强大的爬虫框架之一,它不仅功能强大,而且易于扩展,适用…...
Microsoft VBA Excel VBA学习笔记——双重筛选+复制数值1.0
问题场景 CountryProductCLASS 1CLASS 2CLASS 3CLASS 4CLASS 5CLASS 6…USApple0.3641416030.8918210610.0591451990.7320110290.0509636560.222464259…USBanana0.2300833330.4027262180.1548836670.2988904860.7802326210.028592635…CNApple0.7762370470.5075548320.481978…...
谷歌反垄断官司败诉后,或又面临被拆分风险?
KlipC报道:上周8月5日,美国法院裁定谷歌的搜索业务违反了美国反垄断法,非法垄断在线搜索和搜索文本广告市场。据悉,胜诉的美国司法部正在考虑拆分谷歌。其他选项包括强制谷歌与竞争对手分享更多数据,以及防止其在人工智…...
数据结构入门——06树
1.树 树(Tree)非线性数据结构,它是n(n≥0)个节点的有限集合,它满足两个条件 : 有且仅有一个特定的称为根(Root)的节点; 其余的节点可以分为m(m…...
FFmpeg源码:av_packet_move_ref、av_packet_make_refcounted函数分析
一、av_packet_move_ref函数 (一)av_packet_move_ref函数的声明 av_packet_move_ref函数声明在FFmpeg源码(本文演示用的FFmpeg源码版本为7.0.1)的头文件libavcodec/packet.h中: /*** Move every field in src to ds…...
12 中断
12 中断 1、内核中断编程2、顶半部和底半部机制2.1 任务的相关概念2.1.1 分类2.1.2 优先级2.1.3 进程调度2.1.4 休眠sleep 2.2 顶半部和底半部实现机制2.2.1 顶半部特点2.2.2 底半部特点2.2.3 底半部实现方法之:tasklet2.2.4 底半部实现机制之工作队列2.2.5 底半部实现机制之软…...
经典算法题总结:十大排序算法,外部排序和Google排序简介
十大排序算法 就地性:顾名思义,原地排序通过在原数组上直接操作实现排序,无须借助额外的辅助数组,从而节省内存。通常情况下,原地排序的数据搬运操作较少,运行速度也更快。 稳定性:稳定排序在完…...
服务器是什么?怎么选择适合自己的服务器?
在这个数字化的世界中,我们每天都在与各种网站打交道,浏览新闻、购物、看视频等。你是否曾经好奇过,这些网站是如何运行的?它们又是如何实现随时随地可访问的呢? 在这背后,有一个神秘的角色在默默地支撑着…...
区块链技术的应用场景
区块链技术是一种分布式数据库或公共分类账的形式,它保证了数据的完整性和透明性。它最初是为了支持比特币这种加密货币而被发明的,但现在已经被广泛应用于多种领域,包括供应链管理、投票系统、数字身份验证等。 基本概念 区块 (Block) 区块…...
凤凰端子音频矩阵应用领域
凤凰端子音频矩阵,作为一种集成了凤凰端子接口的音频矩阵设备,具有广泛的应用领域。以下是其主要应用领域: 一、专业音响系统 会议系统:在会议室中,凤凰端子音频矩阵能够处理多个话筒和音频源的信号,实现…...
北京手机网站开发价格/中国十大软件外包公司
前言我们很多小伙伴平时都是做JAVA开发的,那么作为一名合格的工程师,你是否有仔细的思考过JVM的运行原理呢。如果懂得了JVM的运行原理和内存模型,像是一些JVM调优、垃圾回收机制等等的问题我们才能有一个更清晰的概念。为了走进JVM࿰…...
做移动网站优化快速排名软件/东莞营销网站建设优化
https://blog.csdn.net/shwan_ma/article/details/78879620 一般来说,打印tensorflow变量的函数有两个:tf.trainable_variables () 和 tf.all_variables()不同的是:tf.trainable_variables () 指的是需要训练的变量tf.all_variables() 指的是…...
坂田网站建设/全网关键词搜索工具
最近鹏哥在总结目前市面流行的开源软件,努力发现有价值的项目分享给大家。如果你看到下边的官网,是不是第一感觉是这绝对是一个商业软件的官网,鹏哥告诉你,你错了!这个就是今天鹏哥要推荐的项…...
wordpress今日更新/广州网站外包
一下是我整理的asp.net的论坛列表: 1。 discuz --------http://nt.discuz.net 2. dvbbs------------http://bbs.dvbbs.net 3. dXbbs ----------http://www.dxbbs.net(它的源码要用Reflector反编译一下)...
南通网站上百度首页/五年级下册数学优化设计答案
1.1 数据库系统概述 基本概念: 数据(Data) 信息(information) 我国著名的信息学专家钟义信教授认为“信息是事物存在方式或运动状态,以这种方式或状态直接或间接的表述”。 美国信息管理专家霍顿&#x…...
网站制作设计培训多少钱/电商运营
项目背景:自动建立词典的脚本,线上每天要更新RS的词典,需要在定期的从log平台上挖掘数据并建立词典,以便第二天更新线上词典。需要对建库的脚本定期的执行。作用:crontab是循环执行例行性的任务,每个用户都…...