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 |
| GND | GND |
| VCC | 3.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”可执行文件ÿ…...
腾讯云企业网盘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. 长度最小的子数…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
