“声震四方,贼人退散;平安守护,行者无忧。”#STM32项目一 电动车报警器
- 前言
- 预备知识
- 1.电动车报警器项目概述
- 1.1项目需求
- 1.2项目框图
- 1.3.硬件清单
- 2.振动传感器介绍及实战
- 2.1振动传感器介绍
- 2.2振动传感器接线
- 2.3使用STM32CubeMX建立工程
- 2.4程序代码实现思路
- 2.5重新编写中断服务函数
- 2.6解决单片机卡主BUG
- 3.继电器介绍及实战
- 3.1继电器工作原理
- 3.2继电器接线
- 3.3延用上一个工程代码,继电器接线与LED1相同。
- 4. 433M无线发射接收模块介绍及实践
- 4.1 433M无线发射接收模块介绍
- 4.2 433M接线
- 4.3 433M编程实现
- 5.电动车报警器项目设计及实现
- 5.1电动车报警器项目接线
- 5.2修改STM32CudeMX内433M无线发射接收模块介绍及实践工程,使之达到项目要求。如下图步骤
- 5.3项目设计思路见中断服务函数
- 5.4中断服务函数代码及哄定义
- 结束语
前言
本篇博文介绍的是基于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建立工程
- 配置SYS。如下图步骤
- 配置RCC。如下图步骤。
- 配置时钟。如下图步骤。
- 配置GPIO口。如下图步骤。
- 将PA4配置成低电平触发的外部中断4。如下图步骤。
- 配置PB8默认输出高电平,使LED1默认关闭。如下图步骤。
- 配置NVIC,打开使能外部中断4。如下图步骤。
- 修改工程名字,路径和能用Keil 5打开。如下图步骤。
- 勾选建立工程所必须生成的文件。如下图步骤。
2.4程序代码实现思路
程序需求:当振动传感器接收到振动,STM32单片机控制LED灯亮。
思路:重新编写中断服务函数,检测中断源状态,控制LED点亮。
2.5重新编写中断服务函数
-
中断服务函数构建思路请看代码注释
-
中断服务函数代码体现
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);
}
}
}
- 烧写程序进入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);
}
}
}
- 此时将程序烧写进单片机后会出现LED一直亮的结果,也就是单片机运行卡住了。
2.6解决单片机卡主BUG
- BUG分析
直接在中断服务函数里调用 HAL_Delay 函数,则会造成系统卡死。
原因:程序初始化时默认把滴答定时器的中断优先级设为最低,其它中断源很容易打断它导致卡死。
- 解决办法
在 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.3V
,5V
容易出问题。
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编程实现
- 需求:按下遥控器A按键,LED1亮2秒;按下遥控器B按键,LED2亮1秒。
- 在STM32CudeMX内修改继电器实战工程,使之达到需求的要求。工程建立如下面的图片
-
编程核心思路见代码注释。
-
中断服务函数代码。
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
口
所有模块VCC
和GND
按要求
接单片机对应引脚
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;
}
}
结束语
很高兴您能看到这里,点个赞再走呗。谢谢您啦!!!