红外感应检测之蜂鸣器报警
【摘要】 红外检测到蜂鸣器报警
1:场景感应
楼道小夜灯,家庭感应开关,防盗报警等等应用。
2:环境搭建
-
硬件环境:小熊派开发板和ESP8266模块以及E53_IS1 扩展板(红外感应)
-
开发环境:VS Code 和IoT Link插件
-
平台:huaweiyun
-
通讯协议:MQTT
3:整体功能
- 当红外感应触发时,蜂鸣器报警
- 将感应信息状态上传到云平台
4:创建项目
具体如何创建项目产品,参考下面链接,这里不做多讲
https://support.huaweicloud.com/devg-iothub/iot_01_0053.html
5:创建设备并接入
具体如何创建项目产品,参考下面链接,这里也不做多讲
https://support.huaweicloud.com/devg-iothub/iot_02_0170.html
6:功能实现,红外检测感应后报警
6.1:创建工程
6.2:配置调试工程
串口波特率配置
WIFi模块配置
工程名称配置
配置好后,编译工程
烧录工程
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;
}
测试的时候,用手挡住模块,蜂鸣器就会报警了。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)