#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); // Пауза после движения
}