#include <Arduino.h>
int max_speed = 135;
int red_sens = 70;
int green_sens = 50;
int Calibrate_time = 3;
int lag_time = 1;
unsigned long last_time = 0;
int Calib_R_red, Calib_G_red, Calib_B_red;
int Calib_R_green, Calib_G_green, Calib_B_green;
int RED, GREEN, BLUE;
void Init_MOTORS() {
pinMode(2, OUTPUT); // Направление мотора А
pinMode(4, OUTPUT); // Направление мотора B
pinMode(5, OUTPUT); // ШИМ мотора А (Скорость)
pinMode(6, OUTPUT); // ШИМ мотора B (Скорость)
pinMode(7, INPUT); // Датчик линии левый
pinMode(8, INPUT); // Датчик линии правый
}
void Measure_Color() {
digitalWrite(A0, LOW); digitalWrite(10, LOW);
RED = pulseIn(9, LOW, 20000);
digitalWrite(A0, HIGH); digitalWrite(10, HIGH);
GREEN = pulseIn(9, LOW, 20000);
digitalWrite(A0, LOW); digitalWrite(10, HIGH);
BLUE = pulseIn(9, LOW, 20000);
}
// --- Логика движения по линии ---
void Robot_TRACKING() {
bool left = digitalRead(7);
bool right = digitalRead(8);
if (!left && !right) {
digitalWrite(2, LOW);
digitalWrite(4, LOW);
analogWrite(5, max_speed);
analogWrite(6, max_speed);
}
else if (left && !right) {
digitalWrite(2, HIGH);
digitalWrite(4, LOW);
analogWrite(5, max_speed);
analogWrite(6, max_speed);
}
else if (!left && right) {
digitalWrite(2, LOW);
digitalWrite(4, HIGH);
analogWrite(5, max_speed);
analogWrite(6, max_speed);
}
else {
analogWrite(5, 0);
analogWrite(6, 0);
}
}
void Robot_STOP() {
analogWrite(5, 0);
analogWrite(6, 0);
}
void Blink_LED(int pin) {
for (int i = 0; i < 5; i++) {
digitalWrite(pin, HIGH);
delay(200);
digitalWrite(pin, LOW);
delay(200);
}
}
bool isColorMatch(int cR, int cG, int cB, int tolerance) {
return (abs(RED - cR) < tolerance &&
abs(GREEN - cG) < tolerance &&
abs(BLUE - cB) < tolerance);
}
void setup() {
Init_MOTORS();
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A4, OUTPUT); // S3
pinMode(A3, OUTPUT); // S2
pinMode(A0, OUTPUT); // S0
pinMode(10, OUTPUT); // S1
pinMode(9, INPUT); // OUT
// Делитель частоты 20% (S0=H, S1=L)
digitalWrite(A0, HIGH);
digitalWrite(10, LOW);
// Калибровка (Зеленый)
digitalWrite(A1, HIGH);
delay(Calibrate_time * 1000);
Measure_Color();
Calib_R_green = RED; Calib_G_green = GREEN; Calib_B_green = BLUE;
digitalWrite(A1, LOW);
delay(1000);
digitalWrite(A2, HIGH);
delay(Calibrate_time * 1000);
Measure_Color();
Calib_R_red = RED; Calib_G_red = GREEN; Calib_B_red = BLUE;
digitalWrite(A2, LOW);
}
void loop() {
Measure_Color();
if (isColorMatch(Calib_R_red, Calib_G_red, Calib_B_red, red_sens)) {
if (millis() - last_time > (unsigned long)lag_time * 1000) {
Robot_STOP();
Blink_LED(A2); // Мигаем красным
last_time = millis();
}
}
else if (isColorMatch(Calib_R_green, Calib_G_green, Calib_B_green, green_sens)) {
if (millis() - last_time > (unsigned long)lag_time * 1000) {
Robot_STOP();
Blink_LED(A1); // Мигаем синим
last_time = millis();
}
}
// Иначе просто