这是"拾颜播放器"项目学习记录的第三部分,关于接近传感器的使用。
项目中用 Littelfuse 59001 干簧管(Reed Sensor)来检测物体靠近。当磁铁靠近时,干簧管内部的触点闭合,输出电平变化。这个传感器用来实现"无接触唤醒"功能——手或卡片靠近时开始工作,离开后停止。
一、硬件介绍1.1 Littelfuse 59001 简介| 类型 | 磁簧开关 (Reed Sensor) |
| 封装 | SMD, 2mm x 6mm |
| 触点类型 | 常开 (NO) |
| 开关电压 | 10W max |
| 开关电流 | 0.5A max |
| 工作温度 | -40°C ~ 125°C |
简单理解:有磁铁靠近时开关闭合,无磁铁时断开。
1.2 连接方式
这个传感器的连接方式比较简单:
59001 传感器 → ESP32-S3 Pin1 → GND Pin2 → GPIO6 (D6,内部上拉)

原理图:
GPIO6 (D6) ── [59001 干簧管] ── GND ↑ 上拉电阻 (内部)
工作原理:
干簧管是简单开关,一端接地,另一端接GPIO
GPIO配置内部上拉电阻
无磁铁时:开关断开,GPIO被上拉拉高 → 高电平
有磁铁时:开关闭合,GPIO接地 → 低电平
磁铁靠近:干簧管触点闭合 → 输出接地 → 低电平
磁铁离开:干簧管触点断开 → 上拉电阻 → 高电平
有磁铁: GPIO6 = 低电平 (0) ← 靠近检测 无磁铁: GPIO6 = 高电平 (1) ← 默认状态二、基础代码2.1 初始化
from digitalio import DigitalInOut, Pull, Direction import board PROXIMITY_PIN = board.D6 sensor = DigitalInOut(PROXIMITY_PIN) sensor.direction = Direction.INPUT sensor.pull = Pull.UP # 上拉电阻
注意:Pull.UP 是关键,启用内部上拉电阻。
2.2 读取状态def get_state():
"""获取传感器状态"""
return sensor.value
# 使用
if sensor.value:
print("无磁铁") # 高电平else:
print("检测到磁铁!") # 低电平2.3 完整测试类class ProximityTest:
def __init__(self):
self.sensor = None
self.enabled = False
def setup(self):
"""初始化"""
try:
self.sensor = DigitalInOut(board.D6)
self.sensor.direction = Direction.INPUT
self.sensor.pull = Pull.UP
self.enabled = True
print("✓ 初始化成功")
return True
except Exception as e:
print(f"✗ 失败: {e}")
return False
def get_state(self):
"""获取原始状态"""
if self.sensor is None:
return None
return self.sensor.value # True=高电平, False=低电平
def is_near(self):
"""是否检测到物体"""
return not self.get_state() # 低电平=靠近三、防抖功能3.1 为什么需要防抖干簧管是机械开关,磁铁靠近/离开时触点会抖动:
磁铁靠近: 高 → 低 → 高 → 低 → 低 → 低 ↑ 抖动 如果不做防抖,可能触发多次
典型抖动持续 1-5ms,需要软件过滤。
3.2 防抖原理软件防抖:连续采样多次,只有状态稳定后才确认。
class ProximityTest: def __init__(self): self.debounce_threshold = 5 # 连续稳定5次 self.debounce_delay = 0.01 # 每次间隔10ms def get_state_with_debounce(self): """带防抖的读取""" stable_count = 0 last_state = self.sensor.value while stable_count < self.debounce_threshold: current_state = self.sensor.value if current_state == last_state: stable_count += 1 else: stable_count = 0 # 状态变化,重新计数 last_state = current_state time.sleep(self.debounce_delay) return last_state def is_near_with_debounce(self): """带防抖的靠近检测""" return not self.get_state_with_debounce()3.3 防抖流程图
状态变化 → 开始计数 ↓ 连续稳定? ─否→ 计数归零,重新开始 ↓是 确认状态改变3.4 防抖参数选择
| 快速响应 | 3 | 0.005 | ~15ms |
| 标准 | 5 | 0.01 | ~50ms |
| 高稳定性 | 10 | 0.02 | ~200ms |
一般用 threshold=5, delay=0.01 即可。
3.5 状态变化时的防抖检测状态变化时也要防抖:
def test_near_detection_with_debounce(self):
"""接近检测(防抖版)"""
was_near = None
debounce_count = 0
while True:
is_near = not self.get_state() # 低电平=靠近
if was_near != is_near: # 状态变化
debounce_count += 1
if debounce_count >= self.debounce_threshold:
if is_near:
print("
我要赚赏金
