震动传感器,我们从名字中应该就可以判断,传感器能够检测震动中的物体。我们用什么来做震动传感器呢?那就是滚珠开关。滚珠开关,其内部含有导电珠子,器件一旦震动,珠子随之滚动,就能使两端的导针导通。

通过这个原理,我们可以做一些小玩具结合起来。最常见的,比如我们看到一些小孩子穿的一闪一闪的小鞋子!走动的过程,就能使内部珠子滚动。

只要传感器检测到东西震动,就会有信号输出。这里,我们想通过滚珠开关做个简单的震动传感器,并把震动传感器和LED的结合,当传感器检测到物体震动时,LED亮起,停止震动时,LED关闭。

所需元件

硬件连接

从滚珠开关这个名字,我们可以把它和什么联想在一起?就是按键开关,滚珠开关和我们项目三中介绍的按钮在硬件连接是完全相同的,原理也相似。只是使用方法不同而已。可以把下图对应项目三的一起看,你会发现很多相似之处。滚珠开关也需要一个下拉电阻,LED需要一个限流电阻。

输入代码

样例代码8-1

//项目八 – 震动传感器
int SensorLED = 13; //定义LED为数字引脚13
int SensorINPUT = 3; //连接震动开关到中断1,即数字引脚3
unsigned char state = 0;
void setup() { pinMode(SensorLED, OUTPUT); //LED为输出模式pinMode(SensorINPUT, INPUT); //震动开关为输入模式//低电平变高电平的过程中,触发中断1,调用blink函数attachInterrupt(1, blink, RISING); }
void loop(){if(state!=0){ // 如果state不是0时state = 0; // state值赋为0digitalWrite(SensorLED,HIGH); // 亮灯delay(500); //延时500ms} else{ digitalWrite(SensorLED,LOW); // 否则,关灯}
}
void blink(){ //中断函数blink()
state++; //一旦中断触发,state就不断自加
}

当我们晃动板子时,LED灯也会随之亮,一旦停止晃动,LED灯又恢复到熄灭的状态。

代码回顾

代码虽不长,但还是不太容易理解的。先大致说下代码的运行过程。

在没有任何打扰的情况下,程序在不断运行着…,让LED一直处于关闭。突然,被人打扰了(也就是晃动板子),就跳到中断函数blink()中(当然进入中断也是要条件的,我们后面说)。此时,state不断自加,连锁反应的,主函数中if函数检测到state不为0了,那么就让LED亮起了,同时又重新让state为0,等待下一次中断。如果没有中断的话,LED有恢复到关闭的状态。

重复的知识点不再赘述,重点说下中断函数attachInterrupt()。

什么是中断?打个比方吧,比如你在家看电视,突然家里电话铃响了,那么你不得不停下看电视先去接电话,等接完电话后,你又可以继续看电视啦!在整个过程中接电话就是一个中断过程,电话铃响就是中断的标志,或者说中断条件。


现在知道中断是什么意思了,再回到**attachInterrupt()函数,它是一个当外部发生中断时,才被唤醒的函数。区别于其他函数,它依附于中断引脚才发生。大多数板子都有两个外部中断引脚:数字引脚2(中断0)和数字引脚3(中断1)。**中断0与中断1是中断号,在函数中需要用到。不同板子,中断号对应引脚可能不同,可以查阅Arduino官方编程语法手册(http://arduino.cc/en/Reference/AttachInterrupt)。

attachInterrupt()需要三个传递参数:

interrupt:中断号0或者1。如果选 择0的话,连接到数字引脚2上,选择1的话,连接到数字引脚3上。

function:调用的中断函数名。写中断函数时,需要特别说明以下三点:

1、我们在写中断函数的时候,该函数不能含有参数和返回值。也就是说,要是一个无返回值的函数。

2、中断函数中不要使用delay()和millis()函数,因为数值不会继续变化。

3、中断函数中不要读取串口,串口收到的数据可能会丢失。

mode:中断的条件。只有特定的以下四种情况:

1、LOW 当引脚为低电平时,触发中断。

2、CHANGE 当引脚电平发生改变时,触发中断。

3、RISING 当引脚由低电平变为高电平时,触发中断。

4、FALLING 当引脚由高电平变为低电平时,触发中断。

知道了attachInterrupt()函数的用法,回归到我们的代码中:


对应上面说明看。1,指中断号1。所以滚珠开关接到数字引脚3。blink是我们下面要调用的中断函数。RISING,指引脚3在由低变为高的一瞬间,中断触发。

为什么要选RISING呢?由于硬件我们还没提到,我们就把滚珠开关想象成按键。在按键没按下时,是断开的,引脚3处于低的状态。一旦被按下,就和5V导通,变为高。

这个过程是引脚由低电平变高电平的过程,所以选择RISING模式。

硬件回顾

滚珠开关

滚珠开关,也叫做珠子开关,震动开关等等。虽然叫法不同,不过原理是相同的。就是通过珠子滚动接触导针的原理来控制电路的通断。

看下结构图就明白了。


滚珠开关内部两个珠子,通过珠子滚动接触导针的原理来控制电路的接通或者断开。传感器震动或者晃动时,珠子就会接触导针,从而导通。还需要注意的一点是,由于滚珠开关的内部构造,滚珠开关只有一头是导通的,金色导针一端是导通的,银色导针一端是不导通的。

这也就是为什么,往金色一端倾斜,灯会点亮,而偏向银色一端倾斜时,灯不会被点亮的原因。

原文来自DF创客社区:https://mc.dfrobot.com.cn/forum.php?mod=forumdisplay&fid=92&filter=typeid&typeid=426

【基础系列教程】项目八:震动传感器相关推荐

  1. STM32 基础系列教程 50 – MbedTls

    前言 mbed TLS(以前称为PolarSSL)是TLS和SSL协议的实现,并且需要相应的加密算法和支持代码.这是双重许可与Apache许可证 2.0版(与GPLv2许可也可).网站上指出,mbed ...

  2. STM32 基础系列教程 40 - Lwip_mqtt

    前言 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级&qu ...

  3. STM32 基础系列教程 14 - IIC

    前言 学习stm32 IIC接口的使用,用IIC 接口实现与IIC设备的通信功能. 示例详解 基于硬件平台: STM32F103C8T6最小系统板, MCU 的型号是 STM32F103c8t6, 使 ...

  4. STM32 基础系列教程 49 – Jansson

    前言 JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全 ...

  5. STM32 基础系列教程 48 – CJSON

    前言 JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全 ...

  6. STM32 基础系列教程 47 - MD5

    前言 MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信 ...

  7. STM32 基础系列教程 46 – RNG

    前言 随机数发生器(RNG)是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个 32 位的随机数.STM32F407自带RNG ,本节将给大演示STM32F4系列MCU中的RNG的使用.用 ...

  8. STM32 基础系列教程 45 - FSMC_LCD_Touch

    前言 上一节我们完成了用 STM32F4的 FSMC接口来控制 TFTLCD的显示的操作,其实正点原子的探索者F4开发板带的屏幕支持触摸操作,笔者用的是4.3寸的电容触摸屏,本节我们继续实验,来完成基 ...

  9. STM32 基础系列教程 44 - FSMC_LCD

    前言 TFT-LCD 即薄膜晶体管液晶显示器.其英文全称为: Thin Film Transistor-Liquid Crystal Display. TFT-LCD 与无源 TN-LCD. STN- ...

最新文章

  1. 朴素、Select、Poll和Epoll网络编程模型实现和分析——Poll、Epoll模型处理长连接性能比较
  2. CentOS5.5环境下布署LVS+keepalived
  3. python 办公自动化-Python办公自动化|从Excel到Word
  4. anaconda和vscode配置python_vscode配置anaconda3的方法步骤
  5. J-1 Java概述
  6. Neo4j:Cypher –删除重复的节点
  7. 【算法分析与设计】快速幂算法与快速幂取模算法
  8. JAMstack简介:现代Web的体系结构
  9. Ajax(2)--Ajax核心工作机制 你忘记了吗?
  10. azure云数据库_配置Azure SQL数据库防火墙
  11. Android 悬浮窗的实现(类似于360加速球)
  12. 将.ncm文件转换为.mp3文件
  13. php迅雷地址解析,迅雷地址在线解密–PHP源码
  14. Python tan函数图像绘制,不带有极值的线条
  15. 打孔式计算机,矩阵式打孔计算机3005-D型
  16. 腾讯实习生面试经历分享
  17. Spring Security 退出登录(7)
  18. 迪科斯特拉算法(Dijkstra Algorithm)
  19. layui单据打印_layui打印表格自定义函数
  20. Java基础之map总结

热门文章

  1. 那些过目不忘的 H5 页面
  2. CGAL中2D三角剖分
  3. 猿玖科技程序员-猿勇强
  4. 普霖Pulin PR-04 支票打印机驱动
  5. 如何通过css强制文字换行
  6. Serv-U的使用说明
  7. linux权限——符超
  8. 计算机网络教程第五版|微课版 - 缩写词+全称+中文
  9. MAUI桌面端标题栏设置和窗口调整
  10. LVDS-CML-LVPECL 原理及转换