Проблема с датчиком AJ-SR04M

Программа передаёт данные в COM (координаты (gps не работает), угол корабля, расстояние до айсберга). Пока программа не дописана, т. к. сейчас пишу именно расстояние. Сейчас проблема в том, что какое бы расстояние не передавала программа (0 зачастую), всё равно поворачивается серво-мотор. У меня ультразвуковой датчик AJ-SR04M и мы делаем на Arduino Mega, серво у меня стандартный - ардуиновско-наборный)), вот код который я сделала, где всё работает хорошо

#include <NewPing.h>

#define TRIGGER_PIN  11
#define ECHO_PIN     12
#define MAX_DISTANCE 400
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
float tempval1;
float tempval2;
int finalval;

void setup() {
  Serial.begin(9600);
}

void loop() {
  delay(1000);                    
  Serial.print("Ping: ");
  int iterations = 5;
  tempval1=((sonar.ping_median(iterations) / 2) * 0.0343);
  if(tempval1-tempval2>60 || tempval1-tempval2<-60)
  {
    tempval2=(tempval1*0.02 )+ (tempval2*0.98);
    }
  else
  {
  tempval2=(tempval1*0.4 )+ (tempval2*0.6);
  }
  finalval=tempval2;
  Serial.print(finalval);
  Serial.println("cm");
}

Вот проект

проект

Вот полный код программы

#include <NewPing.h>
#include <Servo.h>

// Пины для AJ-SR04M
#define TRIGGER_PIN 11
#define ECHO_PIN 12
#define MAX_DISTANCE 400
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
float tempval1;
float tempval2;
int finalval;

// Исправлено: возвращаемый тип изменён с void на float
float get_distance() {
  delay(1000);                    
  Serial.print("Ping: ");
  int iterations = 5;
  tempval1=((sonar.ping_median(iterations) / 2) * 0.0343);
  if(tempval1-tempval2>60 || tempval1-tempval2<-60)
  {
    tempval2=(tempval1*0.02 )+ (tempval2*0.98);
    }
  else
  {
  tempval2=(tempval1*0.4 )+ (tempval2*0.6);
  }
  finalval=tempval2;
  Serial.print(finalval);
  Serial.println("cm");
  return int(finalval);
}

// Пин для сервомотора (руль)
#define SERVO_PIN 9

// Пины для моторов

Servo servo;
int check_angles[] = {45, 90, 135};

void setup() {
  Serial.begin(9600);
  Serial.println("Starting Iceberg Avoider...");

  // Настройка сервомотора
  servo.attach(SERVO_PIN);
  servo.write(90);
  Serial.println("Servo set to 90 degrees");
}

void loop() {
  static float lat = 59.35;
  static float lon = 40.35;
  static int history[5];
  static int history_index = 0;
  static float distances[3];

  // Проверка расстояний
  for (int i = 0; i < 3; i++) {
    servo.write(check_angles[i]);
    Serial.print("Servo angle: ");
    Serial.println(check_angles[i]);
    delay(50);
    distances[i] = get_distance();
    
    // Отправка данных
    Serial.print(lat, 2);
    Serial.print(",");
    Serial.print(lon, 2);
    Serial.print(",");
    Serial.print(check_angles[i]);
    Serial.print(",");
    Serial.println(distances[i], 2);
  }

  // Обновление координат
  lat += 0.01;
  lon += 0.01;

  // Объезд
  int best_angle = find_best_direction(distances, history, &history_index);
  Serial.print("Best angle: ");
  Serial.println(best_angle);

  if (distances[1] < 2 && distances[1] >= 1) {
    
    servo.write(best_angle);
    Serial.println("Obstacle < 2cm, turning");
    delay(50);
  } else {
    servo.write(90);
    Serial.println("Moving forward");
  }

  delay(50);
}

int find_best_direction(float distances[], int history[], int *history_index) {
  int best_angle = 90;
  float max_distance = distances[1];

  for (int i = 0; i < 3; i++) {
    if (distances[i] > max_distance) {
      max_distance = distances[i];
      best_angle = check_angles[i];
    }
  }

  int recent_count = 0;
  for (int i = 0; i < 5; i++) {
    if (history[i] == best_angle) recent_count++;
  }
  if (recent_count > 2) {
    float second_max = 0;
    for (int i = 0; i < 3; i++) {
      if (distances[i] > second_max && check_angles[i] != best_angle) {
        second_max = distances[i];
        best_angle = check_angles[i];
      }
    }
  }

  history[*history_index] = best_angle;
  *history_index = (*history_index + 1) % 5;
  return best_angle;
}

Ответы (0 шт):