STM32学习——项目一电动车报警器

项目需求

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

项目框图

硬件清单

  • 振动传感器
  • 继电器
  • 高功率喇叭
  • 433M无线接收发射模块
  • 杜邦线

 各个硬件的介绍和实战

a.振动传感器

    介绍

  1. 单片机供电VCC GND接单片机
  2. 产品不震动,输出高电平,模块上的DO
  3. 产品震动,输出低电平,绿色指示灯
  4. AO口不用

 

STM32CubeMX建立项目

  1. 在SYS里Debug设置为串口Serial Write
  2. RCC配置HSE振荡器时钟
  3. 配置Clock Configuration,遵循一条主线和72Mhz
  4. 打开PA4的GPIO_EXTI4,
  5. 打开PB8的GPIO_OUTPUT
  6. 将PB8起始位调为高电平,不亮
  7. 将PA4选择下降沿触发中断
  8. 将中断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. 继电器

    工作原理

  1. 单片机供电VCC GND接单片机,
  2. VCC需要接3.3V5V不行!
  3. 最大负载电路交流250V/10A,直流30V/10A
  4. 引脚 IN 接收到低电平时,开关闭合。

 

c. 433M无线发射接收模块

    介绍

  1. 单片机供电VCC GND接单片机
  2. 接收到信号,接收模块对应针脚输出高电平
  3. 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)
	{
		//如果检测到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;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值