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单片机测试视频:

https://blog.csdn.net/as480133937/article/details/112440776

SW-420震动传感器测试