红外感应检测之蜂鸣器报警

举报
秦玉安 发表于 2021/08/30 11:47:23 2021/08/30
【摘要】 红外检测到蜂鸣器报警

1:场景感应

楼道小夜灯,家庭感应开关,防盗报警等等应用。

2:环境搭建

  • 硬件环境:小熊派开发板和ESP8266模块以及E53_IS1 扩展板(红外感应)

  • 开发环境:VS Code 和IoT Link插件

  • 平台:huaweiyun

  • 通讯协议:MQTT

    image-20210830111504596

3:整体功能

  • 当红外感应触发时,蜂鸣器报警
  • 将感应信息状态上传到云平台

4:创建项目

具体如何创建项目产品,参考下面链接,这里不做多讲

https://support.huaweicloud.cn/devg-iothub/iot_01_0053.html

5:创建设备并接入

具体如何创建项目产品,参考下面链接,这里也不做多讲

https://support.huaweicloud.cn/devg-iothub/iot_02_0170.html

6:功能实现,红外检测感应后报警

6.1:创建工程

image-20210830112521086

6.2:配置调试工程

串口波特率配置

image-20210830112717893

WIFi模块配置

image-20210830112806583

工程名称配置

image-20210830112845742

配置好后,编译工程

image-20210830113000767

烧录工程

image-20210830113055907

6.3:功能调试验证

首先,查看我们的红外感应的外部驱动文件。报警模块采用蜂鸣器,使用无源蜂鸣器,需要用PWM输出,红外感应设置输入模式。

#include "E53_IS1.h"
#include "stm32l4xx.h"


TIM_HandleTypeDef htim16;

void Infrared_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */

  IS1_IN_GPIO_CLK_ENABLE();
	
	GPIO_InitStruct.Pin = IS1_IN_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  HAL_GPIO_Init(IS1_IN_GPIO_Port, &GPIO_InitStruct);
	
}

/***************************************************************
* 函数名称: MX_TIM16_Init
* 说    明: 初始化定时器16
* 参    数: 无
* 返 回 值: 无
***************************************************************/
/* TIM16 init function */
void MX_TIM16_Init(void)
{
  TIM_OC_InitTypeDef sConfigOC;
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;

  htim16.Instance = TIM16;
  htim16.Init.Prescaler = 79;
  htim16.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim16.Init.Period = 999;
  htim16.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim16.Init.RepetitionCounter = 0;
  htim16.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim16) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  if (HAL_TIM_PWM_Init(&htim16) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 499;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  if (HAL_TIM_PWM_ConfigChannel(&htim16, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  sBreakDeadTimeConfig.DeadTime = 0;
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  sBreakDeadTimeConfig.BreakFilter = 0;
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  if (HAL_TIMEx_ConfigBreakDeadTime(&htim16, &sBreakDeadTimeConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  HAL_TIM_MspPostInit(&htim16);

}
/***************************************************************
* 函数名称: HAL_TIM_Base_MspInit
* 说    明: 使能定时器16时钟,设置时钟源
* 参    数: 无
* 返 回 值: 无
***************************************************************/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

	if(tim_baseHandle->Instance==TIM16)
  {
  /* USER CODE BEGIN TIM16_MspInit 0 */

  /* USER CODE END TIM16_MspInit 0 */
    /* TIM16 clock enable */
    __HAL_RCC_TIM16_CLK_ENABLE();
  /* USER CODE BEGIN TIM16_MspInit 1 */

  /* USER CODE END TIM16_MspInit 1 */
  }
}

/***************************************************************
* 函数名称: HAL_TIM_MspPostInit
* 说    明: 使能定时器16硬件初始化
* 参    数: 无
* 返 回 值: 无
***************************************************************/
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  if(timHandle->Instance==TIM16)
  {
  /* USER CODE BEGIN TIM16_MspPostInit 0 */

  /* USER CODE END TIM16_MspPostInit 0 */
  
    /**TIM16 GPIO Configuration    
    PB8     ------> TIM16_CH1 
    */
    GPIO_InitStruct.Pin = IS1_Beep_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF14_TIM16;
    HAL_GPIO_Init(IS1_Beep_GPIO_Port, &GPIO_InitStruct);

  /* USER CODE BEGIN TIM16_MspPostInit 1 */

  /* USER CODE END TIM16_MspPostInit 1 */
  }

}

/***************************************************************
* 函数名称: Init_Beep
* 说    明: 初始化E53_IS1的蜂鸣器
* 参    数: 无
* 返 回 值: 无
***************************************************************/
void Init_Beep(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  IS1_Beep_GPIO_CLK_ENABLE();

	 /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(IS1_Beep_GPIO_Port, IS1_Beep_Pin, GPIO_PIN_RESET);
	
	 /*Configure GPIO pin : PtPin */
  GPIO_InitStruct.Pin = IS1_Beep_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(IS1_Beep_GPIO_Port, &GPIO_InitStruct);
}
/***************************************************************
* 函数名称: Init_E53_IS1
* 说    明: 初始化E53_IS1扩展板
* 参    数: 无
* 返 回 值: 无
***************************************************************/
void Init_E53_IS1(void)
{
	Init_Beep();
  Infrared_Init();
	MX_TIM16_Init();	
}

/***************************************************************
* 函数名称: E53_IS1_Beep_StatusSet
* 说    明: E53_IS11蜂鸣器报警与否
* 参    数: status,枚举的数据
*									OFF,关蜂鸣器
*									ON,开蜂鸣器
* 返 回 值: 无
***************************************************************/
void E53_IS1_Beep_StatusSet(E53_IS1_Status_ENUM status)
{
	if(status == ON)
		HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1);
	if(status == OFF)
		HAL_TIM_PWM_Stop(&htim16,TIM_CHANNEL_1);
}

其次,查看功能文件oc_infrared_template.c。

#include <stdint.h>
#include <stddef.h>
#include <string.h>

#include <osal.h>
#include <oc_lwm2m_al.h>
#include <link_endian.h>

#include "E53_IS1.h"
#include "lcd.h"

#include <gpio.h>
#include <stm32l4xx_it.h>

#define cn_endpoint_id        "BearPi_0001"
#define cn_app_server         "119.3.250.80"
#define cn_app_port           "5683"

typedef unsigned char int8u;
typedef char int8s;
typedef unsigned short int16u;
typedef short int16s;
typedef unsigned char int24u;
typedef char int24s;
typedef int int32s;
typedef char string;
typedef char array;
typedef char varstring;
typedef char variant;

#define cn_app_infrared 0x0

#pragma pack(1)
typedef struct
{
    int8u messageId;
    string Status[4];
} tag_app_infrared;
#pragma pack()


tag_app_infrared infrared;


//if your command is very fast,please use a queue here--TODO
#define cn_app_rcv_buf_len 128
static int             s_rcv_buffer[cn_app_rcv_buf_len];
static int             s_rcv_datalen;
static osal_semp_t     s_rcv_sync;


//use this function to push all the message to the buffer
static int app_msg_deal(void *usr_data, en_oc_lwm2m_msg_t type, void *data, int len)
{
    unsigned char *msg;
    msg = data;
    int ret = -1;

    if(len <= cn_app_rcv_buf_len)
    {
    	if (msg[0] == 0xaa && msg[1] == 0xaa)
    	{
    		printf("OC respond message received! \n\r");
    		return ret;
    	}
        memcpy(s_rcv_buffer,msg,len);
        s_rcv_datalen = len;

        osal_semp_post(s_rcv_sync);
        ret = 0;

    }
    return ret;
}

static int app_report_task_entry()
{
    int ret = -1;

    oc_config_param_t      oc_param;
    
    memset(&oc_param,0,sizeof(oc_param));

    oc_param.app_server.address = cn_app_server;
    oc_param.app_server.port = cn_app_port;
    oc_param.app_server.ep_id = cn_endpoint_id;
    oc_param.boot_mode = en_oc_boot_strap_mode_factory;
    oc_param.rcv_func = app_msg_deal;

    ret = oc_lwm2m_config( &oc_param);
    if (0 != ret)
    {
    	return ret;
    }

    //install a dealer for the led message received
    while(1) //--TODO ,you could add your own code here
    {
        infrared.messageId = cn_app_infrared;
        oc_lwm2m_report((char *)&infrared, sizeof(infrared), 1000);
        osal_task_sleep(2*1000);
    }


    return 0;
}

static int app_collect_task_entry()
{
    Init_E53_IS1();
    while (1)
    {
        if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9)==SET)
        {
            
            E53_IS1_Beep_StatusSet(ON);
            infrared.Status[0] = 'H';
            infrared.Status[1] = 'a';
            infrared.Status[2] = 'v';
            infrared.Status[3] = 'e';

        }
        else
        {
            E53_IS1_Beep_StatusSet(OFF);
            infrared.Status[0] = ' ';
            infrared.Status[1] = ' ';
            infrared.Status[2] = 'N';
            infrared.Status[3] = 'O';
        }
        osal_task_sleep(2*1000);
    }
    return 0;
}


#include <stimer.h>

int standard_app_demo_main()
{
	LCD_Clear(BLACK);
	POINT_COLOR = GREEN;
	LCD_ShowString(10, 10, 200, 16, 24, "Welcome to BearPi");
	LCD_ShowString(40, 50, 200, 16, 24, "Infrared Demo");
	LCD_ShowString(10, 90, 200, 16, 16, "NCDP_IP:");
	LCD_ShowString(80, 90, 200, 16, 16, cn_app_server);
	LCD_ShowString(10, 130, 200, 16, 16, "NCDP_PORT:");
	LCD_ShowString(100, 130, 200, 16, 16, cn_app_port);

	osal_semp_create(&s_rcv_sync,1,0);

    osal_task_create("app_collect",app_collect_task_entry,NULL,0x400,NULL,3);
    osal_task_create("app_report",app_report_task_entry,NULL,0x1000,NULL,2);


    return 0;
}

这个工程可以看到主要是两个功能,红外触发报警和数据上传功能。这里说红外触发报警功能,后续再记录上传数据功能。

最后,查看代码功能部分,红外检测出发后报警。查看函数代码:

static int app_collect_task_entry()
{
    Init_E53_IS1();
    while (1)
    {
        if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9)==SET)
        {
            
            E53_IS1_Beep_StatusSet(ON);
            infrared.Status[0] = 'H';
            infrared.Status[1] = 'a';
            infrared.Status[2] = 'v';
            infrared.Status[3] = 'e';

        }
        else
        {
            E53_IS1_Beep_StatusSet(OFF);
            infrared.Status[0] = ' ';
            infrared.Status[1] = ' ';
            infrared.Status[2] = 'N';
            infrared.Status[3] = 'O';
        }
        osal_task_sleep(2*1000);
    }
    return 0;
}

image-20210830113911833

测试的时候,用手挡住模块,蜂鸣器就会报警了。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。