这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【Let'sdo2025第三期活动】【拾色播放器DIY】接近传感器学习笔记

共1条 1/1 1 跳转至

【Let'sdo2025第三期活动】【拾色播放器DIY】接近传感器学习笔记

菜鸟
2025-12-28 10:04:46     打赏
前言

这是"拾颜播放器"项目学习记录的第三部分,关于接近传感器的使用。

项目中用 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 连接方式

51ffb25ebbc7cee1c1802c90450b6330.jpg

这个传感器的连接方式比较简单:

59001 传感器 → ESP32-S3
  Pin1 → GND
  Pin2 → GPIO6 (D6,内部上拉)

image.png


原理图:

GPIO6 (D6) ── [59001 干簧管] ── GND
              ↑
        上拉电阻 (内部)

工作原理

  • 干簧管是简单开关,一端接地,另一端接GPIO

  • GPIO配置内部上拉电阻

  • 无磁铁时:开关断开,GPIO被上拉拉高 → 高电平

  • 有磁铁时:开关闭合,GPIO接地 → 低电平

1.3 原理
  • 磁铁靠近:干簧管触点闭合 → 输出接地 → 低电平

  • 磁铁离开:干簧管触点断开 → 上拉电阻 → 高电平

有磁铁: 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 防抖参数选择场景thresholddelay响应时间
快速响应30.005~15ms
标准50.01~50ms
高稳定性100.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("										



关键词: 三期     活动     拾色     播放器     接近     传感器    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]