使用STM32 再实现电动车防盗

news2024/11/24 5:31:31

项目需求

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

项目框图

模块介绍

振动传感器

产生震动时,会输出低电平,绿色指示灯亮(开关信号指示灯)

继电器模块

(VCC =3.3V)当IN输入低电平时,ON 和 COM会导通,模块上的绿灯会亮

遥控收发 433M

发送端按下ABCD会在接收端被芯片调制解调,最终解析成不同的信号来识别,接收端的D0, D1, D2, D3 对应A,B,C,D,收到哪个对应的信号,相应的引脚就会给出高电平

CubeMX配置

1.初始配置

2.震动传感器的DO口接到了PA4,所以将PA4配置成中断模式,且由于DO口拉低代表有震动,所以将模式改为下降沿触发

3.先只测试振动传感器模块

打开stm32f1xx_it.c -->EXTI4_IRQHandler(void)--> HAL_GPIO_EXTI_IRQHandler(vibrate_senior_Pin); --> HAL_GPIO_EXTI_Callback( )

HAL_GPIO_EXTI_Callback()就是中断处理程序,将他在main.c中重写:

其中weak是虚拟函数,重写的话会覆盖在此函数之上的

只测试振动传感器模块的

/*重写中断服务函数,如果检测到EXTI中断请求,则进入此函数*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
//	一根中断线上接多个中断源,判断中断源是否来自PA4
	if(GPIO_Pin == GPIO_PIN_4)
	{
		if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4) == GPIO_PIN_RESET)
		//	如果坚持到PA4被拉低
		{
			//点亮LED1,否则关闭LED1
			 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
			HAL_Delay(500);
		}
		else
		{
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
		}
	}
	
}

PS:如果直接在中断服务函数里调用 HAL_Delay ()函数,则会造成系统卡死。 

原因:程序初始化时默认把滴答定时器的中断优先级设为最低,其它中断源很容易打断它导致卡死,也就是说当Delay函数在进行中的时候,如果又发生了震动触发了外部中断,就会又立刻执行这个中断处理程序,导致喇叭一直在响无法停下。

解决办法:

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

HAL_NVIC_SetPriority(SysTick_IRQn,0,0); //必须写在" SystemClock_Config() "后面!!!

并且在CubeMX中将 EXTI4 的中断优先级设置比滴答定时器的中断优先级低,比如 2

然后可以在CubeMX重新生成代码(generate code),Keil中此时会自动弹出这个对话框问是否要重载,选择“是”此时会将刚刚Cube中做出的修改反映到Keil中,并保留之前在Keil中自己写的代码!

 加上继电器和遥控模块

遥控模块:
按下遥控器 A 按键, LED1 亮LED2灭 ;按下遥控器 B 按键, LED2 亮LED1灭
D0 -- PA5,打开中断,进入警报模式
D1 -- PA6,打开中断,退出警报模式
继电器:IN--PB6
#define state_ON 1
#define state_OFF 0

/*重写中断服务函数,如果检测到EXTI中断请求,则进入此函数*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//外部中断的处理函数,一根中断线上接多个中断源,判断中断源是否来自PA4,PA5,PA6
{
	static int status = state_OFF; //此处一定要加static,不然每次调用这个函数都会被赋值一遍
	
	/*switch(GPIO_Pin)
	{
		case GPIO_PIN_4:
			if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4) == GPIO_PIN_RESET&& (status == state_ON))//如果检测到PA4被拉低
			{
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);//继电器打开
			}
		break;
			// 如果检测到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);//LED1亮
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);//LED2灭
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
				HAL_Delay(1000);
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
				status = state_ON;// 将标志位设置为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_9, GPIO_PIN_RESET);//LED2亮
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);//LED1灭
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
				HAL_Delay(1000);
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
				status = state_OFF;// 将标志位设置为OFF
			}
		break;
	}*/

	
	if((GPIO_Pin == GPIO_PIN_4) && (status == state_ON))	//如果检测到PA4被拉低,且模式为警戒模式,则将P6拉低,继电器打开,喇叭响;没有检测到则不响
	{
		if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4) == GPIO_PIN_RESET)//如果检测到PA4被拉低
		{
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);//继电器打开
		}
	}
	
	if(GPIO_Pin == GPIO_PIN_5)//D0,PA5被拉高(按键A按下),进入警戒模式,LED1亮、LED2灭
	{
		if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == GPIO_PIN_SET){// 如果检测到PA5被拉高(按键A按下),设定为警报模式
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);//LED1亮
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);//LED2灭
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
			HAL_Delay(1000);
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
			status = state_ON;// 将标志位设置为ON
		}

	}
	
	if(GPIO_Pin == GPIO_PIN_6)//D1,对应按键B,按下解除警戒模式,LED2亮、LED1灭
	{
		if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_SET){// 如果检测到PA6被拉高(按键B按下),设定为关闭警报模式
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);//LED2亮
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);//LED1灭
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
			HAL_Delay(1000);
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
			status = state_OFF;// 将标志位设置为OFF
		}
	
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1532232.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vscode搜索总是搜到修改记录文件如何处理

如图每次搜索出来的结果总是有好多编辑记录中的文件,给自己找文件及提交代码时带来很大困扰,每次都得删特别麻烦。 解决办法: 如上图在插件里找到 local history 点击 ”禁用“ 即可。以后再编辑代码就不会产生修改记录文件了。 如果直接搜索…

【matlab安装casadi】

虽然安装起来很简单,但是网上没找到好的教程,姑且写一下记录一下 首先到github找到对应的库:https://github.com/casadi/casadi找到发布的版本,点进去 这里就可以点进去下载自己需要的版本了下面也有对应的下载后的安装方式&…

ArcGIS Pro与R:携手优化生态系统服务评估流程

生态系统服务是指生态系统所形成的用于维持人类赖以生存和发展的自然环境条件与效用,是人类直接或间接从生态系统中得到的各种惠益。联合国千年生态系统评估(Millennium ecosystem assessment,MA)提出生态系统服务包括供给、调节、…

linux系统--------------mysql数据库管理

目录 一、SQL语句 1.1SQL语言分类 1.2查看数据库信息 1.3登录到你想登录的库 1.4查看数据库中的表信息 1.5显示数据表的结构(字段) 1.5.1数据表的结构 1.5.2常用的数据类型: 二、关系型数据库的四种语言 2.1DDL:数据定义语言&am…

【堆】Top-K问题

标题:C语言库函数scanf()解读 水墨不写bug (图片来源于网络) 正文开始: Top-K问题是一类问题的统称: 即根据对象的某一属性,找出这个属性最突出的K个对象,并且通常对象…

Midjourney发布新特性风格参考

1. 引言 最近,Midjourney 推出了Style Reference V2.0 即功能更加强大的风格参考工具,该工具可以让大家参考其他图像的风格,生成与参考图像风格保持一致,与文本提示词语义内容保持一致的图像。它与图像提示类似,但是只…

LightDB24.1 存储过程支持inner和outer对变量的引用

背景 Oracle oracle plsql支持如下场景: 在for循环中,将select查询的结果给一个record类型,这一操作也被称为隐式游标操作。record类型中一个字段用来接收查询结果中的一个select查询语句(update,delete,insert在这个语法中都会…

ELK快速搭建图文详细步骤

目录 一、下载地址二、安装docker-compose(已安装则跳过)三、初始化ELK1. 赋予/setup/entrypoint.sh执行权限2. 初始化 docker-elk 所需的 Elasticsearch 用户和组3. 重置默认用户的密码4. 替换配置文件中的用户名和密码5. 重启 Logstash 和 Kibana,使用新密码重新连…

蓝桥杯单片机快速开发笔记——NE555测频

一、原理分析 NE555作为一种多功能集成电路,在信号发生和频率测量方面具有广泛的应用。通过合理配置和连接外部元件,可以实现不同类型的信号发生和频率测量功能。 原理: 信号发生器: NE555可以配置为多种不同的振荡器电路&#x…

鸿蒙Harmony应用开发—ArkTS-转场动画(组件内转场)

组件内转场主要通过transition属性配置转场参数,在组件插入和删除时显示过渡动效,主要用于容器组件中的子组件插入和删除时,提升用户体验。 说明: 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记…

leetcode代码记录(移除链表元素

目录 1. 题目:2. 我的代码:小结: 1. 题目: 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head […

学点Java打小工_Day2Day3_一点作业

1 猜数字(10次机会) 随机生成[1,1000]的一个数,输入你猜的数程序会给出反馈,直到猜对或次数用尽(10次)。 //猜数字 10次机会Testpublic void guessNumber() {Random random new Random();// [0, 1000) 1// [1, 1000]int num ra…

基于 Echarts + Python Flask ,我搭建了一个动态实时大屏监管系统

一、效果展示 1. 动态实时更新数据效果图 2. 鼠标右键切换主题 二、确定需求方案 支持Windows、Linux、Mac等各种主流操作系统;支持主流浏览器Chrome,Microsoft Edge,360等;服务器采用python语言编写,配置好python环…

linux---文件查找

知识点: whereis 可以搜索传统命令的可执行文件路径和说明文档 which 搜索可执行文件 #whereir包含了which locate 在数据库中进行快速查找 find . -name 文件名/文件名要求 #按文件名查找. -iname 文件名 #按文件名查找且…

【史上最全万字mysql进阶语法】

前言: 💞💞大家好,书生♡,今天主要和大家分享一下mysql的进阶语法,数据库的分组/分页/排序/子查询以及详细案例,希望对大家有所帮助。 💞💞前路漫漫,希望大家坚持下去&am…

2024年最新Anaconda3 2024版中Jupyter Notebook安装

一、 Anaconda3 2024版下载 1.下载:Free Download | Anaconda 2.等待 解释:默认选择等等下载 ,时间可能数分钟 3.安装 解释:打开刚刚下载的Anaconda Navigator,并如图安装低版本,高版本会直接报错 4. …

ES8生产实践——性能压测工具esrally

引言 什么是压测 压测,即压力测试,是指对计算机系统、软件应用或网络服务等进行负载测试,以模拟实际使用场景中的高负载情况,检验系统在压力下的性能、稳定性和可靠性。压测旨在确定系统在正常或极端负载下的性能极限&#xff0…

首个业内DNA存储技术规范发布

在DNA数据存储的检索过程中,采用了三个输入对应一个输出逻辑实现的算法模式来生成数据表示的模式。这一算法模式的设计是为了有效编码和解码存储在DNA分子上的信息。 其中提到的“扰动比例”δ(n)是一个关键概念,它衡量的是在总的细胞数目(此…

【MySQL】图形化界面工具DataGrip安装&配置&使用

前言 大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎! 本章主要内容面向接触过C Linux的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的…

Redis6.0多线程的疑惑解答

1.Redis6.0之前的版本真的是单线程吗? Redis在处理客户端的请求是,包括获取(socket读)、解析、执行、内容返回(socket 写)等都有一个 顺序串行的主线程处理,这就是所谓的"单线程"。但如果严格来讲并不是单线程,除了主线…