本文主要是介绍基于STM32的电动车防盗器设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.项目需求
点击遥控器 A 按键,系统进入警戒模式,一旦检测到震动(小偷偷车),则喇叭发出声响报警,
吓退小偷。
点击遥控器 B 按键,系统退出警戒模式,再怎么摇晃系统都不会报警,否则系统一直发出尖叫,
让车主尴尬。
2.项目框图
3.相应模块介绍及实战
3.1 振动传感器介绍
3.1.1 产品参数
- 工作电压:3.3V到5V
- 接口类型:数字
- 引脚定义:1–输出 2–电源 3—地
- 平时保持高电平输出,震动时输出低电平
- 本开关在静止时为开路(OFF)状态,当受到外力碰触而达到适当震动力时,或移动速度达到适当离(偏)心力时,导电接脚会发生瞬间导通(ON)状态,使电气特性改变,而当外力消失时电气特性恢复开路(OFF)状态
- 无方向性,任何角度均可以触发工作
- 在外力震动时,达到适当的震动力时导电针将瞬间开启(ON)。
- 无方向,任何角度可能检测震动。
3.1.2 硬件连接
单片机供电VCC GND接单片机;
产品不震动,输出高电平,模块上的DO口;
产品震动,输出低电平,绿色指示灯亮;(低电平有效)
AO口不用;
3.1.3 编程实现
需求:当振动传感器接收到振动信号时,使用中断方式点亮LED1
//重写中断服务函数,如果检测到EXTI中断请求,则进入此函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{//一根中断线上接有多个中断源,判断中断请求是否来自PA4if(GPIO_Pin == GPIO_PIN_4){//如果检测到PA4被拉低if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_RESET){//则点亮LED1HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);//延时1秒HAL_Delay(1000);//关闭LED1HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);}else{//未检测到PA4被拉低,则关闭LED1HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);}}
}
如果直接在中断服务函数里调用 HAL_Delay 函数,则会造成系统卡死。
原因:程序初始化时默认把滴答定时器的中断优先级设为最低,其它中断源很容易打断它导致卡
死。
解决:在 main 函数里使用以下函数提高滴答定时器的中断优先级(提升至0):
HAL_NVIC_SetPriority(SysTick_IRQn,0,0);
并且将 EXTI4 的中断优先级设置比滴答定时器的中断优先级高,比如 1(大于0即可) 。
3.2 继电器介绍及实战
3.2.1 继电器工作原理
单片机供电VCC GND接单片机,VCC需要接3.3V,5V不行!
最大负载电路交流250V/10A,直流30V/10A
引脚 IN 接收到低电平时,开关闭合。(低电平有效)
3.2.2 编程实现
在STM32cubemx中 将PB8配置成输出模式(Output)即可 在代码中其类似与灯LED的电平改写
如上图硬件连接 连接完毕之后在代码中将继电器所在引脚给一个低电平 则喇叭会发出响声 代码与
振动传感器类似 此处省略(在最后总代码中有)
3.3 433M无线发射接收模块介绍及实战
3.3.1 433M无线发射接收模块介绍
单片机供电VCC GND接单片机
接收到信号,接收模块对应针脚输出高电平
有D0 D1 D2 D3,对应遥控器的ABCD
3.3.2 编程实现
需求:按下遥控器A按键,LED1亮1秒;按下遥控器B按键,LED2亮1秒。(高电平为按下)
D0 -- PA5
D1 -- PA6
//重写中断服务函数,如果检测到EXTI中断请求,则进入此函数
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){//则点亮LED1HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);HAL_Delay(1000);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);}else{//如果未检测到PA5,则关闭LED1HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);}break;// 如果检测到PA6被拉高(按键B按下)case GPIO_PIN_6:if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_SET){ //则点亮LED2HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);HAL_Delay(1000);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);}else{//如果未检测到PA4,则关闭LED1HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);}break;}
}
4.项目设计实现
4.1 项目设计
//如果检测到PA4被拉低(小偷偷车),并且警报模式打开
//则将PB7拉低,继电器通电,喇叭一直响
// 如果检测到PA5被拉高(按键A按下),设定为开启警报模式
// 则将PB7拉低(喇叭响),2秒后恢复电平(喇叭不响),表示进入警报模式
// 同时将标志位设置为ON
// 如果检测到PA6被拉高(按键B按下),设定为关闭警报模式
// 则将PB7拉低(喇叭响),1秒后恢复电平(喇叭不响),表示关闭警报模式
// 同时将标志位设置为OFF
4.2 项目实现
4.2.1 STM32CubeMx配置
配置时钟
配置GPIO口
使能中断
4.2.2 编程实现
//外部定义
#define J_ON 1
#define J_OFF 0//重写中断服务函数,如果检测到EXTI中断请求,则进入此函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{ static int mark = J_OFF;//定义成一个静态变釿 若前面不加static 则mark丿直为J_OFF 当触发报警模式后解除警报模式 振动模块收到振动 喇叭还是会响switch(GPIO_Pin){case GPIO_PIN_4:if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4) == GPIO_PIN_RESET && mark == J_ON)//检测到PA4被拉低(振动模块低电平输出)并且报警模式打开{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);//则将PB7拉低,继电器通电,喇叭一直响}break;case GPIO_PIN_5:if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5) == GPIO_PIN_SET)//若将PA5拉高(按键A按下 设定为开启警报模式{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);// 则将PB7拉低(喇叭响),2秒后恢复电平(喇叭不响),表示进入警报模式HAL_Delay(2000);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);mark = J_ON;//设置警报模式(配合振动模块可让喇叭一直响 同时也是振动后喇叭一直响的前提条件)}break;case GPIO_PIN_6:if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6) == GPIO_PIN_SET)//若将PA6拉高(按键B按下{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);// 则将PB7拉低(喇叭响),1秒后恢复电平(喇叭不响),表示关闭警报模式HAL_Delay(1000);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);mark = J_OFF;//解除警报模式}break;}
}
这篇关于基于STM32的电动车防盗器设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!