ультразвуковой датчик дает неправильные расстояния

. Я использовал встроенный базовый пример измерения расстояния для проверки своего ультразвукового датчика. предмет держится на 10 - 15 см. формируют ультразвуковой датчик, но показания показывают только 135 см

#include <Ultrasonic.h>
int trigPin = 5;    
int echoPin = 6; 
#include <Servo.h>   //сервобиблиотека
Servo servo;        
int servoPin = 7;
long duration, dist, average;   
long aver[3];   //массив для среднего


void setup() {       
    Serial.begin(9600);
    servo.attach(servoPin);  
    pinMode(trigPin, OUTPUT);  
    pinMode(echoPin, INPUT);  
    servo.write(0);         //закрыть крышку при включении питания
    delay(100);
    servo.detach(); 
} 

void measure() {  
 digitalWrite(100,HIGH);
digitalWrite(trigPin, LOW);
delayMicroseconds(100);
digitalWrite(trigPin, HIGH);
delayMicroseconds(150);
digitalWrite(trigPin, LOW);
pinMode(echoPin, INPUT);
duration = pulseIn(echoPin, HIGH);
dist = (duration/2.0) / 29.1;    //получить расстояние
}
void loop() { 
  for (int i=0;i<=2;i++) {   //среднее расстояние
    measure();               
   aver[i]=dist;            
    delay(100);              //задержка между измерениями
  }
 dist=(aver[0]+aver[1]+aver[2])/3;    

if ( dist<15 ) {
//Изменить расстояние в соответствии с вашими потребностями
 servo.attach(servoPin);
  delay(1);
 servo.write(0);  
 delay(2500);       
 servo.write(100);    
 delay(500);
 servo.detach();      
}
Serial.print(dist);
}

#include <Ultrasonic.h>
int trigPin = 5;    
int echoPin = 6; 
#include <Servo.h>   //сервобиблиотека
Servo servo;        
int servoPin = 7;
long duration, dist, average;   
long aver[3];   //массив для среднего

void setup() {       
    Serial.begin(9600);
    servo.attach(servoPin);  
    pinMode(trigPin, OUTPUT);  
    pinMode(echoPin, INPUT);  
    servo.write(0);         //закрыть крышку при включении питания
    delay(100);
    servo.detach(); 
} 

void measure() {  
    digitalWrite(100,HIGH);
    digitalWrite(trigPin, LOW);
    delayMicroseconds(100);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(150);
    digitalWrite(trigPin, LOW);
    pinMode(echoPin, INPUT);
    duration = pulseIn(echoPin, HIGH);
    dist = (duration/2.0) / 29.1;    //получить расстояние
}

void loop() { 
  for (int i=0;i<=2;i++) {   //среднее расстояние
    measure();               
   aver[i]=dist;            
    delay(100);              //задержка между измерениями
  }
  dist=(aver[0]+aver[1]+aver[2])/3;    

  if ( dist<15 ) {
    //Изменить расстояние в соответствии с вашими потребностями
    servo.attach(servoPin);
    delay(1);
    servo.write(0);  
    delay(2500);       
    servo.write(100);    
    delay(500);
    servo.detach();      
  }
  Serial.print(dist);
}

, 👍0

Обсуждение

Нет, мы не можем, потому что вы не предоставили нам достаточно информации. Вы должны отредактировать свой вопрос, включив в него полный код (пожалуйста, отформатируйте его правильно) и проводку. Также вы должны объяснить, как вы тестируете проект. Ультразвуковой датчик нуждается в достаточно твердой поверхности перед собой, чтобы ультразвуковые волны достаточно отражались. Мягкие материалы, такие как ткань, или поверхности, которые не параллельны датчику, сделают измерение более трудным/менее точным., @chrisl

я отправил свой код, @Emmanuel Gudinho

Чтобы предоставить дополнительную информацию, пожалуйста, всегда редактируйте свой вопрос. Для этого есть кнопка редактирования. Ваш код не является ответом на ваш вопрос, поэтому его не следует публиковать в качестве ответа. Поскольку вы новый участник (добро пожаловать!), вы можете найти [Тур](https://arduino.stackexchange.com/tour) весьма полезным. Вопрос высокого качества имеет гораздо больше шансов получить хорошие ответы., @chrisl

Я отредактировал ваш вопрос для вас, @chrisl

Относительно «digitalWrite(100, HIGH);»: на Uno нет контакта 100., @Edgar Bonet

Почему вы добавили свой код во второй раз в свой вопрос? Я не вижу разницы. Также вам действительно следует написать больше текста и что-то объяснить. Я задал больше вопросов в своем первом комментарии, и вы до сих пор не ответили на них, @chrisl


1 ответ


1

У вас много лишнего кода:

  1. включать Ultrasonic.h не нужно.
  2. servo.attach и servo.detach без повторного использования штифта не нужны
  3. Неправильный ультразвуковой код. Это должно быть:
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);

    // измеряем длительность импульса с вывода ECHO
    duration_us = pulseIn(echoPin, HIGH);

    // вычисляем расстояние
    distance_cm = 0.017 * duration_us;

См. руководство по работе с ультразвуковым датчиком и Учебное пособие по серводвигателям

,