STM32——06-STM32电动车报警器

项目需求
点击遥控器 A 按键,系统进入警戒模式,一旦检测到震动(小偷偷车),则喇叭发出声响报警,
吓退小偷。
点击遥控器 B 按键,系统退出警戒模式,再怎么摇晃系统都不会报警,否则系统一直发出尖叫,
让车主尴尬。

项目框图
STM32——06-STM32电动车报警器_第1张图片
硬件清单
振动传感器
继电器
高功率喇叭
433M 无线接收发射模块
杜邦线
振动传感器介绍及实战

振动传感器介绍

单片机供电 VCC GND 接单片机

产品不震动,输出高电平,模块上的 DO 口 产品震动,输出低电平,绿色指示灯亮

AO 口不用STM32——06-STM32电动车报警器_第2张图片

振动传感器编程实现 

如果直接在中断服务函数里调用 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 接收到低电平时,开关闭合
STM32——06-STM32电动车报警器_第3张图片

STM32——06-STM32电动车报警器_第4张图片 

编程实现
c. 433M 无线发射接收模块介绍及实战
433M 无线发射接收模块介绍
单片机供电 VCC GND 接单片机
接收到信号,接收模块对应针脚输出高电平
D0 D1 D2 D3,对应遥控器的ABCD STM32——06-STM32电动车报警器_第5张图片
编程实现
需求:按下遥控器 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

 STM32——06-STM32电动车报警器_第6张图片

 编程实现

//重写中断服务函数,如果检测到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;
	}
}

你可能感兴趣的:(STM32,单片机,嵌入式硬件,stm32)