5

我正在Arduino UNO中做一个基本项目,连接一个超声波传感器(HC-SR04),它应该在串行监视器中打印最近物体的距离,但它总是打印0。

这是我的代码:

long distance;
long time;

void setup(){
  Serial.begin(9600);
  pinMode(4, OUTPUT); 
  pinMode(2, INPUT); 
}

void loop(){
  digitalWrite(2,LOW);
  delayMicroseconds(5);
  digitalWrite(2, HIGH);
  delayMicroseconds(10);

  time = pulseIn(4, HIGH);
  distance = int(0.017*time); 

  Serial.print("Distance: ");
  Serial.print(distance);
  Serial.println(" cm.");
  delay(1000);
}

这是面包板:

在此处输入图像描述

4

2 回答 2

2

我看到的主要问题是您的代码与您的接线图不匹配。

例如,您的图表显示Trig连接到引脚4。Trig应该是 Arduino 的输出,但您已将其定义为输入。

Echo连接到引脚 2 ,它应该是输入,但您将其定义为输出。

最后,在您的 中loop(),您甚至没有使用引脚 2 或引脚 4,而是使用引脚 9 和 8。另一个问题是您在设置触发脉冲时使用的时序 - 它与数据表不匹配。我会做这样的事情(假设您实际上连接到图表中显示的引脚):

#define sensorTrigPin    4
#define sensorEchoPin    2

void setup()
{
    Serial.begin(9600);
    pinMode(sensorTrigPin, OUTPUT);
    pinMode(sensorEchoPin, INPUT);
}

void loop()
{
    int pulseWidth = 0;

    digitalWrite(sensorTrigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(sensorTrigPin, LOW);

    pulseWidth = pulseIn(sensorEchoPin, HIGH);

    Serial.print("Pulse Width: ");
    Serial.print(pulseWidth);
    delay(1000);
}

请注意,这pulseWidth只是从Echo脉冲开始变高到同一脉冲结束(当它变低时)所需的时间量。您仍然需要根据 的值计算距离pulseWidth


根据最近对问题的编辑进行更新

如果您将部分loop()代码更改为此,它应该可以工作:

void loop(){
    digitalWrite(4, HIGH);   //was (2, LOW)
    delayMicroseconds(10);   //was (5)
    digitalWrite(4, LOW);    //was (2, HIGH)
    //REMOVED EXTRA DELAY

    time = pulseIn(2, HIGH);  //was (4,HIGH);
    ...  //Keep the rest of your code the same.
} 
于 2015-06-29T22:26:46.663 回答
0

尝试将传感器的 VCC 连接到 3V3而不是 5V。这听起来可能很奇怪,但我试过了,效果很好。另外,请确保您的回声和触发引脚与代码匹配。

于 2015-12-13T17:42:43.423 回答