首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arduino超音速传感器总是返回0

Arduino超音速传感器总是返回0
EN

Stack Overflow用户
提问于 2015-06-29 21:21:33
回答 2查看 18.8K关注 0票数 5

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

这是我的密码:

代码语言:javascript
复制
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);
}

这是面包板:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-29 22:26:46

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

例如,您的图表显示了连接到pin 4的TrigTrig应该是您的Arduino的输出,但是您将它定义为输入。

Echo连接到pin 2,它应该是一个输入,但您可以将它定义为输出。

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

代码语言:javascript
复制
#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只是从回波脉冲的开始到同一脉冲的结束(当它变低时)所需的时间。您仍然需要根据pulseWidth的值计算距离。

基于问题最近编辑的更新

如果您将loop()代码的一部分更改为此,则应该可以:

代码语言:javascript
复制
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.
} 
票数 2
EN

Stack Overflow用户

发布于 2015-12-13 17:42:43

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31125790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档