Программа Ultrasoni c выдала мне странную ошибку - PullRequest
0 голосов
/ 19 марта 2020

Я создал программу, которая предназначена для поворота серводвигателя на 180 градусов, а затем назад, если объект находится в пределах 20 см от ультразвукового датчика c. Это работает нормально, за исключением случаев, когда условие 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);
}

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Если вы хотите показать вывод на последовательном мониторе. Попробуйте использовать код с вложенным синтаксисом if и убедитесь, что он может работать.

0 голосов
/ 19 марта 2020

Посмотрите, что произойдет, когда вы попробуете этот код, так как я немного его очистил:

#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);
}

Я думаю, что если вы используете float, он может сработать. Однако, если это не сработает, попробуйте переключить назначение выводов на разные выводы на Arduino и посмотрите, работает ли это. Если измерение расстояния отключено, лучший способ настроить его с помощью умноженного значения в переменной расстояния в void loop (). Это работает для меня.

...