Arduino 各种模块篇 震动模块 常开 震动传感器模块
以下是店家提供的一部分资料
一共就需要3根线
——————————————————分割线————————————————————————
用于各种震动触发作用,报盗报警,智能小车,电子积木等。
请注意这个模块在感应到小的震动时触发时间会很短,不够驱动继电器,有些人的资料显示可以直接和继电器模块相连,实际运用效果不佳。
1、采用本公司生产的各种灵敏度震动开关,默认用SW-18020P震动传感器,。
2、比较器输出,信号干净,波形好,驱动能力强,超过15mA
3、工作电压3.3V-5V
4、输出形式 :数字开关量输出(0和1)
5、设有固定螺栓孔,方便安装
6、小板PCB尺寸:3.2cm x 1.4cm
7、使用宽电压LM393比较器
模块使用说明:
1、产品不震动时,震动开关呈断开状态,输出端输出高电平,绿色指示灯不亮;
2、产品震动时,震动开关瞬间导通,输出端输出低电平,绿色指示灯亮;
3、输出端可以与单片机直接相连,通过单片机来检测高低电平,由此来检测环境是否有震动,起到报警作用
本系列模块的产品正反面外观图
单片机测试程序
/******************************************
东莞市丰川电子有限公司
传感器触发测试
单片机:STC89C52
波特率:9600
产品用途:震动感应触发,报警触发。
*****************************************/
#include <reg52.h>
unsigned char date;
#define uchar unsigned char
#define uint unsigned int
sbit key1=P0^1;
/* 函数申明 -----------------------------------------------*/
void delay(uint z);
void Initial_com(void);
//***********************************************************
/*
********************************************************************************
** 函数名称 : delay(uint z)
** 函数功能 : 延时函数
********************************************************************************
*/
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
//******************************
//*****串口初始化函数***********
//******************************
void Initial_com(void)
{
EA=1; //开总中断
ES=1; //允许串口中断
ET1=1; //允许定时器T1的中断
TMOD=0x20; //定时器T1,在方式2中断产生波特率
PCON=0x00; //SMOD=0
SCON=0x50; // 方式1 由定时器控制
TH1=0xfd; //波特率设置为9600
TL1=0xfd;
TR1=1; //开定时器T1运行控制位
}
//*************************
//**********主函数*********
//*************************
main()
{
Initial_com();
while(1)
{
if(key1==0)
{
delay(); //消抖动
if(key1==0) //确认触发
{
SBUF=0X01;
delay(200);
}
}
if(RI)
{
date=SBUF; //单片机接受
SBUF=date; //单片机发送
RI=0;
}
}
}
——————————————————分割线————————————————————————
看上面的51例子还不算太难。
现在我们看一下分析原理:
原帖地址:http://blog.sina.com.cn/s/blog_624e2b450100olkw.html
实验器材:Arduino 168P 基础套件 互动媒体
1.Arduino 168P 开发板一个
2.USB下载线一条
3. SW-18010P 震动传感器一个
4.LED一个
5.200欧姆电阻一个
6.面包板一块
7.面包板跳线若干条
实验目的:学习SW-18010P 震动传感器的工作原理,以及如何使用Arduino 控制SW-18010P 震动传感器。
实验电路:实验电路如下图所示
实验原理:SW-18010P 震动传感器这是一款基于弹簧摆动原理设计的震动传感器,震动势能传到弹簧末端引起共振,左右摆动碰触到金属外壁形成通路。在静止时任何角度都为开路OFF状态,当受到外力碰撞或者大力晃动时,弹簧变形和中心电极接触导通使两个引脚瞬间导通为ON状态,当外力消失时,电路恢复为开路OFF状态。由于导通时间和弹簧的刚性有关,所以该震动传感器的输出带宽很窄,在使用Arduino读取时,建议使用外部中断功能。
实验步骤:
一. 按照以上电路正确搭建实验电路。
二. 将我提供的调试程序下载到Arduino开发板中。
三. 晃动SW-18010P 震动传感器看LED的工作情况。
实验程序:
Arduino外部中断代码:
#define SensorLED 13 #define SensorINPUT 2 unsigned char state = 0; void setup() { pinMode(SensorLED, OUTPUT); pinMode(SensorINPUT, INPUT); attachInterrupt(0, blink, FALLING);//D2口为外部中断0,当有下降沿触发的时候调用blink函数 } void loop() { if(state!=0) { state = 0; digitalWrite(SensorLED,HIGH); delay(500); } else digitalWrite(SensorLED,LOW); } void blink()//数字输入传感器下降沿触发中断服务函数 { state++; }
最后结果可观察数字口13脚上的L指示灯,震动后可以看见L灯亮500ms。
————————————————————————以上内容部分摘自网络————————————————————
现在自己写了一个程序。
是用analogRead来判断的。
将震动模块的数字口插在A0口上。
得到一个0-1023的数字。
在晃动的时候,可以得到28 或者 一个差不多的两位数,不晃动的时候,得到的是1021,1022,1023,说明没有震动。
有震动,便内部导通,向外发送一个电讯号。
代码如下:
int sensorPin = A0; //int ledPin = 7; int sensorValue = 0; void setup() { //pinMode(ledPin,OUTPUT); Serial.begin(9600); } void loop(){ sensorValue = analogRead(sensorPin); delay(100); Serial.println(sensorValue); }
显示效果如下,
有一个缺点就是,数字滚动速度太快。所以得到的都是刷新值。
一般情况下,晃动一下,我们会希望大约有2秒钟的延迟,因为人的反映速度相对电脑来说还是很慢的。所以,我们可以这么做。
把LED等连接到Pin7, 震动感应器,连接到A0口
按照下面的代码尝试
int sensorPin = A0; int ledPin = 7; int sensorValue = 0; void setup() { pinMode(ledPin,OUTPUT); Serial.begin(9600); digitalWrite(ledPin, LOW); } void loop(){ sensorValue = analogRead(sensorPin); if (sensorValue < 100) { digitalWrite(ledPin, HIGH); delay(2000); // delay for 2 sec if sensor's shaked }else{ digitalWrite(ledPin, LOW); } Serial.println(sensorValue); }
这样,每次碰到传感器,它都会亮两秒钟,如果两秒内还在有震动的话,会继续亮。
这样,人就反映过来了。当然,可以适当修改一下时间,比如不是两秒,是1秒也行。总之要人眼能反映过来才好。
效果一般,但是达到既定的预期效果。
几元钱的小传感器,已经不错了。加上模块才几块钱,这个传感器电阻估计不到1元吧。
灵敏度来说,可以用。呵呵~