Загрузка данных


#include <Stepper.h>

// Пины фоторезисторов
#define NORTH_PIN A5
#define WEST_PIN  A4
#define EAST_PIN  A3
#define SOUTH_PIN A2

// Настройки шагового двигателя
const int stepsPerRevolution = 2048; // Для 28BYJ-48 (полный оборот)
Stepper stepper(stepsPerRevolution, 8, 10, 9, 11);

// Порог чувствительности (0-1023)
const int threshold = 100;

// Структура для хранения направления
struct Direction {
  int angle;
  String name;
};

void setup() {
  Serial.begin(9600);
  
  // Задаём скорость двигателя (RPM)
  stepper.setSpeed(15);
  
  // Небольшая пауза для стабилизации фоторезисторов
  delay(1000);
  
  Serial.println("Система готова. Ожидание сигналов с фоторезисторов...");
}

void loop() {
  // Считываем значения со всех датчиков
  int northValue = analogRead(NORTH_PIN);
  int westValue  = analogRead(WEST_PIN);
  int eastValue  = analogRead(EAST_PIN);
  int southValue = analogRead(SOUTH_PIN);
  
  // Выводим значения в монитор порта для отладки
  Serial.print("N:");
  Serial.print(northValue);
  Serial.print(" E:");
  Serial.print(eastValue);
  Serial.print(" S:");
  Serial.print(southValue);
  Serial.print(" W:");
  Serial.println(westValue);
  
  // Определяем, какие датчики активны
  bool northActive = northValue > threshold;
  bool eastActive  = eastValue  > threshold;
  bool southActive = southValue > threshold;
  bool westActive  = westValue  > threshold;
  
  // Получаем целевое направление
  Direction target = getTargetDirection(northActive, eastActive, southActive, westActive);
  
  if (target.angle != -1) {
    Serial.print("Направление: ");
    Serial.println(target.name);
    pointToDirection(target.angle);
  }
  
  delay(500); // Задержка между проверками
}

// Функция определения угла по активным датчикам
Direction getTargetDirection(bool north, bool east, bool south, bool west) {
  // 8 основных направлений
  if (north && !east && !south && !west) return {0, "Север"};
  if (north && east && !south && !west)  return {45, "Северо-Восток"};
  if (!north && east && !south && !west) return {90, "Восток"};
  if (!north && east && south && !west)  return {135, "Юго-Восток"};
  if (!north && !east && south && !west) return {180, "Юг"};
  if (!north && !east && south && west)  return {225, "Юго-Запад"};
  if (!north && !east && !south && west) return {270, "Запад"};
  if (north && !east && !south && west)  return {315, "Северо-Запад"};
  
  // Если нет активных датчиков или некорректная комбинация
  return {-1, "Нет сигнала"};
}

// Поворот двигателя в заданный угол (0-359 градусов)
void pointToDirection(int targetAngle) {
  static int currentAngle = 0;
  
  // Вычисляем кратчайший путь поворота
  int delta = targetAngle - currentAngle;
  
  // Нормализуем дельту в диапазон -180..180
  if (delta > 180) delta -= 360;
  if (delta < -180) delta += 360;
  
  if (abs(delta) < 5) {
    Serial.println("Уже указывает в нужную сторону");
    return;
  }
  
  // Преобразуем угол в шаги
  long steps = map(abs(delta), 0, 360, 0, stepsPerRevolution);
  
  Serial.print("Поворот на ");
  Serial.print(delta);
  Serial.println(" градусов");
  
  // Выполняем поворот
  if (delta > 0) {
    stepper.step(steps);
  } else {
    stepper.step(-steps);
  }
  
  // Обновляем текущий угол
  currentAngle = targetAngle;
  
  delay(500); // Пауза после движения
}