家庭IOT监测之红外HC-SR501及上传ONENET

本篇目标:驱动红外传感器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的代码非常简单,主要就是外部中断的代码:

  1. 配置对应IO为输入。
  2. 配置外部中断EXTI,选择对应正确的外部中断组。
  3. 配置中断源和相应中断优先级即可。
  4. 编写中断函数:
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,以达到监控的目的。继续学习,共勉~

猜你喜欢

转载自blog.csdn.net/q361750389/article/details/79421039