SW-420震动传感器(开关量传感器)
传感器参数
- 1 采用LM393比较器输出,信号干净,波形好,驱动能力强
- 工作电压3.3V~5V
- 输出形式: 输出数字量开关0和1
- 尺寸 3.2cmx1.4cm
- 产品用途:各种震动触发作用,比如防盗报警等
- 产品不震动时开关闭合输出低电平,震动时输出高电平;
结构及接线图
- 1、产品不震动时,震动开关呈闭合导通状态,开关信号输出端输出低电
平,绿色指示灯亮; - 2、产品震动时,震动开关瞬间断开,输出端输出高电平
绿色指示灯不亮; - 输出端可以与单片机直接相连,通过单片机来检测高低电平
由此来检测环境是否有震动,起到报警作用
也就是一共三个引脚 一个VCC供电 一个GND接地 一个信号引脚输出0和1
传感器原理
原理:没有震动时,震动轴静止,导针A和导针B处于导通状态,平时任何角度开关都是接通状态,受到振动或移动时,震动轴会产生移动或振动,从而导致导针A和B会出现断开。
这种开关的特点是平时一般处于导通状态耐振动时会短暂断开,所以它的灵敏度很高,同时没有震动时电路导通,所以他是常闭式震动传感器。
注意这里是传感器的原理,不是模块的原理,下面是SW-420振动传感器模块的原理
电路原理图
这里采用的是一个LM393电压比较器,
LM393在(没有负反馈的时候)当正输入端电压大于负输入端的时候,输出高电平,即VCC,当负输入端的电压大于正输入端的电压的时候输出为低电平,即0V,所以LM393输出为0或1的数字信号
因为传感器是常闭的,所以在没有震动时LM393反相输入端电压大于正输入端,此时输出为低电平,当有震动时,传感器断开,正向输入端电压大于反相输入端,此时输出为高电平
测试例程:
C51例程:
#include<reg52.h> //库文件
#define uchar unsigned char//宏定义无符号字符型
#define uint unsigned int //宏定义无符号整型
sbit LED=P1^0; //定义单片机P1口的第1位 (即P1.0)为指示端
sbit DOUT=P2^0; //定义单片机P2口的第1位 (即P2.0)为传感器的输入端
void delay()//延时程序
{
uchar m,n,s;
for(m=20;m>0;m--)
for(n=20;n>0;n--)
for(s=248;s>0;s--);
}
void main()
{
while(1)
{
LED=1; //点亮LED灯
if(DOUT==1)//判断是否是高电平振动
{
delay();//延时抗干扰
if(DOUT==1)//再次判断是否是高电平振动
{
LED=0; //关闭LED灯
}
}
}
}
Arduino例程:
int ledPin = 12; // 定义LED为 pin 12
int switch0 = 2; // 定义传感器 为 Pin2
void setup()
{
pinMode(ledPin, OUTPUT); // 设置数字端口12为输出模式
pinMode(switch0, INPUT); // 设置数字端口2为输入模式
}
void loop()
{
if(digitalRead(switch0)==HIGH)
{
digitalWrite(ledPin, HIGH); // 数字端口置高,LED亮
}
else
{
digitalWrite(ledPin, LOW); // 数字端口置低,LED灭
}
}
STM32_Hal库例程
/**
* 函数功能: SW420震动模块传感器IO引脚初始化.
* 输入参数: 无
* 返 回 值: 无
* 说 明:引脚进行初始化
*
*/
void SW420_GPIO_Init(void)
{
/* 定义IO硬件初始化结构体变量 */
GPIO_InitTypeDef GPIO_InitStruct;
/* 使能(开启)SW420引脚对应IO端口时钟 */
SW420_RCC_CLK_ENABLE();
/* 设定SW420对应引脚IO编号 */
GPIO_InitStruct.Pin = SW420_GPIO_PIN;
/* 设定SW420对应引脚IO操作速度*/
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
/* 设定SW420对应引脚IO为浮空输入模式 */
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
/* 初始化SW420对应引脚IO */
HAL_GPIO_Init(SW420_GPIO, &GPIO_InitStruct);
}
/**
* 函数功能: 简单粗暴的延时函数
* 输入参数: time;延时时间设置
* 返 回 值: 无
* 说 明:软件消抖
*/
static void SW420_ScanDelay(void)
{
uint32_t i,j;
for(i=0;i<100;++i)
for(j=0;j<1000;++j){ }
}
/**
* 函数功能: 读取引脚的状态
* 输入参数:无
* 返 回 值: SW420_HIGH:有震动;
* SW420_LOW:无震动
* 说 明:无。
*/
SW420_State_TypeDef SW420_StateRead(void)
{
/* 读取模块输出信号,若此时输出的是高电平 ,则进入下一步判断*/
if(HAL_GPIO_ReadPin(SW420_GPIO,SW420_GPIO_PIN)==SW420_ACTIVE_LEVEL)
{
/* 延时一小段时间,消除抖动 */
SW420_ScanDelay();
/* 延时时间后再来判断引脚状态,如果还是高电平那么确实就是高电平 */
if(HAL_GPIO_ReadPin(SW420_GPIO,SW420_GPIO_PIN)==SW420_ACTIVE_LEVEL)
{
/* 扫描完毕,确定有震动,返回震动状态(高电平) */
return SW420_HIGH;
}
}
/* 无震动,返回无震动状态 */
return SW420_LOW;
}
测试结果: 静止时输出数字0(低电平).来回晃动则来回输出数字0和1.
静止时LED常亮,发生振动时LED闪烁
51单片机测试视频:
SW-420震动传感器测试