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

Arduino中继电器NC闭合时HC-SR04超声波传感器失效问题求助

问题:HC-SR04在继电器闭合时停止工作(无直接物理连接)

通常HC-SR04超声波传感器可正常工作,但当闭合继电器后,传感器便停止运行。该继电器用于其他任务,与超声波传感器无直接连接。补充说明:超声波传感器恰好在继电器闭合时停止工作,但二者无物理连接。

相关代码如下:

/*
 * created by Rui Santos
 *
 * Complete Guide for Ultrasonic Sensor HC-SR04
 * Ultrasonic sensor Pins: VCC: +5VDC
 Trig : Trigger (INPUT) - Pin11
 Echo: Echo (OUTPUT) - Pin 12
 GND: GND
 */
#define relay1 10
int trigPin = 11; //Trig - green Jumper
int echoPin = 12; //Echo - yellow Jumper
long duration, cm;
String cmd;

void setup() {
  //Serial Port begin
  Serial.begin (9600);
  Serial.println("Initializing Relay...");
  pinMode(relay1, OUTPUT);
  Serial.println("Initializing Ultrasonic sensor...");
  //Define inputs and outputs
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop() {
  if (Serial.available() > 0) {
    // read the incoming byte:
    cmd = Serial.readString();
    if (cmd == "relayOn"){
      //relay normally closed - ultrasonic sensor stop working here
      digitalWrite(relay1, LOW);
    }else if (cmd == "relayOff"){
      //relay normally open
      digitalWrite(relay1, HIGH);
    }
  }
  // The sensor is triggered by a HIGH pulse of 10 or more microseconds.
  // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  // Read the signal from the sensor: a HIGH pulse whose
  // duration is the time (in microseconds) from the sending
  // of the ping to the reception of its echo off of an object.
  duration = pulseIn(echoPin, HIGH);
  // convert the time into a distance
  cm = (duration/2) / 29.1;
  Serial.print(cm);
  Serial.print("cm");
  Serial.println();
  delay(250);
}

问题分析与解决方案

从你的情况来看,代码本身没有逻辑错误(继电器控制不会阻断传感器检测流程),故障出在硬件层面,最常见的两个原因是电源压降和电磁干扰,下面逐一说明:

1. 电源压降问题(最可能)

继电器线圈吸合时需要较大的工作电流,如果你的继电器和HC-SR04共用同一个5V电源(比如都接在Arduino的5V引脚上),会出现以下情况:

  • Arduino的5V引脚输出电流有限(通常最大约500mA),继电器吸合瞬间的大电流会拉低整个系统的供电电压,而HC-SR04需要稳定的5V才能正常触发和接收回波,电压低于4.5V左右时传感器就会停止工作。

解决方法:

  • 给继电器单独供电:使用外部5V电源模块给继电器供电,继电器的控制引脚(IN)仍接Arduino的引脚10,但必须将Arduino的GND和外部电源的GND相连(共地),否则控制信号无效。
  • 在继电器模块的VCC和GND引脚之间并联一个100µF的电解电容,缓冲吸合瞬间的电流波动,减少电压跌落。
  • 条件允许的话,HC-SR04也改用外部5V电源供电,彻底避免电源竞争。

2. 电磁干扰(EMI)问题

继电器是电磁式开关,吸合和释放瞬间会产生电磁脉冲,这种干扰可能会影响HC-SR04的信号:

  • HC-SR04的Echo引脚是模拟输入,对高频干扰非常敏感,继电器的电磁脉冲可能会干扰pulseIn函数读取回波信号,导致传感器返回异常值或完全无输出。

解决方法:

  • 给继电器线圈并联续流二极管:选用1N4007这类通用二极管,负极接继电器线圈的正极,正极接线圈负极,这样可以吸收线圈断电时的反向电动势,大幅降低电磁干扰。
  • 优化布线:将HC-SR04的Trig/Echo信号线与继电器的电源线、控制线分开布置,避免线路交叉,减少干扰耦合。
  • 在HC-SR04的VCC和GND之间并联一个0.1µF的陶瓷电容,过滤电源上的高频干扰信号。

3. 代码验证小技巧

为了确认故障类型,可以在代码中添加状态输出:

if (cmd == "relayOn"){
  digitalWrite(relay1, LOW);
  Serial.println("[Status] Relay ON - Sensor may be affected"); // 添加此行
}else if (cmd == "relayOff"){
  digitalWrite(relay1, HIGH);
  Serial.println("[Status] Relay OFF - Sensor normal"); // 添加此行
}

观察串口输出:

  • 如果继电器ON时,传感器的距离数据完全消失,大概率是电源压降导致传感器断电;
  • 如果出现固定值(比如0cm或超大值),则更可能是电磁干扰导致信号异常。

内容的提问来源于stack exchange,提问作者Martin Ocando Corleone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:07:59