#include <Stepper.h>
#define ECHO_PIN 3
#define TRIG_PIN 4
#define LDR_PIN A0
#define LED_PIN 13
int IN1 = 9;
int IN2 = 8;
int IN3 = 7;
int IN4 = 6;
const int stepsPerRevolution = 180;
Stepper myStepper(stepsPerRevolution, IN1, IN2, IN3, IN4);
int motorSpeed = 60; // Начальная скорость мотора в шагах в минуту
int lightThreshold = 100; // Порог освещенности для логики
int maxDistance = 200; // Максимальное расстояние для корректировки скорости
int maxLightThreshold = 900; // Максимальный порог для остановки при слишком ярком свете
// Функция для измерения расстояния с ультразвукового датчика
float getDistanceCM() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
int echoDuration = pulseIn(ECHO_PIN, HIGH);
return echoDuration * 0.034 / 2;
}
int getLightLevel() {
return analogRead(LDR_PIN);
}
void adjustMotorSpeed(int distance, int lightValue) {
if (lightValue > maxLightThreshold) {
motorSpeed = 0;
Serial.println("Слишком много света. Остановка.");
return;
}
if (distance > maxDistance) {
distance = maxDistance;
}
// Больше расстояние - медленнее двигается
motorSpeed = map(distance, 0, maxDistance, 100, 50);
// Корректировка скорости на основе освещенности
if (lightValue < lightThreshold) {
motorSpeed += map(lightValue, 0, lightThreshold, 20, 100); // Увеличиваем скорость при малом свете
} else {
motorSpeed -= map(lightValue, lightThreshold, 1015, 20, 50); // Уменьшаем при ярком свете
}
motorSpeed = constrain(motorSpeed, 10, 100); // Избегаем нулевой скорости
myStepper.setSpeed(motorSpeed);
Serial.print("Motor speed: ");
Serial.println(motorSpeed);
}
void makeDecision(float distance, int lightValue) {
if (lightValue > maxLightThreshold) {
Serial.println("Слишком много света. Робот не будет двигаться.");
digitalWrite(LED_PIN, LOW);
return;
}
if (distance < 50 && lightValue < lightThreshold) {
Serial.println("Поворот направо для избегания препятствия и поиска света.");
myStepper.step(stepsPerRevolution / 4); // Поворот направо на 1/4 оборота
digitalWrite(LED_PIN, HIGH);
} else if (distance < 50) {
Serial.println("Поворот налево для избегания препятствия.");
myStepper.step(-stepsPerRevolution / 4); // Поворот налево на 1/4 оборота
digitalWrite(LED_PIN, HIGH);
} else if (lightValue < lightThreshold) {
Serial.println("Ускорение к источнику света.");
adjustMotorSpeed(distance, lightValue);
myStepper.step(stepsPerRevolution / 2); // Движение вперед на 1/2 оборота
digitalWrite(LED_PIN, HIGH);
} else {
Serial.println("Движение вперед.");
adjustMotorSpeed(distance, lightValue);
myStepper.step(stepsPerRevolution); // Движение вперед на полный оборот
digitalWrite(LED_PIN, HIGH);
}
}
void setup() {
pinMode(ECHO_PIN, INPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
myStepper.setSpeed(20);
Serial.begin(9600);
}
void loop() {
Serial.println();
float distance = getDistanceCM();
int lightValue = getLightLevel();
Serial.print("Расстояние: ");
Serial.println(distance);
Serial.print("Уровень света: ");
Serial.println(lightValue);
makeDecision(distance, lightValue);
delay(500);
}