使用STM32 再实现电动车防盗钥匙扣

news2024/12/23 16:53:19

实现目标

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

2. 点击遥控器 B 按键,系统退出警戒模式,再怎么摇晃系统都不会报警

硬件介绍

1. 震动传感器

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

2. 继电器模块

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

3. 遥控收发 433M

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

CubeMX配置

1. 惯例配置

 

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

 

 3. 配置其他需要使用到的GPIO口, 433M的D0和D1都是上升沿触发无需修改

4. 在NVIC中打开中断: 

 

5. 惯例设置并生成代码

Keil5 代码实现

打开stm32f1xx_it.c --> EXTI4(9_5)_IRQHandler() --> HAL_GPIO_EXTI_IRQHandler() --> HAL_GPIO_EXTI_Callback( )

 

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

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

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

解决办法:

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

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

并且在CubeMX中将 EXTI4 的中断优先级设置比滴答定时器的中断优先级高,比如 2; 将433M的 D0和D1的抢占优先级设为1

  

然后重新生成代码,Keil中此时会自动弹出这个对话框问是否要重载,选择

此时会将刚刚Cube中做出的修改反映到Keil中,并保留之前在Keil中自己写的代码!

//代码仅展示需要自己写的部分,其他自动生成的部分没有展示!
#define secure_ON 1
#define secure_OFF 0

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) //外部中断的处理函数
{
	static int status = secure_OFF; //此处一定要加static,不然每次调用这个函数都要再赋值一遍
	
	//一根中断线上接有多个中断源,判断中断源是否来自PA4
	if((GPIO_Pin == GPIO_PIN_4) && (status == secure_ON)){
	//如果检测到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); //延时1秒
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET); //继电器断开
		}else{
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET); //继电器断开
		}
	}
	
	if(GPIO_Pin == GPIO_PIN_6){ //D0,对应按键A,按下进入禁戒模式
		if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_SET){
			status = secure_ON;
		}
				
	}
	
	if(GPIO_Pin == GPIO_PIN_7){ //D1,对应按键B,按下退出禁戒模式
		if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_7) == GPIO_PIN_SET){
			status = secure_OFF;
		}
	}
}


实现效果

可见,在按下A键后,系统进入警戒模式,继电器会对震动有反应,当按下B键后,解除警报,继电器对震动无反应。 

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

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

相关文章

安装orcle报错:指定的 Oracle 系统标识符 (SID) 已在使用

安装orcle报错:[INS-35075]指定的 Oracle 系统标识符 (SID) 已在使用 说明前面的orcle没有彻底删除 解决这个问题: 搜索框 —— > 输入:regedit ——> 回车 运行regedit,选择HKEY_LOCAL_MACHINE SOFTWARE ORACLE&#xff…

【Android】从零搭建组件化项目

组件化系列文章介绍的内容稍微多了点,本着研究透这玩意的精神,从组件化的简介开始说起。 目录 简介组件化、模块化与插件化开始创建配置共享文件打包模式配置APT与JavaPoet 简介 什么是组件化? 将多个功能模板拆分、重组的过程。 为什么要使…

GEE入门学习,遥感云大数据分析、管理与可视化以及在林业应用丨灾害、水体与湿地领域应用丨GPT模型应用

目录 ①海量遥感数据处理与GEE云计算技术实践应用 ②GPT模型支持下的Python-GEE遥感云大数据分析、管理与可视化技术及多领域案例实践应用 ③GEE遥感云大数据林业应用典型案例实践及GPT模型应用 ④遥感云大数据在灾害、水体与湿地领域典型案例实践及GPT模型应用 ①海量遥感…

78. 左旋转字符串

目录 链接: 题目: 思路: 代码: 图片: 链接: 原题链接 题目: 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。 请定义一个函数实现字符串左旋转操作的功能。 比如输入字…

Talk预告 | 天津大学博士生赵煜:从平面图像中理解空间语义 - 视觉空间位置描述

本期为TechBeat人工智能社区第512期线上Talk! 北京时间7月12日(周三)20:00, 天津大学博士生—赵煜的Talk将准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “从平面图像中理解空间语义-视觉空间位置描述”,届时将与大家…

webpack插件安装

webpack插件安装 1、html-webpack-plugin插件2 、css-loader和style-loader插件3、less-load插件 1、html-webpack-plugin插件 1、下载插件 yarn add html-webpack-plugin -D2、webpack.config.js添加配置 *const HtmlWebpackPlugin require(html-webpack-plugin); const p…

Linux系统编程(信号处理机制)

文章目录 前言一、中断,异常,信号的区别二、信号在Linux中的标识三、信号处理相关函数四、代码实验总结 前言 本篇文章我们来讲解信号的处理机制,信号处理在Linux操作系统中必不可少,这一点值得大家注意,信号又会与中…

打通前后端 -- 创建第一个JSP页面

前言 JSP是由Sun Microsystems公司主导创建的一种动态网页技术标准。 JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。 JSP技术以Java语言作为脚本语言&…

从0-100:约拍小程序开发笔记

背景 摄影师预约小程序功能是一种方便摄影师和客户之间进行预约和安排拍摄的工具。通过该功能,摄影师可以在小程序上设置自己的可预约时间,客户可以根据摄影师的日程安排选择合适的时间进行预约。这样可以提高预约的效率,减少沟通成本&#…

【工具】tempormonkey 同步插件

tempormonkey 同步插件 1.打开tempormonkey的dashboard界面 2.右上角的setting 3.选择谷歌云盘

数字孪生建筑3D可视化运维管理平台降低成本

深圳是我国数字经济重镇,数字经济核心产业增加值占全市GDP逾三成,数字产业化和产业数字化正呈双向融合发展之势。越来越多的企业正与深圳华锐视点一道,利用互联网、大数据、云计算、人工智能、区块链、5G、数字孪生等技术优势,赋能…

Red Hat Linux官网下载地址

注册一个账号,就可以从官网下载最新版本的Red Hat 企业版Linux。

从0到100:定制公交预约小程序开发笔记

业务背景 可以让用户通过手机随时随地进行公交车的预约,无需排队等候,节省了用户的时间和精力。通过公交预约小程序,用户可以提前预约座位,避免了拥挤和等待时间,提高了公交出行的效率。可以根据用户的预约情况&#…

软考A计划-系统集成项目管理工程师-项目成本管理-下

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

k8s 的命名空间一直 Terminating

查看命名空间状态,[NAMESPACE] 处于 Terminating kubectl get ns使用强制删除命令没有效果 kubectl delete namespace [namespace] --force --grace-period0 解决办法:删除部署文件 yaml 中的 finalizers 属性 kubectl get namespace [NAMESPACE] -o …

AIGCxRPA打造更智能的数字员工,帮助千行万业实现新生产力的跃升

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 金融行业,长久以来一直是新科技的最佳试验场。作为一个高度数字化、信息密集的行业,金融业对于新科技的吸纳和应用具有天然的优势和需求。数字经济的崛起,更加快了金融行业对智能化的渴望…

低代码开发的兴衰

刚才在思考写一个PPT,然后留下一些辅料,给大家分享出来。 (1)DOS时代的爽:1981-1995 一、Dbase:一体化,前中后端都搞定 1、后端-数据层:数据库系统(DBASE本质其实是个单机…

RPC分布式网络通信框架(四)—— 异步日志模块设计

文章目录 异步日志模块Logger类实现线程安全LockQueue类实现 异步日志模块 问题:由于RPC服务器端采用了epoll+多线程 ,并发处理来自客户端的请求,所以有可能造成多线程同时写日志信息。 将日志信息写入一个queue中,然…

MySQL select查询练习

一、创表并插入数据 创表: CREATE TABLE worker (部门号 int NOT NULL,职工号 int NOT NULL,工作时间 date NOT NULL,工资 float(8,2) NOT NULL,政治面貌 varchar(10) NOT NULL DEFAULT 群众,姓名 varchar(20) NOT NULL,出生日期 date NOT NULL,性别 char(1) DEFAU…

【ElasticSearch】ES与MySQL数据同步方案及Java实现

文章目录 一、同步实现思路1、方案一:同步调用2、方案二:异步通知3、方案三:监听binlog 二、实现ES与MySQL数据同步1、导入hotel-admin工程2、项目分析3、SpringAMQP整合4、声明队列和交换机5、发送消息MQ6、监听MQ消息7、测试同步功能 一、同…