代码改变世界

深入解析:外设模块学习(12)——SW-520D倾斜传感器、SW-420震动传感器、声音传感器(三引脚)(STM32代码参考)

2025-11-29 10:26  tlnshuju  阅读(0)  评论(0)    收藏  举报

引言

       本次,我们继续学习三种传感器,分别是SW-520D倾斜传感器、SW-420震动传感器以及声音传感器,这三种传感器也是和前面几个传感器类似,都是用了比较器电路加上核心传感器构成。不过本次介绍的控制比前面简单,因为这只有三根线,少了输出模拟量的AO口。当然,由于厂商提供资料感觉太少,所以到处找了一下资料整理后才得出本篇内容。

       由于这几个传感器控制方式极其类似,因此这里核心介绍各个模块中核心传感器的相关内容,最后附上自己编写的STM32代码供大家参考。


一、SW-520D 倾斜传感器介绍

1.1 是什么

       对于该模块来说,核心在于SW-520D这个传感器,这是一款双珠型钢珠开关传感器,是一种基于机械结构实现倾斜检测的元件,如下图所示。

      它通过内部钢珠的位置变化控制电路通断,核心功能是感知设备或环境的倾斜角度变化,当倾斜角度达到设定阈值时,会触发电路状态切换,进而输出相应的通断信号,适用于需要监测角度变化的场景。

1.2 有何作用

       该传感器模块的主要作用是实时检测目标物体的倾斜状态,当物体倾斜角度超过特定范围时,传感器输出信号发生改变,可作为触发信号驱动后续设备动作。当然了,个人感觉该模块功能比较简单,且倾斜方向有些限制,更适合学习使用哈。

1.2 相关参数

参数类别

具体参数

供电电压

3.3~5V

工作电流

10mA

工作温度范围

-20℃~80℃

1.3 工作原理

       SW-520D 内部包含两颗钢珠与对应的电极触点,其有脚端为 ON 导通触发端,无脚端为 OFF 开路端。

       当传感器受到外力影响发生倾斜,且有脚端角度低于水平适当角度时,内部钢珠会因重力滚动并接触电极,使电路短时或持续导通(输出 ON 信号);当传感器恢复静止状态,且无脚端角度低于水平线时,钢珠复位脱离电极,电路恢复开路(输出 OFF 信号),以此实现对倾斜状态的检测与信号输出。

1.4 模块驱动方法

1.4.1 引脚定义及功能

引脚标识功能描述
VCC电源正极,输入电压范围 3.3-5V
GND电源负极,接地端
DO开关信号输出端,输出数字电平信号,反映倾斜状态

1.4.2 模块使用方法

       单片机接收模块通过DO发出的电平信号,倾斜一定程度时DO输出低电平,点亮模块上的LED,反之输出高电平,模块上的LED熄灭。

1.5 参考代码(STM32)

1.5.1 tilt.h

/*
 * @Descripttion: 倾斜传感器驱动文件(.h)
 * @Author: JaRyon
 * @version:
 * @Date: 2025-10-29 13:05:16
 */
#ifndef __TILE_H
#define __TILE_H
#include "stm32f10x.h"
/**
 * 引脚接线
 *
 * VCC  --->  3.3/5V
 * GND  --->  GND
 * DO   --->  PA0
 *
*/
void Tilt_Init(void);
uint8_t Tilt_Detect(void);
#endif
/*** (C) COPYRIGHT 2025 END OF FILE ***/

1.5.2 tilt.c

/*
 * @Descripttion: 倾斜传感器驱动文件(.c)
 * @Author: JaRyon
 * @version:
 * @Date: 2025-10-29 13:05:16
 */
#include "tilt.h"
/**
 * @brief      倾斜传感器初始化
 * @param      void 无
 * @return     void
 * @example    Tilt_Init();
 * @attention
 */
void Tilt_Init(void)
{
    // 1. 开启时钟 PA
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
    // 2. DO-PA0 浮空输入 mode-00 cnf-01
    GPIOA->CRL &= ~GPIO_CRL_MODE0;
    GPIOA->CRL |= GPIO_CRL_CNF0_0;
    GPIOA->CRL &= ~GPIO_CRL_CNF0_1;
}
/**
 * @brief      检测倾斜,获取状态
 * @param      void 无
 * @return     uint8_t
 * @example    uint8_t TiltState = Tilt_Detect();
 * @attention
 */
uint8_t Tilt_Detect(void)
{
    uint8_t TiltState = 0;
    if (GPIOA->IDR & GPIO_IDR_IDR0)
    {
        TiltState = 1;
    }
    return TiltState;
}

1.5.3 main.c

       逻辑很简单,10ms查询一次,倾斜点亮LED,反之熄灭

/*
 * @Descripttion: 倾斜传感器测试
 * @Author: JaRyon
 * @version: v1.0
 * @Date: 2025-10-28 12:19:43
 */
#include "stm32f10x.h"
#include "Systick.h"
#include "oled.h"
#include "tilt.h"
#include "LED.h"
int main(void)
{
	uint32_t waitTimes = 0;
	char *str = "Normal";
	// 初始化
	Systick_Init();
	LED_Init();
	OLED_Init();
	OLED_ClearAll();
	Tilt_Init();
	waitTimes = Systick_GetTick();
	while(1)
	{
		if (Systick_GetTick() - waitTimes >= 10000)
		{
			if (Tilt_Detect() == 0)
			{
				str = "Dump!!";
				LED_On(LED1);
			}
			else
			{
				str = "Normal";
				LED_Off(LED1);
			}
			waitTimes = Systick_GetTick();
		}
		OLED_ShowString(39, 27, str, 8);
		OLED_Update();
	}
}

二、SW-420 震动传感器介绍

2.1 是什么

       SW-420 震动传感器是一款常闭型机械式震动检测模块,核心元件为内部的金属导电球与电极结构,主要功能是检测环境或设备的振动、冲击,当振动强度达到触发阈值时,模块内部电路通断状态改变,输出相应的数字信号,可作为振动触发信号源,适配多种需要振动检测的场景。

2.2 有何作用

       核心作用是实时监测振动或冲击信号,当检测到目标物体发生振动时,输出状态变化的信号,进而驱动后续设备实现报警、控制等功能。当然了,个人感觉该传感器还是比较简单,更适合学习使用哈。

2.3 有何特点

       信号稳定性:采用 LM393 宽电压比较器,输出信号干净、波形好,有效滤除杂波干扰,减少误触发。

       感应特性:具备全向感应能力,可检测任意方向的振动,无检测角度限制,适配多维振动检测场景。

2.4 相关参数

参数类别

具体参数

型号

SW-420

传感器类型

常闭型震动传感器模块(机械式)

输出类型

数字开关量输出(0 和 1)

工作电压

3.3V-5V

输出电平逻辑

无震动时输出低电平(绿色指示灯亮);震动时输出高电平(绿色指示灯不亮)

驱动能力

超过 15mA

感应方向

全向

响应特性

快速响应振动变化;自动复位(振动停止后)

电流消耗

最大 0.5mA

核心元器件

LM393 宽电压比较器、金属导电球

2.5 工作原理

       SW-420 基于机械结构与电路结合实现震动检测,无振动时,模块内部的金属导电球在重力作用下与电极保持接触,震动开关呈闭合导通状态,电路形成回路,模块输出低电平,绿色指示灯亮;当受到振动或冲击时,金属导电球因惯性脱离电极,震动开关瞬间断开,电路断路,模块输出高电平,绿色指示灯熄灭;振动停止后,金属导电球在重力作用下复位,重新接触电极,开关闭合,模块恢复低电平输出,以此实现对振动状态的检测与信号转换。

2.6 模块驱动方法

2.6.1 引脚定义及功能

引脚标识功能描述
VCC接入 3.3V~5V ,适配主流单片机供电
DO信号输出端,震动时输出高电平,无震动时输出低电平,同步反馈传感器状态
GND电源负极,与单片机、电源负极共地

2.6.2 模块使用方法

  单片机接收模块通过DO发出的电平信号,出现震动时DO输出高电平,熄灭模块上的LED,反之输出低电平,模块上的LED点亮。注意:这种状态只会在出现震动瞬间发生,若震动不持续则会很快恢复无震动状态。

2.7 参考代码(STM32)

2.7.1 vibration.h

/*
 * @Descripttion: 震动传感器驱动文件(.h)
 * @Author: JaRyon
 * @version:
 * @Date: 2025-10-29 13:05:16
 */
#ifndef __VIBRATION_H
#define __VIBRATION_H
#include "stm32f10x.h"
/**
 * 引脚接线
 *
 * VCC  --->  3.3/5V
 * GND  --->  GND
 * DO   --->  PA0
 *
*/
void Vibration_Init(void);
uint8_t Vibration_Detect(void);
#endif
/*** (C) COPYRIGHT 2025 END OF FILE ***/

2.7.2 vibration.c

/*
 * @Descripttion: 震动传感器驱动文件(.c)
 * @Author: JaRyon
 * @version:
 * @Date: 2025-10-29 13:05:16
 */
#include "vibration.h"
/**
 * @brief      震动传感器初始化
 * @param      void 无
 * @return     void
 * @example    Vibration_Init();
 * @attention
 */
void Vibration_Init(void)
{
    // 1. 开启时钟 PA
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
    // 2. DO-PA0 浮空输入 mode-00 cnf-01
    GPIOA->CRL &= ~GPIO_CRL_MODE0;
    GPIOA->CRL |= GPIO_CRL_CNF0_0;
    GPIOA->CRL &= ~GPIO_CRL_CNF0_1;
}
/**
 * @brief      检测震动,获取状态 震动-1 正常-0
 * @param      void 无
 * @return     uint8_t
 * @example    uint8_t VibState = Vibration_Detect();
 * @attention
 */
uint8_t Vibration_Detect(void)
{
    uint8_t VibState = 0;
    if (GPIOA->IDR & GPIO_IDR_IDR0)
    {
        VibState = 1;
    }
    return VibState;
}

2.7.3 main.c

       逻辑很简单,10ms查询一次,震动超过阈值点亮LED,反之熄灭

/*
 * @Descripttion: 震动传感器测试
 * @Author: JaRyon
 * @version:
 * @Date: 2025-10-28 12:19:43
 */
#include "stm32f10x.h"
#include "Systick.h"
#include "oled.h"
#include "vibration.h"
#include "LED.h"
int main(void)
{
	uint32_t waitTimes = 0;
	char *str = "Normal";
	// 初始化
	Systick_Init();
	LED_Init();
	OLED_Init();
	OLED_ClearAll();
	Vibration_Init();
	waitTimes = Systick_GetTick();
	while(1)
	{
		if (Systick_GetTick() - waitTimes >= 10000)
		{
			if (Vibration_Detect() == 1)
			{
				str = "vibrate";
				LED_On(LED1);
			}
			else
			{
				str = "Normal";
				LED_Off(LED1);
			}
			waitTimes = Systick_GetTick();
		}
		OLED_ShowString(39, 27, str, 8);
		OLED_Update();
	}
}

三、CZN-15E 声音传感器介绍

3.1 是什么

       CZN-15E 声音传感器是一款全向性驻极体电容麦克风传感器模块,核心元件为驻极体电容麦克风与 LM393 比较器(或类似信号处理芯片),主要功能是将环境中的声音信号(声波)转换为电信号,经内部放大、滤波、比较等电路处理后,输出数字或模拟信号,用于感知声音的有无或声音强度变化,适配多种声音检测与触发场景。

3.2 有何作用

       核心作用是实现声音信号的采集与转换,通过输出信号反映环境中声音的存在或强度,进而驱动后续设备实现报警、控制、监测等功能。例如,在教育实验中,用于声音信号采集与电信号转换的教学演示。

3.3 有何特点

       全向性感应:采用全向性驻极体电容麦克风,可接收来自各个方向的声音信号,无明显方向限制,适配多方位声音检测场景。

       灵敏度可调:模块通常设有灵敏度调节电位器,可根据环境噪音情况调整检测阈值,减少安静环境误触发或嘈杂环境漏检测的问题。

       信号处理集成:内部集成放大电路、滤波电路与比较器,无需外部额外搭建复杂信号处理电路,直接输出稳定的数字或模拟信号,简化使用流程。

       电压适配:工作电压范围为 1.5V-10V,标准工作电压为 4.5V,兼容多种电源与控制平台(如单片机、嵌入式系统)的供电需求。

       性能稳定:信噪比大于 60dB,信号纯净度高,减少噪音干扰;3V 电压下灵敏度衰减在 - 3dB 以内,低电压环境下仍能保持较好性能;电流消耗最大 0.5mA,功耗低,适配电池供电设备。

3.4 相关参数

参数类别

具体参数

型号

CZN-15E

传感器类型

全向性驻极体电容麦克风传感器

灵敏度

-46±3dB、-42±3dB、-38±3dB、-34±3dB(0dB=1V/pa,1KHz)

频率范围

20-16000Hz

工作电压范围

1.5V-10V

标准工作电压

4.5V

电流消耗

最大 0.5mA

灵敏度衰减

3V 时衰减在 - 3dB 以内

信噪比(S/N ratio)

大于 60dB

输出类型

数字开关量输出(高 / 低电平)或模拟输出(与声音强度成正比的电压信号,部分模块支持)

3.5 工作原理

       CZN-15E 声音传感器的工作原理分为信号转换与信号处理两部分:首先,模块内部的驻极体电容麦克风将环境中的声音机械振动(声波)转换为微弱的模拟电信号;该微弱电信号随后进入内部放大电路,被放大至可处理的幅度;接着,放大后的信号经滤波电路滤除高频或低频噪音(如环境中的电磁干扰、低频杂音),保留有效声音信号;

       若为数字输出模式,滤波后的信号进入 LM393 比较器,与预设阈值(通过电位器调节)对比,当信号强度高于阈值时,输出高电平,低于阈值时输出低电平;若为模拟输出模式,滤波后的模拟信号直接输出,信号电压随声音强度增大而升高,以此实现声音信号到电信号的转换与输出。

3.6 模块驱动方法

3.6.1 引脚定义及功能

引脚标识功能描述
VCC供电引脚,接入 3.3V~5V 
DO信号输出端,声音振动达到设定阈值输出低电平,反之高电平
GND电源负极,与单片机、电源负极共地

3.6.2 模块使用方法

       单片机接收模块通过DO发出的电平信号,外界环境声音振动超过设定阈值时DO输出低电平,点亮模块上的LED,反之输出高电平,模块上的LED熄灭。

3.7 参考代码(STM32)

3.7.1 voice.h

/*
 * @Descripttion: 声音传感器驱动文件(.h)
 * @Author: JaRyon
 * @version:
 * @Date: 2025-10-29 13:05:16
 */
#ifndef __VOICE_H
#define __VOICE_H
#include "stm32f10x.h"
/**
 * 引脚接线
 *
 * VCC  --->  3.3/5V
 * GND  --->  GND
 * DO   --->  PA0
 *
*/
void Voice_Init(void);
uint8_t Voice_Detect(void);
#endif
/*** (C) COPYRIGHT 2025 END OF FILE ***/

3.7.2 voice.c

/*
 * @Descripttion: 声音传感器驱动文件(.c)
 * @Author: JaRyon
 * @version:
 * @Date: 2025-10-29 13:05:16
 */
#include "voice.h"
/**
 * @brief      声音传感器初始化
 * @param      void 无
 * @return     void
 * @example    Voice_Init();
 * @attention
 */
void Voice_Init(void)
{
    // 1. 开启时钟 PA
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
    // 2. DO-PA0 浮空输入 mode-00 cnf-01
    GPIOA->CRL &= ~GPIO_CRL_MODE0;
    GPIOA->CRL |= GPIO_CRL_CNF0_0;
    GPIOA->CRL &= ~GPIO_CRL_CNF0_1;
}
/**
 * @brief      检测声音,获取状态 声音足够大-1 正常-0
 * @param      void 无
 * @return     uint8_t
 * @example    uint8_t VibState = Voice_Detect();
 * @attention
 */
uint8_t Voice_Detect(void)
{
    uint8_t voiceState = 0;
    if ((GPIOA->IDR & GPIO_IDR_IDR0) == 0)
    {
        voiceState = 1;
    }
    return voiceState;
}

3.7.3 main.c

/*
 * @Descripttion: 声音传感器测试
 * @Author: JaRyon
 * @version:
 * @Date: 2025-10-28 12:19:43
 */
#include "stm32f10x.h"
#include "Systick.h"
#include "oled.h"
#include "voice.h"
#include "LED.h"
int main(void)
{
	uint32_t waitTimes = 0;
	char *str = "Normal";
	// 初始化
	Systick_Init();
	LED_Init();
	OLED_Init();
	OLED_ClearAll();
	Voice_Init();
	waitTimes = Systick_GetTick();
	while(1)
	{
		if (Systick_GetTick() - waitTimes >= 10000)
		{
			if (Voice_Detect()) // 高声-1
			{
				str = "Noise!";
				LED_On(LED1);
			}
			else
			{
				str = "Normal";
				LED_Off(LED1);
			}
			waitTimes = Systick_GetTick();
		}
		OLED_ShowString(39, 27, str, 8);
		OLED_Update();
	}
}

资料参考

  1. Arduino动手做(14)---倾斜角度传感器模块 - 知乎
  2. SW 420- 振动传感器模块指南
  3. CZN-15E Electret Condenser Microphone - CZN-15E
  4. CZN-15E PDF 数据手册