You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MicroPython ESP32 I2C驱动SRF10传感器测距返回值恒为0

故障原因

你的代码存在3个核心逻辑错误,直接导致传感器无法正常完成测距、返回值异常:

  • 触发测量的寄存器和写入值完全写反
    SRF10触发测距的正确逻辑是:向0x00命令寄存器写入1字节的测量命令(厘米模式对应命令值0x51)。你的代码里把命令值0x51当成了寄存器地址,写入了长度为0的空字节数组,相当于没有正确发送测距启动指令,传感器仅在上电初始化阶段闪灯,后续根本没有进入正常测距流程。
  • 没有预留测量等待时间
    即便正确发送测距指令,SRF10完成一次厘米模式测距最长需要70ms,测量完成前距离寄存器不会写入有效值。你触发指令后立刻读取,此时传感器还在测距过程中,自然读不到有效距离数据。
  • 测距范围配置寄存器地址错误
    SRF10的测距范围配置寄存器地址是0x03(最大测距寄存器,单位mm,写入值255对应最大测距400cm左右),你代码里把寄存器地址直接设为255(0xFF),属于无效寄存器地址,根本没有完成测距范围配置。

你读取到的b'\x05\x80\x00\x00'是传感器未进入测量状态的默认值:第一个字节0x05是SRF10的固件版本号,第二个字节0x80是增益寄存器的默认值,后两位是未写入有效数据的距离寄存器默认0值,和故障现象完全吻合。


修正后的可运行代码
from machine import I2C, Pin
import time

# 测量单位定义
UNIT_CM = 0x51
# SRF10默认I2C地址
SRF_ADDR = 0x70
# 寄存器地址定义
REG_CMD = 0x00
REG_GAIN = 0x02
REG_RANGE = 0x03

# 初始化I2C
i2c = I2C(freq=100000, scl=Pin(18), sda=Pin(19))

# 配置最大测距范围为255(对应最大约4m测距距离)
i2c.writeto_mem(SRF_ADDR, REG_RANGE, bytearray([255]))
# 配置增益为默认值
i2c.writeto_mem(SRF_ADDR, REG_GAIN, bytearray([0x10]))

while True:
    # 发送厘米模式测距命令:向命令寄存器写入0x51
    i2c.writeto_mem(SRF_ADDR, REG_CMD, bytearray([UNIT_CM]))
    # 等待测距完成,最长预留70ms测量时间
    time.sleep_ms(70)
    # 从0x02寄存器开始读2字节,即为高字节在前的16位距离值
    dist_data = i2c.readfrom_mem(SRF_ADDR, 0x02, 2)
    distance = (dist_data[0] << 8) | dist_data[1]
    print(f"当前距离:{distance} cm")
    # 测距间隔建议大于10ms,避免传感器误触发
    time.sleep(0.1)

额外注意事项
  • 接线需确认:SRF10为5V供电器件,VCC必须接5V引脚(接3.3V会出现工作不稳定、测距失败问题),GND必须和ESP32共地,SCL接IO18、SDA接IO19。
  • 如果读出来距离值存在异常跳变,可以适当把测量等待时间拉长到80ms,也可以通过读命令寄存器返回值判断测量状态:测量过程中读0x00寄存器会返回0xFF,返回非0xFF值时即为测量完成。

内容的提问来源于stack exchange,提问作者MM11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 06:33:59