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

Arduino Uno上HC-SR04与NEO-6M GPS协同工作故障排查

嘿,作为Arduino新手把两个库的示例混写遇到问题太正常了!你说HC-SR04和NEO-6M单独都能工作,但放一起超声波就没输出,大概率是代码结构阻塞了超声波的检测或者串口/引脚资源冲突,咱们一步步来改:

核心问题分析

  1. 阻塞式代码冲突:如果直接把两个库的示例硬拼,GPS的读取循环(比如持续等待串口数据)可能会卡住主程序,导致超声波传感器的触发和检测时序被打乱——HC-SR04对时序要求比较严格,一旦被阻塞就无法正常输出。
  2. 串口/引脚重叠:你把GPS接在9、10引脚(软件串口),要确保超声波的Trig/Echo引脚没和这两个引脚重复,同时软件串口的初始化不能影响超声波的引脚功能。

具体修改方案

下面是整合后的可运行代码,我会标注关键修改点:

#include <NewPing.h>
#include <SoftwareSerial.h>
#include <TinyGPS.h>

// 定义超声波引脚(别用9/10,避免和GPS软件串口冲突)
#define TRIG_PIN 2
#define ECHO_PIN 3
#define MAX_DISTANCE 200  // 最大检测距离200厘米

// 初始化超声波对象
NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE);

// 初始化GPS软件串口(RX接9,TX接10,对应你的接线)
SoftwareSerial gpsSerial(9, 10);
TinyGPS gps;

void setup() {
  Serial.begin(9600);       // 电脑串口监视器,用于调试输出
  gpsSerial.begin(9600);    // NEO-6M默认波特率是9600,别改错
}

void loop() {
  // 1. 非阻塞处理GPS数据:只在有串口数据时读取,不卡住主循环
  while (gpsSerial.available() > 0) {
    char gpsChar = gpsSerial.read();
    // 解析到有效GPS数据时才输出
    if (gps.encode(gpsChar)) {
      float lat, lon;
      unsigned long dataAge;
      gps.f_get_position(&lat, &lon, &dataAge);
      
      Serial.print("GPS位置 -> 纬度: ");
      Serial.print(lat, 6);
      Serial.print(" | 经度: ");
      Serial.println(lon, 6);
    }
  }

  // 2. 非阻塞处理超声波检测:用millis()代替delay(),避免阻塞
  static unsigned long lastSonarCheck = 0;
  const unsigned long checkInterval = 500;  // 每500ms检测一次距离
  if (millis() - lastSonarCheck >= checkInterval) {
    lastSonarCheck = millis();
    unsigned int distance = sonar.ping_cm();  // 获取厘米单位的距离
    
    Serial.print("超声波距离 -> ");
    if (distance == 0) {
      Serial.println("超出检测范围");
    } else {
      Serial.print(distance);
      Serial.println(" cm");
    }
  }
}

关键修改说明

  • 非阻塞结构:用millis()代替delay()处理超声波检测,同时GPS读取只在有串口数据时执行,保证两个模块的时序互不干扰。
  • 引脚隔离:超声波用独立的2、3引脚,和GPS的9、10软件串口完全分开,避免引脚功能冲突。
  • 高效数据处理:TinyGPS只在解析到有效GPS帧时输出数据,NewPing用封装好的ping_cm()方法,已经帮你处理了超声波的触发/回声时序。

额外排查步骤

  1. 确认HC-SR04接线:Trig接引脚2、Echo接引脚3、VCC接5V、GND接GND,别接错电源。
  2. 串口监视器波特率设为9600,打开后应该能同时看到GPS和超声波的输出。
  3. 如果GPS数据不输出,检查NEO-6M的TX/RX是否和Arduino的9/10对应(GPS TX接Arduino RX9,GPS RX接Arduino TX10)。

内容的提问来源于stack exchange,提问作者Gurjeet Singh Bali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:47:49