Arduino 超声波程序给了我一个奇怪的错误

Arduino 超声波程序给了我一个奇怪的错误,arduino,arduino-uno,arduino-ide,Arduino,Arduino Uno,Arduino Ide,我创建了一个程序,该程序旨在将伺服电机旋转180度,然后在物体位于超声波传感器20厘米范围内时返回。这可以正常工作,除非有时不满足if条件。在这种情况下,电机根本不移动,距离被输入串行监视器。这有时工作正常,但在大多数情况下,串行监视器只是重复打印0,我必须重新启动程序才能再次工作。即使我把一个物体放在距离传感器20厘米的范围内,它仍然打印0。我对Arduino很陌生,所以这真的让我很难受哈哈。任何提示或帮助都将不胜感激 #include <Servo.h> Servo servo

我创建了一个程序,该程序旨在将伺服电机旋转180度,然后在物体位于超声波传感器20厘米范围内时返回。这可以正常工作,除非有时不满足if条件。在这种情况下,电机根本不移动,距离被输入串行监视器。这有时工作正常,但在大多数情况下,串行监视器只是重复打印0,我必须重新启动程序才能再次工作。即使我把一个物体放在距离传感器20厘米的范围内,它仍然打印0。我对Arduino很陌生,所以这真的让我很难受哈哈。任何提示或帮助都将不胜感激

#include <Servo.h>

Servo servo1;  // create servo object to control a servo

#define trigPin 13
#define echoPin 12


void setup()
{
  Serial.begin(9600);
  servo1.attach(9);  // attaches the servo on pin 9 to the servo object
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}


void loop()
{
  long duration = 0, distance = 0;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration / 2) / 29.1;

  if(distance > 2 && distance < 20){
    servo1.write(180);
    Serial.println(distance);
    delay(1000);
    servo1.write(-180);
  }
else{
  servo1.write(0);
  Serial.println(distance);
}

 delay(2000);
}
#包括
伺服伺服1;//创建伺服对象以控制伺服
#定义trigPin 13
#定义echoPin 12
无效设置()
{
Serial.begin(9600);
伺服1.连接(9);//将针脚9上的伺服连接到伺服对象
引脚模式(trigPin,输出);
pinMode(echoPin,输入);
}
void循环()
{
长持续时间=0,距离=0;
数字写入(trigPin,低电平);
延迟微秒(2);
数字写入(trigPin,高);
延迟微秒(10);
数字写入(trigPin,低电平);
延迟微秒(2);
持续时间=脉冲强度(echoPin,高);
距离=(持续时间/2)/29.1;
如果(距离>2和距离<20){
伺服1.写入(180);
串行打印LN(距离);
延迟(1000);
伺服1.写入(-180);
}
否则{
伺服1.写入(0);
串行打印LN(距离);
}
延迟(2000年);
}

看看当你尝试这段代码时会发生什么,因为我稍微清理了一下:

#include <Servo.h>

#define trigPin 13
#define echoPin 12

Servo servo1;  // create servo object to control a servo

void setup() {
  Serial.begin (9600);
  servo1.attach(9);  // attaches the servo on pin 9 to the servo object
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop() {
  float duration, distance;
  digitalWrite(trigPin, LOW); 
  delayMicroseconds(2);

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

  duration = pulseIn(echoPin, HIGH);
  distance = (duration / 2) * 29.1;

  if (duration) {
    if (distance > 2 && distance < 20) {
      servo1.write(180);
      Serial.println(distance);
      delay(1000);
      servo1.write(-180);
    }

    else {
      servo1.write(0);
      Serial.println(distance);
    }
  }
  delay(2000);
}
#包括
#定义trigPin 13
#定义echoPin 12
伺服伺服1;//创建伺服对象以控制伺服
无效设置(){
Serial.begin(9600);
伺服1.连接(9);//将针脚9上的伺服连接到伺服对象
引脚模式(trigPin,输出);
pinMode(echoPin,输入);
}
void循环(){
浮动持续时间、距离;
数字写入(trigPin,低电平);
延迟微秒(2);
数字写入(trigPin,高);
延迟微秒(10);
数字写入(trigPin,低电平);
持续时间=脉冲强度(echoPin,高);
距离=(持续时间/2)*29.1;
如果(持续时间){
如果(距离>2和距离<20){
伺服1.写入(180);
串行打印LN(距离);
延迟(1000);
伺服1.写入(-180);
}
否则{
伺服1.写入(0);
串行打印LN(距离);
}
}
延迟(2000年);
}

我想如果你用浮子的话可能会有用。但是,如果不起作用,请尝试将管脚分配切换到Arduino上的不同管脚,看看是否起作用。如果距离测量值关闭,最好的调整方法是在
无效循环()
中使用距离变量中的乘以值。这一方法对我有效

你们检查接线了吗?这个代码确实有点帮助,但总的来说我认为我的超声波传感器有点问题。我相信这一点,因为我尝试了3个不同的库,只是为了确保我的传感器是准确的,每一个库我都会得到0的随机条纹,有时甚至是完全随机的数字,而这些数字与我的物体所在的位置相差甚远。我还更换了连接,确保每个连接都正确连接。@N.Cut它是什么类型的传感器?它是一个HC-SR04传感器,我已经有一段时间了,所以我假设它可能随着时间的推移而损坏,或者它只是从工厂出现故障。