外设模块学习(12)——SW-520D倾斜传感器、SW-420震动传感器、声音传感器(三引脚)(STM32代码参考)
引言
本次,我们继续学习三种传感器,分别是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. 开启时钟 PARCC->APB2ENR |= RCC_APB2ENR_IOPAEN;// 2. DO-PA0 浮空输入 mode-00 cnf-01GPIOA->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. 开启时钟 PARCC->APB2ENR |= RCC_APB2ENR_IOPAEN;// 2. DO-PA0 浮空输入 mode-00 cnf-01GPIOA->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. 开启时钟 PARCC->APB2ENR |= RCC_APB2ENR_IOPAEN;// 2. DO-PA0 浮空输入 mode-00 cnf-01GPIOA->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();}
}
资料参考
- Arduino动手做(14)---倾斜角度传感器模块 - 知乎
- SW 420- 振动传感器模块指南
- CZN-15E Electret Condenser Microphone - CZN-15E
- CZN-15E PDF 数据手册
