使用Arduino驱动两个超声波传感器

时间:2014-09-13 12:21:44

标签: arduino

大家。 当我尝试使用Arduino uno驱动两个HC-SR04超声波传感器时,我遇到了问题。 尝试从每个传感器显示两个测量值时,其中一个工作正常但另一个显示值为0。

我的代码如下所示:

int trigPin=12; // this pin work as the output of the two trig pin of the two sensor
int echoPin1=8;
int echoPin2=13;

 void setup()
 {
   Serial.begin (9600);
   pinMode(trigPin, OUTPUT);
   pinMode(echoPin1, INPUT);
   pinMode(echoPin2, INPUT);
 }
 void loop()
{
   float duration1, distance1, duration2, distance2;

  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW); //trig:10 microsecond TTL pulse

  duration1 = pulseIn(echoPin1, HIGH);
  duration2 = pulseIn(echoPin2, HIGH);

  distance1 = duration1/2/29.1;
  distance2 = duration2/2/29.1;
  Serial.print(distance1);
  Serial.print(',');
  Serial.println(distance2);
  delay(20);

}

情况是在串行监视器上,"距离1"然而,显示正确的值" distance2"总是0。

我发现" duration1"和" duration2"交换他们的订单(这意味着duration2首先运行,然后duration1运行。),结果变为distance1显示0但distance2显示正确的值。

当我使用函数" pulseIn"时似乎存在一些问题,是吗?

有人可以帮我解决这个问题,谢谢!

3 个答案:

答案 0 :(得分:2)

除了异步问题之外,可能存在这样的问题:传感器通过Ping从一个传感器到达两者而相互干扰。

要解决此问题,您需要将一个传感器拉高,然后读取长度。然后,你会希望它们之间有一个短暂的延迟,以便ping死掉。然后,你应该为第二个传感器做同样的事情。

这使您可以获得最准确的读数。

答案 1 :(得分:1)

还提出了其他问题:

  1. 每个传感器都有自己的触发引脚,你应该在触发引脚发送信号并从同一个传感器读取回波引脚,然后重复另一个传感器。
  2. 您必须根据数据表(HC-SR04 Datasheet)执行读数之间至少60 ms的读取时间。
  3. 使用中断使计时最准确。

答案 2 :(得分:0)

试一下

int TriggerPIN1 = 9;
int EchoPIN = 10;
int TiggerPIN2 = 5;
int EchoPIN2 = 4;

void setup(){
  pinMode(TriggerPIN1,OUTPUT);
  pinMode(EchoPIN2,INPUT);
  pinMode(TriggerPIN2,OUTPUT);
  pinMode(EchoPIN2,INPUT);
  Serial.begin(9600); 
  }

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

  long timedelay = pulseIn(EchoPIN1,HIGH);
  int distance1 = 0.0343 * (timedelay/2);

  Serial.print("Sensor 1 : ");
  Serial.println(distance1);

  delayMicroseconds(2);

  digitalWrite(TriggerPIN2,LOW);
  delayMicroseconds(2);
  digitalWrite(TriggerPIN2,HIGH);
  delayMicroseconds(2);
  digitalWrite(TriggerPIN2,LOW);

  long td = pulseIn(EchoPIN2,HIGH);
  int distance2 = 0.0343 * (td/2);

  Serial.print("Sensor 2 : ");
  Serial.println(distance2);
  }