Jsn-sr04t防水超声波传感器在树莓派Zero W1上读数异常求助
JSN-SR04T 树莓派Zero W 持续输出#问题解决
以下是针对问题的具体排查和修复方案:
移除ECHO引脚的上拉电阻配置
代码中GPIO.setup(GPIO_ECHO, GPIO.IN, pull_up_down=GPIO.PUD_UP)的上拉电阻会强制ECHO引脚保持高电平,导致程序无法检测到声波触发后的起始低电平,直接触发超时返回-1。修改为:GPIO.setup(GPIO_ECHO, GPIO.IN)增大超时时间阈值
当前MAX_TIME = 0.004仅对应约0.68米的探测距离(声波往返时间),远小于JSN-SR04T的最大探测范围。调整为:MAX_TIME = 0.03 # 对应约5米的最大探测距离,可根据实际需求调整检查电平兼容性(关键硬件点)
JSN-SR04T多为5V供电模块,其ECHO引脚输出可能为5V电平,而树莓派GPIO仅支持3.3V输入。直接连接可能导致信号读取异常甚至损坏引脚,建议在ECHO引脚和树莓派之间添加分压电路(如1kΩ+2kΩ电阻串联,取中间节点接入树莓派)。优化触发脉冲宽度
部分JSN-SR04T模块对触发脉冲宽度要求更高,将触发时间从10微秒调整为15微秒,确保模块能可靠识别触发信号:TRIGGER_TIME = 0.000015
修改后的完整代码
import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO_TRIGGER = 10 GPIO_ECHO = 8 TRIGGER_TIME = 0.000015 MAX_TIME = 0.03 # 对应约5米最大探测距离 GPIO.setup(GPIO_TRIGGER, GPIO.OUT) GPIO.setup(GPIO_ECHO, GPIO.IN) GPIO.output(GPIO_TRIGGER, False) def measure(): GPIO.output(GPIO_TRIGGER, True) time.sleep(TRIGGER_TIME) GPIO.output(GPIO_TRIGGER, False) start = time.time() timeout = start + MAX_TIME while GPIO.input(GPIO_ECHO) == 0 and start <= timeout: start = time.time() if start > timeout: return -1 stop = time.time() timeout = stop + MAX_TIME while GPIO.input(GPIO_ECHO) == 1 and stop <= timeout: stop = time.time() if stop <= timeout: elapsed = stop - start distance = float(elapsed * 34300) / 2.0 else: return -1 return distance if __name__ == '__main__': try: while True: distance = measure() if distance > -1: print("Measured Distance = %.1f cm" % distance) else: print("#") time.sleep(0.5) except KeyboardInterrupt: print("Measurement stopped by User") GPIO.cleanup()
内容的提问来源于stack exchange,提问作者Guido Vilardo
相关产品推荐
相关产品推荐

