基于STM32的电动车防盗器设计

目录

1.项目需求

2.项目框图

3.相应模块介绍及实战

3.1 振动传感器介绍

3.1.1 产品参数

3.1.2 硬件连接

3.1.3 编程实现

3.2 继电器介绍及实战

3.2.1 继电器工作原理

 3.2.2 编程实现

3.3 433M无线发射接收模块介绍及实战

3.3.1 433M无线发射接收模块介绍

3.3.2 编程实现

4.项目设计实现

4.1 项目设计

4.2 项目实现

4.2.1 STM32CubeMx配置

4.2.2 编程实现


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)
{
    //一根中断线上接有多个中断源,判断中断请求是否来自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 的中断优先级设置比滴答定时器的中断优先级高,比如 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)
            {
                //则点亮LED1
                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;
        // 如果检测到PA6被拉高(按键B按下)
        case GPIO_PIN_6:
            if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_SET)
            {    
                //则点亮LED2
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);
                HAL_Delay(1000);
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);
            }
            else
            {
                //如果未检测到PA4,则关闭LED1
                HAL_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;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值