项目需求
点击遥控器 A 按键,系统进入警戒模式,一旦检测到震动(小偷偷车),则喇叭发出声响报警,
吓退小偷。
点击遥控器 B 按键,系统退出警戒模式,再怎么摇晃系统都不会报警,否则系统一直发出尖叫,
让车主尴尬。
项目框图
硬件清单
振动传感器
继电器
高功率喇叭
433M
无线接收发射模块
杜邦线
振动传感器介绍及实战
振动传感器介绍
单片机供电 VCC GND 接单片机
产品不震动,输出高电平,模块上的 DO 口 产品震动,输出低电平,绿色指示灯亮
AO 口不用
振动传感器编程实现
如果直接在中断服务函数里调用 HAL_Delay 函数,则会造成系统卡死。
原因:程序初始化时 默认把滴答定时器的中断优先级设为最低 ,其它中断源很容易打断它导致卡
死。
解决:在 main 函数里使用以下函数提高滴答定时器的中断优先级(提升至 0 ):
HAL_NVIC_SetPriority(SysTick_IRQn,0,0);
并且将 EXTI4 的中断优先级设置比滴答定时器的中断优先级高,比如 2 。
b.
继电器介绍及实战
继电器工作原理
单片机供电
VCC GND
接单片机,
VCC
需要接
3.3V
,
5V
不行!
最大负载电路交流
250V/10A
,直流
30V/10A
引脚
IN
接收到低电平时,开关闭合
编程实现
c. 433M
无线发射接收模块介绍及实战
433M
无线发射接收模块介绍
单片机供电
VCC GND
接单片机
接收到信号,接收模块对应针脚输出高电平
有
D0 D1 D2 D3,对应遥控器的ABCD
编程实现
需求:按下遥控器
A
按键,
LED1
亮
1
秒;按下遥控器
B
按键,
LED2
亮
1
秒。
D0 -- PA5
D1 -- PA6
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
switch(GPIO_Pin)
{
case GPIO_PIN_5:
//如果检测到PA5被拉高(按键A被按下)
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5) == GPIO_PIN_SET)
{
//则将PB8拉低,LED1亮1秒
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
}
else
{
//如果未检测到PA5,则关闭LED1
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
}
break;
case GPIO_PIN_6:
//如果检测到PA6被拉高(按键B被按下)
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6) == GPIO_PIN_SET)
{
//则将PB8拉低,LED2亮1秒
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);
}
else
{
//如果未检测到PA6,则关闭LED2
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);
}
break;
}
}
项目设计及实现
项目设计
//
如果检测到
PA4
被拉低(小偷偷车),并且警报模式打开
//
则将
PB7
拉低,继电器通电,喇叭一直响
//
如果检测到
PA5
被拉高(按键
A
按下),设定为开启警报模式
//
则将
PB7
拉低(喇叭响),
2
秒后恢复电平(喇叭不响),表示进入警报模式
//
同时将标志位设置为
ON
//
如果检测到
PA6
被拉高(按键
B
按下),设定为关闭警报模式
//
则将
PB7
拉低(喇叭响),
1
秒后恢复电平(喇叭不响),表示关闭警报模式
//
同时将标志位设置为
OFF
编程实现
//重写中断服务函数,如果检测到EXTI中断请求,则进入此函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
static int mark = J_OFF;
switch(GPIO_Pin)
{
//如果检测到PA4被拉低(小偷偷车),并且警报模式打开
case GPIO_PIN_4:
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4) == GPIO_PIN_RESET && mark == J_ON)
{
//拉低PB7,继电器通电,喇叭一直响
HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);
}
break;
//如果检测到PA5被拉高(按键A被按下),设为开启警报模式
case GPIO_PIN_5:
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5) == GPIO_PIN_SET)
{
//则将PB7拉低(喇叭响),2秒,进入报警模式
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);
HAL_Delay(2000);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);
//同时将标志位设为ON开启
mark = J_ON;
}
break;
//如果检测到PA6被拉高(按键B被按下),设为关闭警报模式
case GPIO_PIN_6:
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6) == GPIO_PIN_SET)
{
//则将PB7拉低(喇叭响),1秒,关闭报警模式
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);
//同时将标志位设为OFF开启
mark = J_OFF;
}
break;
}
}