“声震四方,贼人退散;平安守护,行者无忧。”#STM32项目一 《电动车报警器》

前言

  本篇博文介绍的是基于STM32F103C8T6单片机第一个项目《电动车报警器》,包含电动车报警器项目概述,振动传感器介绍及实战,继电器介绍及实战,433M无线发射接收模块介绍及实践,电动车报警器项目设计及实现。看到这篇博文的朋友,可以先赞再看吗?

预备知识

  一、基本电路标识识别和接线,例如VCC,GND。
  二、电脑基本操作复制粘贴
  三、分文件编程
  四、C变量
  五、基本输入输出
  六、流程控制
  七、函数

  如果以上知识不清楚,请自行学习后再来浏览。如果我有没例出的,请在评论区写一下。谢谢啦!

1.电动车报警器项目概述

1.1项目需求

  点击遥控器 A 按键,系统进入警戒模式,一旦检测到震动(小偷偷车),则喇叭发出声响报警,吓退小偷。

  点击遥控器 B 按键,系统退出警戒模式,再怎么摇晃系统都不会报警,否则系统一直发出尖叫,让车主尴尬。

1.2项目框图

在这里插入图片描述

1.3.硬件清单

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

2.振动传感器介绍及实战

2.1振动传感器介绍

  产品不振动,DO输出高电平

  产品振动,DO输出低电平,绿色指示灯亮

2.2振动传感器接线

  VCC、GND接单片机供电部分

  DO接PA4口

  AO不使用

2.3使用STM32CubeMX建立工程

  1. 配置SYS。如下图步骤

在这里插入图片描述

  1. 配置RCC。如下图步骤。

在这里插入图片描述

  1. 配置时钟。如下图步骤。

在这里插入图片描述

  1. 配置GPIO口。如下图步骤。

在这里插入图片描述
在这里插入图片描述

  1. 将PA4配置成低电平触发的外部中断4。如下图步骤。

在这里插入图片描述

  1. 配置PB8默认输出高电平,使LED1默认关闭。如下图步骤。

在这里插入图片描述

  1. 配置NVIC,打开使能外部中断4。如下图步骤。

在这里插入图片描述

  1. 修改工程名字,路径和能用Keil 5打开。如下图步骤。

在这里插入图片描述

  1. 勾选建立工程所必须生成的文件。如下图步骤。

在这里插入图片描述

2.4程序代码实现思路

  程序需求:当振动传感器接收到振动,STM32单片机控制LED灯亮。

  思路:重新编写中断服务函数,检测中断源状态,控制LED点亮。

2.5重新编写中断服务函数

  1. 中断服务函数构建思路请看代码注释

  2. 中断服务函数代码体现

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)
		{
				//等于就开灯
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
		}
		else
		{
	      //不等于就关灯
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
		}
	}
}
  1. 烧写程序进入STM32单片机后灯能与振动同时亮,但是这样的话在构成电动车报警器时喇叭会振动就响,不振动就不响。所以得优化。解决办法就是在检测到振动时,让LED亮一会儿。使用延时函数。
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)
		{
				//等于就开灯
			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);
		}
	}
}
  1. 此时将程序烧写进单片机后会出现LED一直亮的结果,也就是单片机运行卡住了。

2.6解决单片机卡主BUG

  1. BUG分析

  直接在中断服务函数里调用 HAL_Delay 函数,则会造成系统卡死。
  原因:程序初始化时默认把滴答定时器的中断优先级设为最低,其它中断源很容易打断它导致卡死。

  1. 解决办法

  在 main 函数里使用以下函数提高滴答定时器的中断优先级(提升至0) :

HAL_NVIC_SetPriority(SysTick_IRQn,0,0);

  降低EXTI4的中断优先级,例如2。

在这里插入图片描述

  此时通过STM32CudeMX重新生成的工程会对原文件进行修改,所以Keil 5会提示是否重载文件。

在这里插入图片描述

3.继电器介绍及实战

3.1继电器工作原理

  引脚 IN 接收到低电平时,开关闭合,使COM与NO连接,接收到高电平,开关打开,COM与NO断开。

  最大负载电路交流250V/10A,直流30V/10A

3.2继电器接线

  VCC接STM32单片机3V3也就是3.3V5V容易出问题。

  IN接PB8,也就是LED1连接的引脚。

在这里插入图片描述

在这里插入图片描述

3.3延用上一个工程代码,继电器接线与LED1相同。

4. 433M无线发射接收模块介绍及实践

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

  433M接收模块收到遥控器的信号,对应引脚输出高电平。有D0、D1、D2、D3,对应遥控器的ABCD按钮。

4.2 433M接线

  VCC接单片机5V

  GND接单片机GND

  D0接单片机PA5

  D1接单片机PA6

请添加图片描述

4.3 433M编程实现

  1. 需求:按下遥控器A按键,LED1亮2秒;按下遥控器B按键,LED2亮1秒。
  2. 在STM32CudeMX内修改继电器实战工程,使之达到需求的要求。工程建立如下面的图片

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 编程核心思路见代码注释。

  2. 中断服务函数代码。

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	//外部中断线让有很多中断源
	switch(GPIO_Pin)
	{
		//检测中断源是否来自PA5
		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(2000);                                    //使用延时函数,让灯亮2秒
				HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);	  //关灯
			}
			else
			{
					//不来自就关灯
				HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
			}
			break;
		//检测中断源是否来自PA5	
		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);                                    //使用延时函数,让灯亮1秒
				HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);	  //关灯
			}
			else
			{
					//不来自就关灯
				HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);
			}
			break;
	}
	
}

5.电动车报警器项目设计及实现

5.1电动车报警器项目接线

  振动传感器接单片机PA4

  433M接收模块D0、D1接单片机PA5、PA6

  继电器接单片机PB7

  所有模块VCCGND要求接单片机对应引脚

在这里插入图片描述

5.2修改STM32CudeMX内433M无线发射接收模块介绍及实践工程,使之达到项目要求。如下图步骤

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5.3项目设计思路见中断服务函数

5.4中断服务函数代码及哄定义

//定义警报标志宏
#define J_OFF 0
#define J_ON  1

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	//设立警报标志,使用静态变量,防止程序运行中多次调用中断函数导致标志重置
	static char mark = J_OFF;
	
	//外部中断线让有很多中断源
	switch(GPIO_Pin)
	{
		case GPIO_PIN_4:
			//当处于打开警报模式,有小偷偷车
			if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_RESET && mark==J_ON)
			{
				HAL_GPIO_WritePin(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)
			{
					//按下按键A,驱动继电器吸合
				HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);
				HAL_Delay(2000);                                    //使用延时函数,使喇叭响2秒
				HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);	  //关闭喇叭
				mark = J_ON;                                        //设置打开警报标志
			}
			break;
		//检测中断源是否来自PA6	,(按下按键B)
		case GPIO_PIN_6:
			if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_SET)
			{
					//按下按键A,驱动继电器吸合
				HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);
				HAL_Delay(1000);                                    //使用延时函数,使喇叭响1秒
				HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);	  //关闭喇叭
				mark = J_OFF;                                       //设置关闭警报标志         
			}
			
			break;
	}
	
}

结束语

  很高兴您能看到这里,点个赞再走呗。谢谢您啦!!!

  • 32
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"come type6 localbus" 可以理解为 "坐6路公交车来"。 关于如何坐6路公交车,以下是一个300字的回答: 如果你要坐6路公交车,首先你需要找到6路公交车的站点。可以通过查询公交车路线图或者在公交车站牌上找到6路公交车的信息。一般来说,公交车站牌会显示公交车的路线号码和途经站点。这样你就可以确认6路公交车是否经过你想要去的地方。 一旦你找到了6路公交车的站点,确保你有足够的车费以及找零钱的准备。在上车前可以查看公交车站牌上的车票价格或者询问其他乘客。 当公交车到达后,排队有序地上车。有些公交车站会设有候车亭,你可以在那里等待。一旦公交车停下并打开车门,你可以进入公交车。 一旦上车,你可以找个座位坐下或者站在车厢中间握住扶手。确保你抓好平衡,特别是当公交车行驶过弯道或者有人突然停车的时候。 公交车在途中会经过不同的站点。如果你想要下车,可以提前按下车内的停车铃。司机会尽可能安全地停车,然后你可以下车。如果你不熟悉路线,可以询问其他乘客或者观察站牌上的站点名称。 在公交车上,确保你保管好个人物品,不要给贼人提供机会。同时,尊重其他乘客,与他们保持相对安静和整洁的环境。 总的来说,乘坐6路公交车就像乘坐其他公交车一样。确保你知道公交车的路线和站点,并在上车前准备好车费。在车厢内保持平衡,注意乘坐安全。如果需要下车,及时按下停车铃。享受公交车带来的便利和舒适旅程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值