树莓派3测试Distance Censor报错及代码NameError问题求助
树莓派3距离传感器调试及NameError问题解决方案
嘿,我来帮你搞定这两个问题!先从那个烦人的NameError说起,再给你传感器调试的实用建议~
一、解决NameError: name 'start' is not defined错误
这个错误本质很简单:你代码里用到了名为start的变量或函数,但它还没被定义就直接调用了。常见原因包括拼写错误、作用域搞错,或是漏写了start的定义逻辑。
给你一份优化后的HC-SR04(树莓派常用超声波距离传感器)示例代码,结构清晰且完全避免这类错误:
import RPi.GPIO as GPIO import time # 定义GPIO引脚(这里用BCM编号模式,可根据自己接线调整) TRIG_PIN = 23 ECHO_PIN = 24 def init_sensor(): """初始化传感器GPIO配置""" GPIO.setmode(GPIO.BCM) GPIO.setup(TRIG_PIN, GPIO.OUT) GPIO.setup(ECHO_PIN, GPIO.IN) GPIO.output(TRIG_PIN, GPIO.LOW) print("传感器初始化完成,等待1秒稳定...") time.sleep(1) def measure_distance(): """测量距离并返回厘米值""" # 发送触发信号 GPIO.output(TRIG_PIN, GPIO.HIGH) time.sleep(0.00001) GPIO.output(TRIG_PIN, GPIO.LOW) # 记录ECHO引脚的电平变化时间 start_time = time.time() stop_time = time.time() # 等待ECHO变为高电平 while GPIO.input(ECHO_PIN) == 0: start_time = time.time() # 等待ECHO变为低电平 while GPIO.input(ECHO_PIN) == 1: stop_time = time.time() # 计算距离(声速取34300cm/s,除以2是因为声波往返) time_elapsed = stop_time - start_time distance = (time_elapsed * 34300) / 2 return round(distance, 2) def main(): try: init_sensor() while True: dist = measure_distance() print(f"当前测量距离: {dist} cm") time.sleep(1) except KeyboardInterrupt: print("\n程序已终止") finally: GPIO.cleanup() # 退出前清理GPIO资源 if __name__ == "__main__": main()
你可以对照这份代码检查自己的问题:如果之前的start是指测量的起始时间,这里用start_time明确定义了;如果是想写初始化函数,参考init_sensor()的封装方式即可。
二、树莓派3距离传感器测试排错建议
如果传感器本身工作异常,按以下步骤排查:
- 硬件接线检查:
- 确认传感器VCC接树莓派5V引脚(别接3.3V,大部分超声波传感器需要5V供电),GND接树莓派GND
- TRIG和ECHO引脚要和代码里的定义对应,别接反或接错
- 检查接线有没有松动,传感器探头是否被遮挡、有没有物理损坏
- 软件环境检查:
- 确保已安装RPi.GPIO库:
sudo pip install RPi.GPIO - 运行代码时要加
sudo,访问GPIO需要管理员权限:sudo python3 your_script.py - 通过
raspi-config的Interfacing Options->GPIO确认GPIO功能已启用
- 确保已安装RPi.GPIO库:
- 场景优化:
- 传感器有效测距范围一般是2cm-400cm,太近或太远都会返回错误值
- 避免在多传感器环境下测试,防止超声波互相干扰
- 周围有大量反射物(比如墙面、玻璃)时,会影响测量精度,尽量在开阔环境测试
内容的提问来源于stack exchange,提问作者Rodo Anh
相关产品推荐
相关产品推荐

