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
相关产品推荐
相关产品推荐

