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

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

  • 概述
  • 视频教学
  • 样品申请
  • 完整代码下载
  • 主要特点
  • 硬件准备
  • 接口
  • 最小系统图
  • 生成STM32CUBEMX
  • 串口配置
  • IIC配置
  • CS设置
  • 串口重定向
  • 参考案例
  • 获取ID
  • 温度测量滤波方式
  • 智能识别算法
  • 使用块数据更新(BDU)功能
  • 设置ODR速率
  • 获取状态
  • 测试结果

概述

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

视频教学

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

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

样品申请

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

完整代码下载

主要特点

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

在这里插入图片描述

硬件准备

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

接口

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

最小系统图

在这里插入图片描述

生成STM32CUBEMX

用STM32CUBEMX生成例程,这里使用MCU为STM32WB55RG。
配置时钟树,配置时钟为32M。
在这里插入图片描述

串口配置

查看原理图,PB6和PB7设置为开发板的串口。

在这里插入图片描述

配置串口。

在这里插入图片描述

IIC配置

在这里插入图片描述

配置IIC为快速模式,速度为400k。
在这里插入图片描述

CS设置

STS34PF80IO设置如下所示。
在IIC模式下CS需要给个高电平。
在这里插入图片描述

官方提供IIC接线如下所示。

在这里插入图片描述
在这里插入图片描述
设置PC0为输出口。
在这里插入图片描述

串口重定向

打开魔术棒,勾选MicroLIB
在这里插入图片描述

在main.c中,添加头文件,若不添加会出现 identifier “FILE” is undefined报错。

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

函数声明和串口重定向:

/* USER CODE BEGIN PFP */
int fputc(int ch, FILE *f){HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);return ch;
}
/* USER CODE END PFP */

参考案例

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

获取ID

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

在这里插入图片描述

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

在这里插入图片描述

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

	printf("??????????");HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);		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 */

测试结果

在未有人的情况下。

在这里插入图片描述

在人体纯在情况下。

在这里插入图片描述

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

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

相关文章

java的面向对象编程(oop)概述及案例

前言: 学到了面向对象编程,整理下相关知识点。打牢基础,daydayup! 面向对象基础概述 1,什么是面向对象,面向对象的思考逻辑是什么? 面向对象就是把任何事物都看成一个又一个对象。思考逻辑为万物皆对象&am…

2024年阿里云、腾讯云、华为云、LightNode、硅云服务器如何选?怎么买最划算?[最新价格表]

很多小伙伴都有一颗上云的心,包括我自己 有事没事的折腾一下自己的小破站,也挺有意思的! 那么,云服务器哪家好?优惠力度哪家大?活动入口哪里进?云服务器如何配置?如何选型&#xf…

Docker的一个简单例子(二)

文章目录 环境示例持久化数据bind mount多容器应用Docker Compose 参考 环境 RHEL 9.3Docker Community 24.0.7 示例 持久化数据 默认情况下,各个容器之间的文件系统是相互独立的。即使两个容器来自同一个image,对其中一个容器的修改,对另…

FFmpeg读取Assets资源文件

在Android开发中我们经常把原生资源文件放在assets目录下以供需要时读取,通过API提供的resources.assets.open(filename)/openFd(filenam)方法可以非常方便获得InputStream或FileDescriptor(文件标识符),但是在使用FFmpeg读取Asse…

腾讯云优惠券如何免费获取?

腾讯云作为国内领先的云计算服务提供商,常常会提供各种优惠券以吸引更多的用户使用其服务。这些优惠券可以大大降低用户的云服务费用,但许多用户可能不知道如何免费获取这些优惠券。本文将为大家介绍几种免费获取腾讯云优惠券的方法。 一、腾讯云官网活动…

软件测试|docker ps命令 管理和监视容器的利器

简介 Docker是一种流行的容器化平台,用于构建、分发和运行应用程序。Docker提供了许多命令行工具,其中之一是docker ps命令。本文将深入介绍docker ps命令,解释其用途、参数和功能,以及如何使用该命令来管理和监视运行中的Docker…

AI动作冒险电影《加勒比海盗:失落的宝藏》(下)

AI动作冒险电影《加勒比海盗:失落的宝藏》(下) 在宝藏岛屿的探险中,杰克船长不断遭遇铁钩胡克的追击,并陷入了一系列生死危机中。然而,当杰克终于找到宝藏所在的洞穴时,却发现了一个令人震惊的事…

微服务-dubbo工程案例搭建

基础案例搭建 1 依赖 父工程POM <dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${com.alibaba.cloud.vers…

书生·浦语大模型实战营第一次课堂笔记

书生浦语大模型全链路开源体系。大模型是发展通用人工智能的重要途径,是人工通用人工智能的一个重要途径。书生浦语大模型覆盖轻量级、重量级、重量级的三种不同大小模型,可用于智能客服、个人助手等领域。还介绍了书生浦语大模型的性能在多个数据集上全面超过了相似量级或相近…

交换机04_远程连接

通过远程管理方式连接交换机 1、telnet简介 telnet 是应用层协议 基于传输层TCP协议的&#xff0c;默认端口&#xff1a;23 采用的是明文密码方式 不是很安全&#xff0c;一般用于内网管理。 2、ssh协议简介 ssh 是应用层的协议&#xff0c;基于传输层的TCP协议&#x…

C# 自定义配置文件序列化生成+文件格式错误自动回档

文章目录 前言选择Xml简单的Xml使用测试用例简单的写简单的读简单的生成配置修改配置类测试用例运行结果对比 代码逻辑封装逻辑示意封装好的代码测试生成配置文件格式错误测试使用默认值覆盖来解决问题 配置文件人为修改错误如何解决解决方案代码测试用例运行结果 代码封装总结…