当前位置: 首页 > news >正文

STM32F1开发实例-振动传感器(机械)

振动(敲击)传感器

振动无处不在,有声音就有振动,哒哒的脚步是匆匆的过客,沙沙的夜雨是暗夜的忧伤。那你知道理科工程男是如何理解振动的吗?今天我们就来讲一讲本节的主角:最简单的机械式振动传感器。

下图即为振动传感器,外形有几种,原理都相同:1个弹簧电极+1个金属电极,振动时弹簧抖动碰到紧挨的金属电极,两个电极就会瞬间接通。我们通过单片机监测两电极的通断就可以知道当前是否发生振动,振动的频率是多少。原理就这么简单,准备上手!

 

一、硬件准备

  • 振动传感器1个,0.85元。
  • STM32F103核心板一块,某宝7块9。供电线跟你的手机充电线一样。
  • 面包板套件一套,某宝13.8元。不买套件,随手弄几根杜邦线也OK。
  • 仿真器,某宝7.5元。

   

 注:除了传感器以外,剩下的和其他实验共用,无需反复购买。

STM32F103核心板3.3V接面包板3.3V,GND接面包板GND;LED为板载,接口为PC13。

STM32F103核心板与振动传感器接线如下。

传感器引脚核心板引脚
S(信号输出)PA15
GNDGND
VCC3.3

二、软件准备

参见"STM32F1开发实例-开发环境搭建"。

三、实际效果

振动面包板,单片机侦测到传感器发出的信号,板载LED亮起1s后熄灭。

四、代码实现

项目工程源码如下:

https://download.csdn.net/download/wangpeng421/87548936

主程序代码如下:

//------引用头文件
#include "main.h"
#include "delay.h"
#include "timerPwm.h"
#include "led.h"
#include "ioSensor.h"//---------------------------
//主函数
//---------------------------
int main(void) 
{  SysInit();									//系统初始化,如时钟等UserInit();  								//用户初始化,如传感器IO口等while(1){			//-----高速代码执行区ioSensorScan();						    //传感器扫描引脚信号if(ioSensor1.Status==_ON)				//如果传感器被触发		{__LED1_On(); 						//点亮led1led1.Status=_ON;                    //将led1状态设置为ON}//-----中速代码执行区.单位时间100us。if(SpeedCon_Num >= 10)//1ms进入1次{SpeedCon_Num=0;if(led1.Status==_ON)            //如果led1状态为ON{led1.onTime++;              //led1点亮计时if(led1.onTime>1000)		//1s后熄灭LED{led1.onTime=0;          //计时清零__LED1_Off(); 			//熄灭led1	led1.Status=_Off;			//将led1状态设置为OFF}}else                            //led1没有亮起,则计时始终清零led1.onTime=0;}}
}

传感器驱动头文件:ioSensor.h

注:此类传感器均为简单的高低电平检测,所以编入IO触发类,通用ioSensor驱动。

//===============================================
//驱动名称:IO类传感器驱动
//公司名称: 
//代码编写: 苏墨 2020-05-12
//API 说明:1.头文件定义IO -> 初始化"io_SensorInit()" -> 调用"ioScan()"。
//			2.通过查询"ioSensor.Status"即可获取按键状态。按键状态值如下。
//			#define _OFF                 0x00          //释放
//			#define _ON                  0x01          //触发
//			#define _LongON              0x02          //长时间触发
//其他说明:
//===============================================
#ifndef __ioSensor_H__
#define __ioSensor_H__
#include "sys.h"	 //-----IO定义
#define ioSensor1_PIN        GPIO_PIN_15					//传感器1
#define ioSensor1_Port       GPIOA
#define ioSensor2_PIN        GPIO_PIN_10					//传感器2
#define ioSensor2_Port       GPIOC
#define ioSensor3_PIN        GPIO_PIN_4						//传感器3
#define ioSensor3_Port       GPIOC
//------IO宏
#define __Enable_ioSensor_Port()				do{__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();}while(0U)//-----结构体
struct ioSensor{ u8 onTime;					//触发计时.ONu8 offTime;					//释放计时.OFFu8 Status;					//状态u16 longOnTime;				//长触发计时.LongON
};//-----常量
#define _OFF                     0x00          //释放
#define _ON                 	 0x01          //触发
#define _LongON            	 	 0x02          //长按//-----变量
extern struct ioSensor ioSensor1;
extern struct ioSensor ioSensor2;
extern struct ioSensor ioSensor3;//-----函数
void ioSensorInit();              //初始化
void ioSensorScan();              //扫描
#endif

传感器驱动代码:ioSensor.c

#include "ioSensor.h"//-----常量//-----变量
struct ioSensor ioSensor1;
struct ioSensor ioSensor2;
struct ioSensor ioSensor3;//-----函数声明
void ioSensorInit();              //初始化
void ioSensorScan();              //扫描//---------------------------
//初始化
//输入参数:无
//输出参数:无
//其他说明:
//---------------------------
void ioSensorInit()
{GPIO_InitTypeDef GPIO_Initure;__Enable_ioSensor_Port();GPIO_Initure.Pin=ioSensor1_PIN;GPIO_Initure.Mode=GPIO_MODE_INPUT;      		//输入模式GPIO_Initure.Pull=GPIO_PULLUP;                  //上拉GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;        //快速            HAL_GPIO_Init(ioSensor1_Port,&GPIO_Initure);
}//---------------------------
//扫描
//输入参数:无
//输出参数:无
//其他说明:结构体将指明按键状态信息。详见.h文件。
//---------------------------
#define _OnTime         0         //触发计时.
#define _LongOnTime     1000      //长按计时.
#define _OffTime	    500       //释放计时
void ioSensorScan()
{//-----ioSensor1if(HAL_GPIO_ReadPin(ioSensor1_Port,ioSensor1_PIN)==1){ioSensor1.offTime=0;ioSensor1.onTime++;if(ioSensor1.onTime>_OnTime){ioSensor1.onTime=_OnTime;ioSensor1.Status=_ON; }}else{//------------ioSensor1.offTime++;if(ioSensor1.offTime>_OffTime){ioSensor1.onTime=0;ioSensor1.longOnTime=0;ioSensor1.Status=_OFF;}}
}

led驱动头文件:led.h

//===============================================
//驱动名称:led驱动
//公司名称: 
//代码编写: 苏墨 2020-05-12
//API 说明:1.头文件定义IO -> 初始化"ledInit()"。
//		    2.通过"led.Status"查询或设置led状态。状态值如下。
//			#define _OFF                 0x00          //释放
//			#define _ON                  0x01          //触发
//			通过“__LEDx_On()、__LEDx_Off()”控制对应LED亮灭。
//其他说明:
//===============================================
#ifndef __led_H__
#define __led_H__
#include "sys.h"	 //-----IO定义
#define LED1_Pin        				GPIO_PIN_13
#define LED1_Port       				GPIOC
#define LED2_Pin        				GPIO_PIN_14
#define LED2_Port       				GPIOC
//-----宏
#define __Enable_LED_Port()			do{__HAL_RCC_GPIOC_CLK_ENABLE();}while(0U)
#define __LED1_On()     	  		do{HAL_GPIO_WritePin(LED1_Port,LED1_Pin,GPIO_PIN_RESET);}while(0U)
#define __LED1_Off()    				do{HAL_GPIO_WritePin(LED1_Port,LED1_Pin,GPIO_PIN_SET);}while(0U) 		
#define __LED2_On()     	  		do{HAL_GPIO_WritePin(LED1_Port,LED2_Pin,GPIO_PIN_RESET);}while(0U)		
#define __LED2_Off()    				do{HAL_GPIO_WritePin(LED1_Port,LED2_Pin,GPIO_PIN_SET);}while(0U) //-----结构体
struct led{ u16 onTime;					//触发计时.ONu16 OffTime;				//释放计时.OFFu8 Status;					//状态
};//-----常量//-----变量
extern struct led led1;	//-----函数
void ledInit();#endif

led驱动代码:led.c

#ifndef __led_H__
#define __led_H__
#include "sys.h"	 //-----IO定义
#define LED1_Pin        				GPIO_PIN_13
#define LED1_Port       				GPIOC
#define LED2_Pin        				GPIO_PIN_14
#define LED2_Port       				GPIOC
//-----宏
#define __Enable_LED_Port()			do{__HAL_RCC_GPIOC_CLK_ENABLE();}while(0U)
#define __LED1_On()     	  		do{HAL_GPIO_WritePin(LED1_Port,LED1_Pin,GPIO_PIN_RESET);}while(0U)
#define __LED1_Off()    				do{HAL_GPIO_WritePin(LED1_Port,LED1_Pin,GPIO_PIN_SET);}while(0U) 		
#define __LED2_On()     	  		do{HAL_GPIO_WritePin(LED1_Port,LED2_Pin,GPIO_PIN_RESET);}while(0U)		
#define __LED2_Off()    				do{HAL_GPIO_WritePin(LED1_Port,LED2_Pin,GPIO_PIN_SET);}while(0U) //-----结构体
struct led{ u16 onTime;					//触发计时.ONu16 OffTime;				//释放计时.OFFu8 Status;					//状态
};//-----常量//-----变量
extern struct led led1;	//-----函数
void ledInit();#endif

相关文章:

STM32F1开发实例-振动传感器(机械)

振动(敲击)传感器 振动无处不在,有声音就有振动,哒哒的脚步是匆匆的过客,沙沙的夜雨是暗夜的忧伤。那你知道理科工程男是如何理解振动的吗?今天我们就来讲一讲本节的主角:最简单的机械式振动传感器。 下图即为振动传…...

2023最新ELK日志平台(elasticsearch+logstash+kibana)搭建

去年公司由于不断发展,内部自研系统越来越多,所以后来搭建了一个日志收集平台,并将日志收集功能以二方包形式引入自研系统,避免每个自研系统都要建立一套自己的日志模块,节约了开发时间,管理起来也更加容易…...

2023-3-10 刷题情况

打家劫舍 IV 题目描述 沿街有一排连续的房屋。每间房屋内都藏有一定的现金。现在有一位小偷计划从这些房屋中窃取现金。 由于相邻的房屋装有相互连通的防盗系统,所以小偷 不会窃取相邻的房屋 。 小偷的 窃取能力 定义为他在窃取过程中能从单间房屋中窃取的 最大…...

如何建立一个成功的MES?

制造执行系统(MES)是一种为制造业企业提供实时生产过程控制、管理和监视的信息系统。一个成功的MES系统可以帮助企业提高生产效率,降低成本,提高产品质量,提高客户满意度等。下面是一些关键步骤来建立一个成功的MES系统…...

Kafka生产者幂等性/事务

Kafka生产者幂等性/事务幂等性事务Kafka 消息交付可靠性保障: Kafka 默认是:至少一次最多一次 (at most once) : 消息可能会丢失,但绝不会被重复发送至少一次 (at least once) : 消息不会丢失,但有可能被重复发送精确一次 (exact…...

JavaWeb--案例(Axios+JSON)

JavaWeb--案例(AxiosJSON)1 需求2 查询所有功能2.1 环境准备2.2 后端实现2.3 前端实现2.4 测试3 添加品牌功能3.1 后端实现3.2 前端实现3.3 测试1 需求 使用Axios JSON 完成品牌列表数据查询和添加。页面效果还是下图所示: 2 查询所有功能 …...

css制作动画(动效的序列帧图)

相信 animation 大家都用过很多,知道是 CSS3做动画用的。而我自己就只会在 X/Y轴 上做位移旋转,使用 animation-timing-function 规定动画的速度曲线,常用到的 贝塞尔曲线。但是这些动画效果都是连续性的。 今天发现个新功能 animation-timi…...

【设计模式】装饰器模式

装饰器模式 以生活中的场景来举例,一个蛋糕胚,给它涂上奶油就变成了奶油蛋糕,再加上巧克力和草莓,它就变成了巧克力草莓蛋糕。 像这样在不改变原有对象的基础之上,将功能附加到原始对象上的设计模式就称为装饰模式(D…...

Nginx配置实例-反向代理案例一

实现效果:使用nginx反向代理,访问 www.suke.com 直接跳转到本机地址127.0.0.1:8080 一、准备工作 Centos7 安装 Nginxhttps://liush.blog.csdn.net/article/details/125027693 1. 启动一个 tomcat Centos7安装JDK1.8https://liush.blog.csdn.net/arti…...

Java中IO流中字节流(FileInputStream(read、close)、FileOutputStream(write、close、换行写、续写))

IO流:存储和读取数据的解决方案 纯文本文件:Windows自带的记事本打开能读懂 IO流体系: FileInputStream:操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来 书写步骤:①创建字节输入流对象 …...

C#完全掌握控件之-combbox

无论是QT还是VC,这些可视化编程的工具,掌握好控件的用法是第一步,C#的控件也不例外,尤其这些常用的控件。常见控件中较难的往往是这些与数据源打交道的,比如CombBox、ListBox、ListView、TreeView、DataGridView. 文章…...

STL的空间配置器(allocator)

简答: 在CSTL中,空间配置器便是用来实现内存空间(一般是内存,也可以是硬盘等空间)分配的工具,他与容器联系紧密,每一种容器的空间分配都是通过空间分配器alloctor实现的。 解析: 1.两种C类对象实例化方式的异同在c中&a…...

linux系统莫名其妙的环境变量问题

今天使用Ubuntu20.04系统,使用less命令查看日志,发现日志中的“中文”显示为乱码; 使用vim命令查看该日志文件也显示为乱码; 使用more命令查看该日志文件则显示正常。 首先查询系统的字符集编码,发现编码正常支持中…...

使用 Microsoft Dataverse 简化的连接快速入门

重复昨天本地部署dynamics实例将其所有的包删除之后,再次重新下载回来。运行填写跟之前登陆插件一样的信息点击login 然后查看控制台,出现这样就说明第一个小示例就完成了。查看你的dy365平台下的 “我的活动”就可以看到刚刚通过后台代码创建的东西了。…...

PLSQL Developer 安装指南

PLSQL Developer 是 Oracle 的客户端。 下面以64位破解版的PLSQL Developer为例,进行PLSQL Developer 安装讲解。 0. 下载 PLSQL Developer https://download.csdn.net/download/Shipley_Leo/87557938 1. 根据操作系统选择对应“plsqldev.exe”可执行文件&#xff…...

腾讯云企业网盘2.5版本全新发布啦!!!

腾讯云企业网盘又又又更新啦!本期重点打磨管理协同、企业安全守护能力,同时也不断强化自身产品体验,助力企业高效办公~那么,此次更新具体有什么安全可靠的新功能呢?今天就带大家一起解锁~01协同管理,提升工…...

Excel职业版本(4)

图表 图表基本结构 组成元素 图表的分类 柱状图 介绍:在竖直方向比较不同类型的数据 适用场景:用于二维数据集,对于不同类型的数据进行对比,也可用于同一类型的数据在不同的时间维度的数据对比,通过柱子的高度来反…...

3-2 SpringCloud快速开发入门:Ribbon 实现客户端负载均衡

接上一章节Ribbon 是什么,这里讲讲Ribbon 实现客户端负载均衡 Ribbon 实现客户端负载均衡 由于 Spring Cloud Ribbon 的封装, 我们在微服务架构中使用客户端负载均衡调用非常简单, 只需要如下两步: 1、启动多个服务提供者实例并…...

ChatGPT,乌合之众的疯狂

最近ChatGPT有多火爆就不用我说了。公司里,从CEO到技术人员,乃至于门口的保安、食堂的大婶,没有一个不会聊两句ChatGPT的。连我20年未见的小学同学、三线城市警官,都问我这东西能不能给领导写汇报材料。 用不了多久,家…...

代码随想录刷题-数组-长度最小的子数组

文章目录长度最小的子数组习题暴力解法滑动窗口长度最小的子数组 本节对应代码随想录中:代码随想录,讲解视频:拿下滑动窗口! | LeetCode 209 长度最小的子数组_哔哩哔哩_bilibili 习题 题目链接:209. 长度最小的子数…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

ios苹果系统,js 滑动屏幕、锚定无效

现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...