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

SHT30温湿度传感器全解析——概况,性能,MCU连接,样例代码

常见温湿度传感器测量范围:(价格仅供参考,具体性能要看折线图)

型号DHT11DHT20AHT10AHT20AHT30SHT20
价格¥ 2.49¥3.04¥ 1.9¥1.4¥ 1.3¥5.5
温度测量范围20—90%RH0—100%RH0—100%RH0—100%RH0—100%RH0—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.3VDC5V/3.3VDC3.3VDC5V/3.3VDC5V/3.3VDC5V/3.3V
型号SHT30SHT31SHT35SHT40SHT41SHT45
价格¥ 3.9¥ 6.9¥ 18.5¥ 3.25¥6.6¥ 19
温度测量范围0—100%RH0—100%RH0—100%RH0—100%RH0—100%RH0—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.3VDC5V/3.3VDC5V/3.3VDC3.3VDC3.3VDC3.3V

SHT30概述

在这里插入图片描述
数据:
SHT30是一款完全校准的线性化的温湿度数字传感器,增强了数字信号。I2C通讯频率达1MHz。具有高可靠性及高稳定性。

供电:
供电电压2.15V-5.5V;数据接口电压可5V或3.3V(不同供电系统可对接,但尽量避免)。

功能:
单次读取或周期性读取温度和湿度传感器数值,通过公式转换为摄氏度和相对湿度值。

连接:
使用I2C进行连接,也可使用普通GPIO引脚模拟I2C进行通讯,但通讯速率较低。

SHT30引脚说明

在这里插入图片描述

引脚名称功能
1SDA数据信号
2ADDR连接到高电平或低电平,不可以悬空
3ALERT报警引脚,不用必须悬空
4SCL时钟信号
5VDD电源正极
6nRESET低电平复位;如果不使用,建议悬空;也可以使用大于2Ω电阻连接到VDD
7R无功能,请连到电源地
8VSS电源地
9pad中间引脚与电源地相通,散热引脚

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连接,样例代码

常见温湿度传感器测量范围&#xff1a;(价格仅供参考&#xff0c;具体性能要看折线图) 型号DHT11DHT20AHT10AHT20AHT30SHT20价格&#xffe5; 2.49&#xffe5;3.04&#xffe5; 1.9&#xffe5;1.4&#xffe5; 1.3&#xffe5;5.5温度测量范围20—90%RH0—100%RH0—100%RH0—…...

SQL server 同环比计算模板

1、计算 月 年 季度的环比和同比 计算公式如下&#xff1a; 环比增长率 &#xff08;本期数 - 上期数&#xff09; / |上期数| 100% 同比增长率 &#xff08;本期数 - 同期数&#xff09; / |同期数| * 100% --- dbo.ads_erp_finance_gross_profit_actual_invoice_yoy_m…...

python发送外部请求

在Python中&#xff0c;服务器发送外部请求是一个常见的操作&#xff0c;尤其是在需要集成不同服务或API时。有多种库可以帮助你完成这项任务&#xff0c;但最流行和广泛使用的库之一是requests。以下是如何使用requests库在Python服务器中发送外部请求的基本步骤&#xff1a; …...

c++并发编程面试题

1. C中lock_guard和unique_lock的区别&#xff1f; 在C中&#xff0c;lock_guard和unique_lock都是用于管理互斥锁的类&#xff0c;它们提供了一种 RAII&#xff08;Resource Acquisition Is Initialization&#xff09;机制来确保锁在作用域结束时自动释放。尽管它们的目的相…...

K8S上安装LongHorn(分布式块存储) --use

要在 Kubernetes上安装 LongHorn&#xff0c;您可以按照以下步骤进行操作&#xff1a; 准备工作 参考 官网教程将LongHorn只部署在k8s-worker5节点上。https://github.com/longhorn/longhorn 安装要求 Each node in the Kubernetes cluster where Longhorn is installed must f…...

2024年前端技术发展趋势分析

2024年的前端技术发展趋势继续受到快速变化的技术环境和不断增长的用户期望的影响。以下是2024年前端技术发展的几个关键趋势&#xff1a; 1. Web 组件和自定义元素 Web 组件技术&#xff08;包括 Shadow DOM、HTML Templates 和 Custom Elements&#xff09;正在成为构建可重…...

spring boot 笔记大杂烩

一&#xff0c;springboot项目创建 springboot创建时idea会打开start.spring.io失败报错 可以手动打开这个页面&#xff0c;然后选择maven项目&#xff0c;然后修改group和name名然后添加依赖web&#xff0c;然后生成项目包&#xff0c;解压缩后用idea打开就能用了 运行后报错…...

如何在香港云服务器上优化网站性能?

在香港云服务器上优化网站性能可以通过以下几种方式进行&#xff0c;确保用户从全球各地访问时获得快速、稳定的体验&#xff1a; 1. 使用内容分发网络 (CDN) 优势&#xff1a;CDN可以将静态内容&#xff08;如图像、视频、CSS、JavaScript文件&#xff09;缓存到全球多个节点…...

STM32低功耗与备用备份区域

STM的备份备用区域其实就是两个区块&#xff1a;BKP和RTC。低功耗则其实是STM32四种模式中的三种耗能很低的模式。 目录 一&#xff1a;备用区域 1.BKP 2.RTC 二&#xff1a;低功耗模式 1.睡眠模式&#xff1a; 2.停机模式&#xff1a; 3.待机模式&#xff1a; 一&…...

武汉某汽配公司携手三品软件 共绘PLM项目新蓝图

近日&#xff0c;三品软件与武汉某汽配公司达成战略合作&#xff0c;双方将共同启动PLM项目&#xff0c;以助力该公司在汽车制造业的研发管理领域实现全面升级。 客户简介 该公司自2008年成立以来&#xff0c;一直专注于为汽车制造业提供自动化输送系统、车辆装配的合装技术和…...

uniapp多图上传uni.chooseImage上传照片uni.uploadFile,默认上传9张图

uniapp多图上传uni.chooseImage上传照片uni.uploadFile 代码示例&#xff1a; /**上传照片 多图*/getImage() {uni.chooseImage({count: 9, //默认9sizeType: [original, compressed], //可以指定是原图还是压缩图&#xff0c;默认二者都有sourceType: [album], //从相册选择/…...

MySQL——内置函数

时间函数 select * from msg where date_add(sendtime, interval 2 minute) > now(); 理解&#xff1a; ------------------------------|-----------|-------------|------------------ 初始时间 now() 初始时间2min 字符串 length函数返回字符串长度&#xff0c;以字节为…...

2024年最新版小程序云开发数据模型的开通步骤,支持可视化数据库管理,支持Mysql和NoSql数据库,可以在vue3前端web里调用操作

小程序官方又改版了&#xff0c;搞得石头哥不得不紧急的再新出一版&#xff0c;教大家开通最新版的数据模型。官方既然主推数据模型&#xff0c;那我们就先看看看新版的数据模型到底是什么。 一&#xff0c;什么是数据模型 数据模型是什么 数据模型是一个用于组织和管理数据的…...

智慧水库大坝安全监测预警系统解决方案

前言 水库大坝作为重要的水利设施&#xff0c;承载着防洪涝、灌溉、发电等功能&#xff0c;关系着无数人的生命财产安全&#xff0c;一旦发生意外事故&#xff0c;后果将不堪设想&#xff0c;因此需要建立一套水库大坝安全监测预警系统解决方案。 系统概述 水库大坝安全监测…...

基于SpringBoot+VUE的社区团购系统(源码+文档+部署)

主要内容&#xff1a;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能与大数据、单片机开发、物联网设计与开发设计、简历模板、学习资料、面试题库、技术互助、就业指导等 业务范围&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写…...

LeetCode 3151. 特殊数组 I【数组】简单【Py3,C++,Java,GO,Rust】

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

超级字符串技能:提升你的编码游戏

嘿嘿,uu们,今天咱们来详解字符函数与字符串函数,好啦,废话不多讲,开干&#xff01; 1.:字符分类函数 C语言中又一系列的函数是专门做字符分类的,也就是一个字符属于什么类型的字符的,这些函数的使用需要包含头文件ctype.h 这些函数的使用方法都十分类似,博主在这里就举两到三个…...

米联客-FPGA程序设计Verilog语法入门篇连载-16 Verilog语法_时钟分频设计

软件版本&#xff1a;无 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用所有系列FPGA 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑&#xff01; 1概述 本小节讲解Verilog语法的时钟…...

【Echarts】custom自定义图表实现甘特图

效果图 主要注意点&#xff1a; 1、右上角图例visualMap实现 2、visualMap增加formatter 3、series使用custom自定义图表&#xff0c;encode解析四维数组。核心是renderItem方法&#xff0c;必填项&#xff0c;且需要注意要全部定义在options里面&#xff01;&#xff01;&…...

【高等代数笔记】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 \\…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)

UniApp 集成腾讯云 IM 富媒体消息全攻略&#xff08;地理位置/文件&#xff09; 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型&#xff0c;核心实现方式&#xff1a; 标准消息类型&#xff1a;直接使用 SDK 内置类型&#xff08;文件、图片等&#xff09;自…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...