【单片机】人体感应模块

article/2025/10/15 20:24:39

文章目录

  • 前言
  • 模块介绍(可跳过)
  • 模块使用
    • 代码:h文件
    • 代码:c文件
    • 代码使用方法
    • 补充介绍(可/不可重复触发)
  • 代码获取

前言

大家好,我是林白柏;

希望你看完之后,能有所收获,不足请指正!

PS:本文提到的模块都使用正点原子的stm32开发板战舰驱动,模块用的某宝现成的模块。


模块介绍(可跳过)

模块由菲涅尔透镜、热释电红外探头、放大电路组成。

菲涅尔透镜用于提高探头灵敏度。

透镜在探头前方产生交替变化的“盲区”和“高灵敏区”,这样当人体走过时,人体发射的红外线就会不断交替经过“盲区”和“高灵敏区”,便于探头产生脉冲信号。

热释电红外探头检测到人体发出的红外线时,发出一个脉冲信号(脉冲宽度固定);有人时,人体产生的红外线会交替出现在“盲区”和“高灵敏区”,就一直有脉冲信号输出(实测人静止不动时好像不会输出)。

在通过放大器是BISS0001将脉冲信号转化为更直观的高低电平输出,有人输出高,无人输出低。并在放大电路上设置电位器,调节输出信号的灵敏度(比如探头产生n个脉冲,模块才输出高电平),调节高电平持续时间。

image-20220419210118203

模块使用

模块接口只有三个脚,地、电源、数据线;分别计为GND、VCC、OUT

探头检测到有人移动时,OUT=1;没人移动时,OUT=0;

因此我们可以把它当成一个独立按键,按下时(有人移动)为1,松开时(没人移动)为0。

image-20220419215448737

我们将IO口初始化为外部中断、跳变沿触发,当产生中断时,在中断服务函数中读取IO状态,IO=1则为上升沿——有人移动,IO=0则为下降沿——无人移动。(见头文件human_body_induction.c部分)

将事件返回给事件回调函数。(见头文件human_body_induction.h部分)

代码:h文件

头文件*(为了一个“按键”封装两个文件确实点过于仪式感了哈哈哈哈)*中定义了两种事件,用于返回给事件回调函数。

typedef enum {HBI_NOBODY,//无人移动HBI_PEOPLE_MOVING,//有人移动
}hbi_evt_t;typedef void ( * hbi_evt_handle_t )( hbi_evt_t * event );//事件回调函数类型void hbi_init( hbi_evt_handle_t event_handle);//初始化函数声明

代码:c文件

源文件中分为两部分:初始化,中断服务函数。

初始函数,初始化io、中断,并保存回调函数指针。

static hbi_evt_handle_t m_event_handle;	//保存用户传进来的回调函数指针
void hbi_init( hbi_evt_handle_t event_handle) {GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;//[ 与硬件相关 ]//使能外设时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);  //使能PORTG口时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);	   //使能复用功能时钟//将IO初始化为下拉输入(上拉下拉好像都行)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;				GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; 		  GPIO_Init(GPIOG, &GPIO_InitStructure);//配置GPIOG.8为中断线EXTI_Line8的中断源(这部分需要去了解stm32中断相关知识)GPIO_EXTILineConfig(GPIO_PortSourceGPIOG,GPIO_PinSource8);//EXTI_Line8初始化为跳变沿触发EXTI_InitStructure.EXTI_Line = EXTI_Line8;    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);     //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器//初始化中断分组NVIC_InitStructure.NVIC_IRQChannel = HBI_EXTI_IRQ_CHANNEL;		NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;	//抢占优先级2, NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;			//子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;					//使能外部中断通道NVIC_Init(&NVIC_InitStructure); //[ 与硬件无关 ]//保存用户传进来的回调函数指针,中断服务函数中使用m_event_handle = event_handle;
}

中断服务函数中,根据中断类型返回相应的事件给用户

void EXTI9_5_IRQHandler(void)//stm32中,中断线5-9公用一个中断服务函数
{if(EXTI_GetITStatus( EXTI_Line8 ) != RESET){hbi_evt_t evt = HBI_NOBODY;EXTI_ClearFlag( EXTI_Line8 );    //清除中断标志位EXTI_ClearITPendingBit( EXTI_Line8 ); //清除EXTI线路挂起位if( GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_8) ) {//上升沿evt = HBI_PEOPLE_MOVING;}else {//下降沿evt = HBI_NOBODY;}m_event_handle( &evt );}
}

代码使用方法

初始化时,应用程序注册一个回调函数,后续就只需要在回调函数中判断事件并执行相应操作即可

//以下使用演示
static void bi_evt_cb( hbi_evt_t * event ) {//定义事件回调函数switch ( *event ) {case HBI_NOBODY        : _LOG_DEBUG("[hbi] nobody\n\n"); break;case HBI_PEOPLE_MOVING : _LOG_DEBUG("[hbi] people moving\n\n");; break;        }
}int main(void){hbi_init( hbi_evt_cb );//将回调函数指针传给初始化函数while(1);
}

补充介绍(可/不可重复触发)

模块还有一个重复触发不重复触发的概念,由BISS0001实现(具体实现方式查看BISS0001规格书),两者的区别如下图红色方框

image-20220419220844072

不可重复触发,探头产生脉冲时,模块out脚输出高电平,时长Tx;在Tx结束前,探头产生的脉冲都无效。

可重复触发,探头产生脉冲时,模块out脚输出高电平,时长Tx;在Tx结束前,探头产生新的脉冲,则从新的脉冲处开始重新计时Tx。只要Tx结束前一直有脉冲产生,则模块高电平会一直持续下去。

可通过模块上跳线帽进行设置,L(不可重复触发)和H(可重复触发)

image-20220419224252959

代码获取

共用代码:https://gitee.com/sumoting1629/mcu-practice/tree/master/common

驱动代码:https://gitee.com/sumoting1629/mcu-practice/tree/master/component


http://chatgpt.dhexx.cn/article/h07jWjYd.shtml

相关文章

人体红外传感模块原理分析

数字热释电传感器是将传统热释电传感器的敏感元与信号处理芯片集成化设计,将敏感元与 IC 芯片集成封装到传感器屏蔽罩内部,敏感元通过感应外界人体移动产生的红外信号,以差分输入的方式传送到高精度的数字智能处理芯片进行处理,信…

人体红外传感器HC-SR501

在学习STM32系列的芯片时,算是第一次和开发板打交道,所以很多时候不知道如何查看引脚和相关功能,虽然只是借助外设进行一些实验,但开始的时候还是感到很困难。 而且学习的过程中越来越感受到知识的积累是一个十分漫长的过程&…

HC-SR501人体感应模块介绍

HC-SR501人体感应模块简介 HC-SR501是基于红外线技术的自动控制模块,采用德国原装进口 LHI778 探头设计,灵敏度高,可靠性强,超低电压工作模式,广泛应用于各类自动感应电器设备,尤其是干电池供电的自动控制产…

c语言换行符不起作用,回车符与换行符问题——C语言

回车符(carriage return,’\r’)与换行符 (line feed,’\n’) 换行对应的ASCII码值是10,回车符对应的ASCII码值是13,需要注意的是用户按下回车键时,对于不同的字符输入函数,读取的字符不同,下面上代码 测试一: int main() {char ch; ch = getchar(); printf("%d\n&q…

JavaScript字符串换行符与空格符

今天遇到个逻辑 后端传过来一个对象数组 要将每一个下标下的匹配信息拼接成一个字符串 然后输出出来 但是 每个信息之间要换行 突然就蒙了 泥马 js字符串怎么换行来着&#xff1f; 后面总算是找到了 js换行是 \r 或者 \n 标签是 <br/>参考代码如下 let name 你好java\…

css 换行符,CSS秘密花园: 插入换行符

《CSS Secrets》是@Lea Verou最新著作,这本书讲解了有关于CSS中一些小秘密。是一本CSSer值得一读的一本书,经过一段时间的阅读,我、@南北和@彦子一起将在W3cplus发布一系列相关的读后感,与大家一起分享。 需要通过CSS插入换行符的情况,通常出现在list列表定义中,如下图所,…

Vue js换行符在div渲染变成空格的问题

在js里更改全局变量时加入换行符&#xff0c;但在div里引用渲染失效。 </-- 在div里引用全局变量text --> <div> {{this.text}} </div>data() {return {// 全局变量初始值中有换行符text: 1\n给我换行&#xff01;&#xff01;&#xff01;,} }methods: {//…

js 字符串中的空格、换行符(\r,\s,\n,\r\n)

一、换行&#xff0c;回车 换行回车在不同操作系统下的含义 以下均为单击 Enter 键产生 Windows&#xff1a;系统行末结束符是 ‘\r\n’Linux&#xff1a;统行末结束符是 ‘\n’Mac&#xff1a;系统行末结束符是 ‘\r’ 关于软 / 硬回车的扩展知识 硬回车&#xff1a;就是普通…

JavaScript换行符的使用

JavaScript中的三种输出方式 document.write() 页面上输出 console.log() 控制台输出 alert() 弹窗输出 其中 document.write() 输出内容中换行需要使用HTML中的标签使用</br>,在其中键入\n&#xff0c;不会显示&#xff0c;但也不会有换行效果。 document.write() …

【图文并茂】一键重装win7系统详细教程

当电脑遇到卡顿或者系统故障的情况时&#xff0c;使用合适的装机工具进行重装是很好的解决方式&#xff0c;那为用户打造了使用非常方便的一键重装系统软件&#xff0c;装机流畅使用简单&#xff0c;非常适合新手使用的装机工具今天小编为大家带来了&#xff0c;那就是系统之家…

Win10重装win7时一直显示windows启动中,不要慌

1、联想电脑本身自带的win8&#xff0c;一直用的win10&#xff0c;时间久了win10太卡了&#xff0c;想换个win7。刚开始直接在win10系统下本地下载的系统&#xff0c;安装失败&#xff0c;一直卡在windows启动界面。 2、这样应该是出了问题&#xff0c;果断关机&#xff0c;当…

老毛桃u盘重装win7教程

U盘的作用不仅仅是存储数据&#xff0c;现在U盘广泛用于重装系统领域&#xff0c;通过老桃毛启动盘制作工具可以一键制作U盘启动盘&#xff0c;然后这个U盘就可以用来重装系统&#xff0c;比如win7系统&#xff0c;那么怎么用老桃毛U盘重装win7系统呢&#xff1f;下面系统城小编…

服务器系统报错00007b,重装win7系统出现蓝屏0X0000007B的解决方法

重装win7系统出现蓝屏0X0000007B的解决方法分享给大家&#xff0c;重装XP系统蓝屏怎么办&#xff0c;代码为0X0000007B(0XF7A83528&#xff0c;0XC0000034&#xff0c;0X00000000&#xff0c;0X00000000)&#xff0c;这个该怎么解决呢?其实听到蓝屏这个词很多用户都非常熟悉&a…

DOS重装win7系统

DOS重装win7系统 我的是联想电脑 一、开机&#xff0c;按fnf12&#xff0c;进入pe系统 二、点第7个&#xff08;新机版&#xff09; 三、选择G 纯DOS模式 & MINI DOS MODE 四、在这里输入&#xff1a;ctmouse&#xff0c;然后按entere键。 五、然后再输入&…

重装Win7系统后,鼠标和键盘都无法使用

前几天对公司电脑做了维护&#xff0c;其中有一台机子系统崩溃&#xff0c;重装系统后出现了鼠标、键盘均不可用的情况。同时该机子是台式机&#xff0c;系统是Win7&#xff0c;无法触屏控制。 排除各种硬件上的异常&#xff0c;我发现是Win7系统中USB驱动有问题。 察觉到问题…

计算机如何重装网络,电脑无网络怎么重装?离线一键重装win7系统教程

电脑无网络怎么重装&#xff1f;因为一些原因&#xff0c;部分用户的电脑处于无网络的状态下。如果想要重装系统&#xff0c;则需要网络来下载重装软件进行重装。那么无网络是不是就无法重装系统呢&#xff1f;其实无网络也能重装系统。下面就让小编为大家带来离线一键重装win7…

重装Win7系统步骤和详细教程

重装win7系统&#xff1f;现在来说越来越多的朋友都喜欢自己来重装系统&#xff0c;喜欢动手&#xff0c;但是依旧有很多朋友不会重装&#xff0c;虽然想操作&#xff0c;但奈何没有人教&#xff0c;那么这里将给这些朋友一个详细的重装win7系统的教程&#xff0c;一步一步的安…

win7计算机进行重镜像,win7镜像重装系统图文教程

win7系统可是现在最多用户使用的一种系统&#xff0c;重装系统win7的方法依然是搜索人数最多的&#xff0c;那win7镜像重装系统的方法是什么呢&#xff1f;会不会很复杂呢&#xff1f;这些还是不少的用户关心的问题&#xff0c;今天我们就一起来探讨win7镜像重装系统的方法吧。…

联想台式计算机重装系统教程,联想台式机重装win7系统教程

下载一键重装系统工具进行重做系统的话&#xff0c;一定是要有网的情况下才能够进行操作联想台式机重装win7系统的过程的&#xff0c;如果我们的手上闲余的U盘的话&#xff0c;就可以联想台式机安装win7系统了。 我们每天都在使用台式机&#xff0c;随着时间的推移&#xff0c;…