项目需求
点击遥控器
A
按键,系统进入警戒模式,一旦检测到震动(小偷偷车),则喇叭发出声响报警,
吓退小偷。
点击遥控器
B
按键,系统退出警戒模式,再怎么摇晃系统都不会报警,否则系统一直发出尖叫,
让车主尴尬。
项目框图
硬件清单
- 振动传感器
- 继电器
- 高功率喇叭
- 433M无线接收发射模块
- 杜邦线
各个硬件的介绍和实战
a.振动传感器
介绍
- 单片机供电VCC GND接单片机
- 产品不震动,输出高电平,模块上的DO口
- 产品震动,输出低电平,绿色指示灯亮
- AO口不用
在STM32CubeMX建立项目
- 在SYS里Debug设置为串口Serial Write
- RCC配置HSE振荡器时钟
- 配置Clock Configuration,遵循一条主线和72Mhz
- 打开PA4的GPIO_EXTI4,
- 打开PB8的GPIO_OUTPUT
- 将PB8起始位调为高电平,不亮
- 将PA4选择下降沿触发中断
-
将中断EXTI4打开
编程实现
需求:当振动传感器接收到振动信号时,使用中断方式点亮
LED1
。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
//一根中断线上接有多个中断源,判断中断请求是否来自PA4
if(GPIO_Pin == GPIO_PIN_4)
{
//如果检测到PA4被拉低
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_RESET)
{
//则点亮LED1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
//延时1秒
HAL_Delay(1000);
//关闭LED1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
}
else
{
//未检测到PA4被拉低,则关闭LED1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
}
}
}
如果直接在中断服务函数里调用 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无线发射接收模块
介绍
- 单片机供电VCC GND接单片机
- 接收到信号,接收模块对应针脚输出高电平
- 有D0 D1 D2 D3,对应遥控器的ABCD
编程实现
需求:按下遥控器 A 按键, LED1 亮 1 秒;按下遥控器 B 按键, LED2 亮 1 秒。D0 -- PA5D1 -- PA6
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
switch(GPIO_Pin)
{
//如果检测到PA5拉高(按键A被按下)
case GPIO_PIN_5:
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5) == GPIO_PIN_SET)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
}else
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
}
//将PB8拉低,LED1亮1秒
break;
//如果检测到PA6拉高(按键B被按下)
case GPIO_PIN_6:
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6) == GPIO_PIN_SET)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);
}else
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);
}
//将PB9拉低,LED2亮1秒
break;
}
}
项目设计及实现
项目设计需求
- 如果检测到PA4被拉低(小偷偷车),并且警报模式打开
- 则将PB7拉低,继电器通电,喇叭一直响
- 按下A按键,启动警报模式
- 启动时,PA5拉高,同时PB7拉低,响2秒后,电平恢复,进入警报模式,标志位为ON
- ON时,当有小偷偷车,PA4拉低,触发PB7拉低,继电器通电,报警器一直响
- 按下B按键,解除警报模式
- 启动时,PA6拉高,同时PB7拉低,响1秒后,电平恢复,解除警报模式,标志位为OFF
- OFF时,再怎么抖动小车都不会响
编程实现
#define ON 1
#define OFF 0
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
static int mark = OFF;
switch(GPIO_Pin)
{
case GPIO_PIN_4:
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4) == GPIO_PIN_RESET && mark == ON)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);//拉低继电器,警报器响
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);//LED1亮
HAL_Delay(2000);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//LED2亮
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);//LED1灭
HAL_Delay(2000);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_-SET);//LED2灭
}
break;
//如果检测到PA5拉高(按键A被按下)
case GPIO_PIN_5:
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5) == GPIO_PIN_SET)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);//拉低继电器,警报器响
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);//LED1亮
HAL_Delay(2000);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);//拉高继电器,警报器不响
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);//LED1灭
mark = ON;
}
break;
//如果检测到PA6拉高(按键B被按下)
case GPIO_PIN_6:
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6) == GPIO_PIN_SET)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);//拉低继电器,警报器响
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//LED2亮
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);//拉高继电器,警报器不响
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//LED2灭
mark = OFF;
}
break;
}
}