本篇目标:驱动红外传感器HC-SR501,使用STM32F4的中断资源。
材料准备:
- STM32F407上传温湿度至ONENET平台代码:继续在上一篇的基础上进行移植(STM32F4温湿度上传ONENET),或者使用自己其他任意工程都可以。
- STM32F407驱动红外HC-SR501修改代码:为了下载方便,把红外传感器HC-SR501驱动代码和最终修改代码放在了一起(STM32F4驱动红外最终修改工程)
红外HC-SR501硬件连接与接口
红外HC-SR501的接口比较简单,总共三根线,一个VCC,一个GND,一个数据口OUT:有感应时输出高电平,其余时候低电平:
这里用STM32F4的外部中断EXTI来接红外的OUT口,STM32F4的所有IO口都可以配置成外部中断,需要找到IO口对应的外部中断分组:
移植红外HC-SR501驱动
用keil打开上一篇完成温湿度上传ONENET的工程,继续往里面移植传感器代码:
- 将准备材料修改代码中的红外HC-SR501驱动文件夹(infrared)拷贝到stm32f407_iot工程dev文件夹下。
- 在Manage Project Items添加文件夹infrared,然后添加刚才拷贝文件下的C文件。
- 在Options->C/C++->Include Paths添加dev下复制文件夹infrared的路径。
- 修改infrared.h文件中对应的IO引脚,修改成自己对应的接口,应该用注释标出。
- 在main.c中添加头文件:
#include "infrared.h"
- 定位main.c第67行,往Sys_Config();后面添加初始化函数:
/* stm32系统配置 */
Sys_Config();
/* 红外HC-SR501相关初始化配置 */
Infrared_Init(); //新添加
/* SI7021温度传感器IO初始化配置 */
SI_IO_Init();
/* WIFI模块IO初始化配置 */
NET_DEVICE_IO_Init();
- 这样编译通过,烧写后就可以使用红外HC-SR501,查看一下打印:
ps:每当红外被触发的时候,都会被打印出来,需要注意的时候,红外HC-SR501初始化可能需要比较长的时候,而这段时间可能会有1-2次测试输出,可以适当加一点延时滤除。
红外HC-SR501代码解析
红外HC-SR501的代码非常简单,主要就是外部中断的代码:
- 配置对应IO为输入。
- 配置外部中断EXTI,选择对应正确的外部中断组。
- 配置中断源和相应中断优先级即可。
- 编写中断函数:
void Infrared_IRQHandler(void)
{
//确保是否产生了EXTI Line中断
if(EXTI_GetITStatus(Infrared_Exti_Line) != RESET)
{
//检测是否产生红外感应,高电平产生,低电平退出感应
if (Infrared_Read)
{
/*******************在此添加红外中断操作*******************/
printf("Into The Infrared.\r\n");
printf("Infrared test int count : %dp.\r\n", ++Infrared_Count);
/*******************在此添加红外中断操作*******************/
}
else
{
//退出红外
printf("Exit The Infrared.\r\n");
}
//清除中断标志位
EXTI_ClearITPendingBit(Infrared_Exti_Line);
}
}
ps:在中断函数中可以加自己需要的函数操作,在触发红外的时候。中断使用了上升沿和下降沿都触发,这样可以清楚的知道红外模块当前的状态。
红外数据上传ONENET
- 定位main.c第48行,添加变量(触发红外的次数),修改结构体,主要用于定义上传平台的变量:
extern float Temp_buf;
extern float Humi_buf;
extern u16 Infrared_Count; //新添加
DATA_STREAM dataStream[] = {
{"Home_Temp", &Temp_buf, TYPE_FLOAT, 1},
{"Home_Humi", &Humi_buf, TYPE_FLOAT, 1},
{"Home_Infrared", &Infrared_Count, TYPE_USHORT, 1}, //新添加
};
unsigned char dataStreamCnt = sizeof(dataStream) / sizeof(dataStream[0]);
- 登录ONENET查看一下数据,如图:
小结:红外HC-SR501模块相对比较简单,主要用到了STM32F4的外部中断操作,实际上触发红外的次数没有多大的用处,红外中断多用于触发开关,比如后面加入摄像头的时候,当每次触发红外的时候,就打开摄像头,拍下当时的照片,并上传ONENET,以达到监控的目的。继续学习,共勉~