e2studio开发STHS34PF80人体存在传感器(1)----获取人体存在状态

e2studio开发STHS34PF80人体存在传感器.1--获取人体存在状态

  • 概述
  • 视频教学
  • 样品申请
  • 完整代码下载
  • 主要特点
  • 硬件准备
  • 接口
  • 最小系统图
  • 新建工程
  • 工程模板
  • 保存工程路径
  • 芯片配置
  • 工程模板选择
  • 时钟设置
  • UART配置
  • UART属性配置
  • 设置e2studio堆栈
  • e2studio的重定向printf设置
  • R_SCI_UART_Open()函数原型
  • 回调函数user_uart_callback ()
  • printf输出重定向到串口
  • IIC属性配置
  • IIC配置
  • R_IIC_MASTER_Open()函数原型
  • R_IIC_MASTER_Write()函数原型
  • R_IIC_MASTER_Read()函数原型
  • sci_i2c_master_callback()回调函数
  • CS设置
  • 参考案例
  • 获取ID
  • 温度测量滤波方式
  • 智能识别算法
  • 使用块数据更新(BDU)功能
  • 设置ODR速率
  • 获取状态
  • 测试结果

概述

STHS34PF80是一款高性能的红外(IR)传感器,特别适用于检测存在感和运动。其主要特点是高灵敏度,能在没有透镜的情况下探测到4米远的物体(尺寸为70 x 25厘米),并配有集成的硅红外滤波器。这款传感器能够区分静止和移动物体,并具有80°的视场角。它出厂时已校准,且设计为低功耗,包含用于提高探测效果的智能算法。
其应用范围广泛,不仅包括存在感和接近感应、报警/安全系统、智能家居、智能照明、物联网、智能储物柜和智能墙板,还特别适用于检测人体的存在。由于其高灵敏度和精确度,它能够有效地用于人体检测,如在安保系统中探测潜在的入侵者,或在智能家居系统中监测房间内的人员动态。
最近在弄ST的课程,需要样片的可以加群申请:615061293 。
在这里插入图片描述

视频教学

https://www.bilibili.com/video/BV1KN4y1v7gy/

e2studio开发STHS34PF80人体存在传感器(1)----获取人体存在状态

样品申请

https://www.wjx.top/vm/OhcKxJk.aspx#

完整代码下载

主要特点

高灵敏度探测: 专为探测红外线的存在和运动设计,具有高灵敏度。
探测范围: 能够在没有透镜的情况下,探测到70 x 25厘米大小的物体,最远达4米。
集成硅红外滤波器: 通过滤除非红外波长,确保精确探测。
静态和运动物体探测: 能够检测到静止和移动的物体。
视场角: 提供80°的视场角。
出厂校准: 出厂即校准,保证了即插即用的可靠性和准确性。
低功耗设计: 设计注重能效,确保低能耗。
嵌入式智能算法: 用于提升存在感和运动探测的效果。

在这里插入图片描述

硬件准备

首先需要准备一个开发板,这里我准备的是自己绘制的开发板:
在这里插入图片描述

接口

STHS34PF80模块接口的示意图如下所示,支持IIC或者SPI通讯。
在这里插入图片描述

最小系统图

在这里插入图片描述

新建工程

在这里插入图片描述

工程模板

在这里插入图片描述

保存工程路径

在这里插入图片描述

芯片配置

本文中使用R7FA4M2AD3CFL来进行演示。
在这里插入图片描述

工程模板选择

在这里插入图片描述

时钟设置

开发板上的外部高速晶振为12M.

在这里插入图片描述
需要修改XTAL为12M。

在这里插入图片描述

UART配置

在这里插入图片描述
点击Stacks->New Stack->Driver->Connectivity -> UART Driver on r_sci_uart。
在这里插入图片描述

UART属性配置

在这里插入图片描述

设置e2studio堆栈

printf函数通常需要设置堆栈大小。这是因为printf函数在运行时需要使用栈空间来存储临时变量和函数调用信息。如果堆栈大小不足,可能会导致程序崩溃或不可预期的行为。
printf函数使用了可变参数列表,它会在调用时使用栈来存储参数,在函数调用结束时再清除参数,这需要足够的栈空间。另外printf也会使用一些临时变量,如果栈空间不足,会导致程序崩溃。
因此,为了避免这类问题,应该根据程序的需求来合理设置堆栈大小。

在这里插入图片描述

e2studio的重定向printf设置

在这里插入图片描述
在嵌入式系统的开发中,尤其是在使用GNU编译器集合(GCC)时,–specs 参数用于指定链接时使用的系统规格(specs)文件。这些规格文件控制了编译器和链接器的行为,尤其是关于系统库和启动代码的链接。–specs=rdimon.specs 和 --specs=nosys.specs 是两种常见的规格文件,它们用于不同的场景。
–specs=rdimon.specs
用途: 这个选项用于链接“Redlib”库,这是为裸机(bare-metal)和半主机(semihosting)环境设计的C库的一个变体。半主机环境是一种特殊的运行模式,允许嵌入式程序通过宿主机(如开发PC)的调试器进行输入输出操作。
应用场景: 当你需要在没有完整操作系统的环境中运行程序,但同时需要使用调试器来处理输入输出(例如打印到宿主机的终端),这个选项非常有用。
特点: 它提供了一些基本的系统调用,通过调试接口与宿主机通信。
–specs=nosys.specs
用途: 这个选项链接了一个非常基本的系统库,这个库不提供任何系统服务的实现。
应用场景: 适用于完全的裸机程序,其中程序不执行任何操作系统调用,比如不进行文件操作或者系统级输入输出。
特点: 这是一个更“裸”的环境,没有任何操作系统支持。使用这个规格文件,程序不期望有操作系统层面的任何支持。
如果你的程序需要与宿主机进行交互(如在开发期间的调试),并且通过调试器进行基本的输入输出操作,则使用 --specs=rdimon.specs。
如果你的程序是完全独立的,不需要任何形式的操作系统服务,包括不进行任何系统级的输入输出,则使用 --specs=nosys.specs。
在这里插入图片描述

R_SCI_UART_Open()函数原型

在这里插入图片描述

故可以用 R_SCI_UART_Open()函数进行配置,开启和初始化UART。

 /* Open the transfer instance with initial configuration. */
    err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
    assert(FSP_SUCCESS == err);


回调函数user_uart_callback ()

当数据发送的时候,可以查看UART_EVENT_TX_COMPLETE来判断是否发送完毕。

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

可以检查检查 “p_args” 结构体中的 “event” 字段的值是否等于 “UART_EVENT_TX_COMPLETE”。如果条件为真,那么 if 语句后面的代码块将会执行。

fsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
void user_uart_callback (uart_callback_args_t * p_args)
{
    if(p_args->event == UART_EVENT_TX_COMPLETE)
    {
        uart_send_complete_flag = true;
    }
}

printf输出重定向到串口

打印最常用的方法是printf,所以要解决的问题是将printf的输出重定向到串口,然后通过串口将数据发送出去。
注意一定要加上头文件#include <stdio.h>

#ifdef __GNUC__                                 //串口重定向
    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
    #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

PUTCHAR_PROTOTYPE
{
        err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);
        if(FSP_SUCCESS != err) __BKPT();
        while(uart_send_complete_flag == false){}
        uart_send_complete_flag = false;
        return ch;
}

int _write(int fd,char *pBuffer,int size)
{
    for(int i=0;i<size;i++)
    {
        __io_putchar(*pBuffer++);
    }
    return size;
}

IIC属性配置

查看手册,可以得知STHS34PF80的IIC地址为“1011010” ,即0x5A。
在这里插入图片描述

IIC配置

配置RA4M2的I2C接口,使其作为I2C master进行通信。
查看开发板原理图,对应的IIC为P407和P408。

在这里插入图片描述

点击Stacks->New Stack->Connectivity -> I2C Master(r_iic_master)。

在这里插入图片描述

设置IIC的配置,需要注意从机的地址。

在这里插入图片描述

R_IIC_MASTER_Open()函数原型

R_IIC_MASTER_Open()函数为执行IIC初始化,开启配置如下所示。

    /* Initialize the I2C module */
    err = R_IIC_MASTER_Open(&g_i2c_master0_ctrl, &g_i2c_master0_cfg);
    /* Handle any errors. This function should be defined by the user. */
    assert(FSP_SUCCESS == err);

R_IIC_MASTER_Write()函数原型

在这里插入图片描述
R_IIC_MASTER_Write()函数是向IIC设备中写入数据,写入格式如下所示。

    err = R_IIC_MASTER_Write(&g_i2c_master0_ctrl, &reg, 1, true);
    assert(FSP_SUCCESS == err);

R_IIC_MASTER_Read()函数原型

在这里插入图片描述

R_SCI_I2C_Read()函数是向IIC设备中读取数据,读取格式如下所示。

    /* Read data from I2C slave */
    err = R_IIC_MASTER_Read(&g_i2c_master0_ctrl, bufp, len, false);
    assert(FSP_SUCCESS == err);

sci_i2c_master_callback()回调函数

对于数据是否发送完毕,可以查看是否获取到I2C_MASTER_EVENT_TX_COMPLETE字段。

在这里插入图片描述

/* Callback function */
i2c_master_event_t i2c_event = I2C_MASTER_EVENT_ABORTED;
uint32_t  timeout_ms = 100000;
void sci_i2c_master_callback(i2c_master_callback_args_t *p_args)
{
    i2c_event = I2C_MASTER_EVENT_ABORTED;
    if (NULL != p_args)
    {
        /* capture callback event for validating the i2c transfer event*/
        i2c_event = p_args->event;
    }
}

CS设置

STS34PF80IO设置如下所示。
在IIC模式下CS需要给个高电平。

在这里插入图片描述
官方提供IIC接线如下所示。

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

设置PC0为输出口。

在这里插入图片描述

参考案例

https://github.com/STMicroelectronics/sths34pf80-pid

获取ID

参考例程序中对应的获取ID驱动程序,如下所示。

在这里插入图片描述

获取ID可以查看0x0F,读出来的值应该为0xD3。

在这里插入图片描述

对应的获取ID驱动程序,如下所示。

   /* Open the transfer instance with initial configuration. */
    err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
    assert(FSP_SUCCESS == err);
    printf("hello world!\n");

    /* Initialize the I2C module */
    err = R_IIC_MASTER_Open(&g_i2c_master0_ctrl, &g_i2c_master0_cfg);
    /* Handle any errors. This function should be defined by the user. */
    assert(FSP_SUCCESS == err);


    R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_00_PIN_00, BSP_IO_LEVEL_HIGH);

    uint8_t whoami;
    sths34pf80_lpf_bandwidth_t lpf_m, lpf_p, lpf_p_m, lpf_a_t;

    /* Initialize mems driver interface */
    dev_ctx.write_reg = platform_write;
    dev_ctx.read_reg = platform_read;
    dev_ctx.handle = &SENSOR_BUS;

    /* Wait sensor boot time */
    platform_delay(BOOT_TIME);

    /* Check device ID */
    sths34pf80_device_id_get(&dev_ctx, &whoami);
    printf("STHS34PF80_ID=0x%x,whoamI=0x%x\n",STHS34PF80_ID,whoami);
    if (whoami != STHS34PF80_ID)
        while(1);

温度测量滤波方式

首先需要设置AVG_TRIM (10h) 寄存器用于配置温度平均值滤波的参数,以控制环境温度和目标温度测量的平滑度和稳定性。在温度测量中,可能会受到噪声和干扰的影响,这可能导致短期内测量值的波动。通过应用平均值滤波,可以平滑这些波动,从而得到更加稳定的温度数据。AVG_TRIM 寄存器中的设置会决定平均值滤波的级别,从而影响滤波的时间常数以及平滑度。

这里默认参数如下

  1. 在AVG_TRIM(10h)寄存器中写入02h // AVG_T = 8,AVG_TMOS = 32
  2. 在CTRL1(20h)寄存器中写入07h // ODR = 15 Hz
    在这里插入图片描述

AVG_T[1:0]: 这个设置位用于选择环境温度的平均值滤波样本数。
AVG_TMOS[2:0]: 这个设置位用于选择目标温度的平均值滤波样本数以及与之相关的噪声水平。

在这里插入图片描述

在这里插入图片描述

对象温度的平均值数量 (sths34pf80_avg_tobject_num_set 函数): 这个函数设置用于测量对象温度的平均值数量。参数 val 可以是多种不同的值,例如 AVG_TMOS_2, AVG_TMOS_8, AVG_TMOS_32, 等等,表示不同的平均值数量。这些设置影响传感器输出的平滑程度和响应速度,高的平均值数量会增加输出数据的平滑度,但也可能增加响应时间。

环境温度的平均值数量 (sths34pf80_avg_tambient_num_set 函数): 类似地,这个函数设置环境温度测量的平均值数量。参数 val 可以是 AVG_T_8, AVG_T_4, AVG_T_2, AVG_T_1 等,用于设置不同的平均值数量。这也会影响传感器输出的平滑程度和响应速度。

在你提供的代码段中,使用了 STHS34PF80_AVG_TMOS_32 和 STHS34PF80_AVG_T_8 作为参数,分别用于设置对象温度和环境温度的平均值数量。这意味着传感器会对对象温度使用32个数据点的平均值,对环境温度使用8个数据点的平均值。这样的设置有助于在传感器的测量中实现一定程度的数据平滑和过滤噪声,同时保持适当的响应速度。

  /* Set averages (AVG_TAMB = 8, AVG_TMOS = 32) */
  sths34pf80_avg_tobject_num_set(&dev_ctx, STHS34PF80_AVG_TMOS_32);
  sths34pf80_avg_tambient_num_set(&dev_ctx, STHS34PF80_AVG_T_8);

智能识别算法

STHS34PF80嵌入了智能数字算法,以支持以下三种检测模式:
• 存在检测
• 运动检测
• 环境温度冲击检测
这些算法分别使用不同的低通滤波器(LPF_P、LPF_M和LPF_A_T)。此外,存在和运动检测算法使用另一个共同的低通滤波器(LPF_P_M)。这些滤波器用于生成中间信号(TPRESENCE、TMOTION和TAMB_SHOCK),可以用于对算法本身进行微调。这些滤波器的截止频率值可以通过它们各自的位范围进行配置,这些位范围可以在LPF1(0Ch)和LPF2(0Dh)寄存器中找到,如下所示。

在这里插入图片描述

寄存器LPF1 (0Ch)和LPF2 (0Dh)如下所示。

在这里插入图片描述
案例中只是对滤波器进行了读取以及打印。

  /* read filters */
  sths34pf80_lpf_m_bandwidth_get(&dev_ctx, &lpf_m);
  sths34pf80_lpf_p_bandwidth_get(&dev_ctx, &lpf_p);
  sths34pf80_lpf_p_m_bandwidth_get(&dev_ctx, &lpf_p_m);
  sths34pf80_lpf_a_t_bandwidth_get(&dev_ctx, &lpf_a_t);

  printf("lpf_m: %02d, lpf_p: %02d, lpf_p_m: %02d, lpf_a_t: %02d\r\n", lpf_m, lpf_p, lpf_p_m, lpf_a_t);

使用块数据更新(BDU)功能

在很多传感器中,数据通常被存储在输出寄存器中,这些寄存器分为两部分:MSB和LSB。这两部分共同表示一个完整的数据值。例如,在一个加速度计中,MSB和LSB可能共同表示一个加速度的测量值。
连续更新模式(BDU = ‘0’):在默认模式下,输出寄存器的值会持续不断地被更新。这意味着在你读取MSB和LSB的时候,寄存器中的数据可能会因为新的测量数据而更新。这可能导致一个问题:当你读取MSB时,如果寄存器更新了,接下来读取的LSB可能就是新的测量值的一部分,而不是与MSB相对应的值。这样,你得到的就是一个“拼凑”的数据,它可能无法准确代表任何实际的测量时刻。
块数据更新(BDU)模式(BDU = ‘1’):当激活BDU功能时,输出寄存器中的内容不会在读取MSB和LSB之间更新。这就意味着一旦开始读取数据(无论是先读MSB还是LSB),寄存器中的那一组数据就被“锁定”,直到两部分都被读取完毕。这样可以确保你读取的MSB和LSB是同一测量时刻的数据,避免了读取到代表不同采样时刻的数据。
简而言之,BDU位的作用是确保在读取数据时,输出寄存器的内容保持稳定,从而避免读取到拼凑或错误的数据。这对于需要高精度和稳定性的应用尤为重要。

在这里插入图片描述

案例也是设置了BDU。
BDU在CTRL1 (20h)寄存器中。

在这里插入图片描述

  /* Set BDU */
  sths34pf80_block_data_update_set(&dev_ctx, 1);

设置ODR速率

初始化完毕之后需要通过CTRL1(20h)寄存器中的ODR[3:0]位范围选择其中一种操作模式(连续模式),或者在CTRL2(21h)寄存器中将ONE_SHOT位设置为1(单次触发模式)。

在这里插入图片描述

当配置了寄存器LPF1 (0Ch)和LPF2 (0Dh) 的LPF_P、LPF_M和LPF_A_T、LPF_P_M滤波器之后,可以去设置ODR速率。

在这里插入图片描述

这里设置速率为8Hz。

  /* Set ODR */
  sths34pf80_odr_set(&dev_ctx, STHS34PF80_ODR_AT_8Hz);	

获取状态

STATUS (地址为0x23U) 用于表示传感器的状态。
drdy(1位):这个位用于指示数据就绪(Data Ready)状态。当传感器有新的数据可供读取时,这个位会被设置。

FUNC_STATUS(25h)主要检测三个标志位:PRES_FLAG、MOT_FLAG 和 TAMB_SHOCK_FLAG,这些标志位用于检测不同类型的事件。
PRES_FLAG是存在检测标志位。当存在检测到人员存在时,此位变为1。
MOT_FLAG:运动检测标志位。当检测到运动时,此位变为1。
TAMB_SHOCK_FLAG:环境温度冲击检测标志位。当检测到环境温度冲击时,此位变为1。

在这里插入图片描述

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  sths34pf80_drdy_status_t status;
  sths34pf80_func_status_t func_status;

  sths34pf80_drdy_status_get(&dev_ctx, &status);
  if (status.drdy)
  {
    sths34pf80_func_status_get(&dev_ctx, &func_status);

    printf("TAmbient Shock: %d - Presence: %d - Motion: %d\r\n",func_status.tamb_shock_flag, func_status.pres_flag, func_status.mot_flag);
 }		

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

测试结果

在未有人的情况下。

在这里插入图片描述

在人体纯在情况下。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

百度地图打点性能优化(海量点、mapv)

文章目录 百度地图打点性能优化&#xff08;海量点、mapv&#xff09;原因优化方法数据获取方面页面加载方面 参考资料 百度地图打点性能优化&#xff08;海量点、mapv&#xff09; 原因 在百度地图api中&#xff0c;默认的点是下图的红点 而这种点位比较多的时候&#xff0c…

关键字:super关键字

在 Java 中&#xff0c;super 关键字主要有以下两种用法&#xff1a; 在子类中调用父类的构造方法&#xff1a;当创建子类对象时&#xff0c;可以使用 super 关键字来显式调用父类的构造方法。这可以用于初始化父类的成员变量或执行父类的其他初始化操作。下面是一个示例代码&…

腾讯云2核2G3M服务器可以运行几个网站?

在探讨这个问题之前&#xff0c;我们需要先了解网站运行所需的基本资源。一个网站的运行通常需要以下几个方面的资源&#xff1a;CPU、内存、磁盘和网络。接下来&#xff0c;我们将分析这些资源在不同配置下的使用情况&#xff0c;以确定腾讯云2核2G3M服务器可以运行多少个网站…

并发(4)

目录 16.sychronized修饰方法在抛出异常时&#xff0c;会释放锁吗&#xff1f; 17.多个线程等待同一个sychronized锁的时候&#xff0c;JVM如何选择下一个获取锁的线程&#xff1f; 18.sychronized是公平锁吗&#xff1f; 19.volatile关键字的作用是什么&#xff1f; 20.vo…

基于日照时数计算逐日太阳辐射

基于日照时数计算逐日太阳辐射

分布式【Zookeeper】

1.1 ZooKeeper 是什么 ZooKeeper 是 Apache 的顶级项目。ZooKeeper 为分布式应用提供了高效且可靠的分布式协调服务&#xff0c;提供了诸如统一命名服务、配置管理和分布式锁等分布式的基础服务。在解决分布式数据一致性方面&#xff0c;ZooKeeper 并没有直接采用 Paxos 算法&…

安全加固之weblogic屏蔽T3协议

一、前言 开放weblogic控制台的7001端口&#xff0c;默认会开启T3协议服务&#xff0c;T3协议则会触发的Weblogic Server WLS Core Components中存在反序列化漏洞&#xff0c;攻击者可以发送构造的恶意T3协议数据&#xff0c;获取目标服务器权限。 本文介绍通过控制T3协议的访问…

vue3 的内置组件汇总

官方给出的说明&#xff1a; Fragment: Vue 3 组件不再要求有一个唯一的根节点&#xff0c;清除了很多无用的占位 div。Teleport: 允许组件渲染在别的元素内&#xff0c;主要开发弹窗组件的时候特别有用。Suspense: 异步组件&#xff0c;更方便开发有异步请求的组件。 一、fr…

商品砍价系统设计原理与实践:技术解析与注意事项

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

SpringBoot 调用mybatis报错:Invalid bound statement (not found):

启动SpringBoot报错&#xff1a;Invalid bound statement (not found): 参考此文排查 命中了第6条 记录一手坑爹的Invalid bound statement (not found)&#xff08;六个方面&#xff09; mapper文件路径配置错误 订正以后 问题解决

GLSL着色器入门(持续更新中...)

目录 第一章&#xff1a;OpenGL works with triangles 第二章&#xff1a; Parallel Processing 第章 推荐来自b站的课程004 GLSL is not Javascript_哔哩哔哩_bilibili 第一章&#xff1a;OpenGL works with triangles 当我们谈论GLSL着色器时&#xff0c;其实就是在说怎么…

开发个小破软件——网址导航,解压就能用

网址导航 网站导航也称链接目录&#xff0c;将网站地址或系统地址分类&#xff0c;以列表、图文等形式呈现&#xff0c;帮助快速找到需要的地址。 应用场景 高效查找&#xff1a;网址导航是很好的入口&#xff0c;通过分类清晰的网站推荐&#xff0c;可以迅速访问网站资源。…

数据的创建、调用、修改、删除存储过程,以及第一类丢失更新(回滚丢失)和 第二类丢失更新(覆盖丢失/两次更新问题)

数据的创建存储过程、调用存储过程、修改存储过程、删除存储过程&#xff0c;以及第一类丢失更新&#xff08;回滚丢失&#xff09;和 第二类丢失更新&#xff08;覆盖丢失/两次更新问题&#xff09; 文章目录 一、创建存储的语法二、调用存储过程三、修改存储过程四、删除存储…

【python实战】python一行代码,实现文件共享服务器

一行代码实现文件共享 在一个局域网内&#xff0c;需要共享一个文件夹里内容。 我们可以在任意一台有python环境的电脑上&#xff0c;迅速架起一个http协议的服务&#xff0c;然后将文件夹里的文件内容共享出来。是的仅仅需要一行代码 就是这么简单 把电脑的相关项目文件通…

Python中的有序字典是什么

有序字典 一、简介 Python中的字典的特性&#xff1a;无序性。 有序字典和通常字典类似&#xff0c;只是它可以记录元素插入其中的顺序&#xff0c;而一般字典是会以任意的顺序迭代的。 二、普通字典 #! /usr/bin/env python3 # -*- coding:utf-8 -*- d1 {} d1[a] A d1[b…

【Unity】 HTFramework框架(四十七)编辑器日志中使用超链接的技巧

更新日期&#xff1a;2024年1月3日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 日志中使用超链接超链接-网络地址超链接-本地地址超链接-项目资源文件超链接-脚本对象 日志中使用超链接 在编辑器控制台Console中的日志是支持富文本的&…

使用Spring Cache优化数据库访问

使用Spring Cache优化数据库访问 在这篇博客中&#xff0c;我们将学习如何使用Spring Cache来优化数据库访问&#xff0c;提高系统性能。我们将创建一个简单的图书管理应用作为示例&#xff0c;并演示如何通过缓存减少对数据库的频繁查询。 1. 项目结构 首先&#xff0c;我们…

web自动化(6)——项目配置和Grid分布式

1. 框架的可配置性 项目之间的区别&#xff1a; 兼容性&#xff1a;有些项目只兼容chrome&#xff0c;有些只兼容Firefox等元素定位特点&#xff1a;有些项目闪现快&#xff0c;有的项目很慢有些项目集成Jenkins&#xff0c;不需要用python生成allure报告 如果想要我们的框架…

cesium键盘控制模型

效果&#xff1a; 由于对添加模型和更新位置api进行二次了封装&#xff0c;下面提供思路 1.添加模型 const person reactive({modelTimer: null,position: {lon: 104.07274,lat: 30.57899,alt: 1200,heading: 0,pitch: 0,roll: 0,}, }); window.swpcesium.addEntity.addMo…

主流大语言模型从预训练到微调的技术原理

引言 本文设计的内容主要包含以下几个方面&#xff1a; 比较 LLaMA、ChatGLM、Falcon 等大语言模型的细节&#xff1a;tokenizer、位置编码、Layer Normalization、激活函数等。大语言模型的分布式训练技术&#xff1a;数据并行、张量模型并行、流水线并行、3D 并行、零冗余优…