#include <Wire.h>
#include <Adafruit_AMG88xx.h>
#include <Servo.h>
// Настройки порогов тепловизора
const float TEMP_THRESHOLD = 30.0; // Температура (в °C), выше которой объект считается целью
const int SERVO_SPEED = 2; // Скорость доворота сервоприводов (шаг в градусах)
// Инициализация компонентов
Adafruit_AMG88xx amg;
Servo servoPan; // Горизонтальная ось
Servo servoTilt; // Вертикальная ось
// Начальные углы сервоприводов
int posPan = 90;
int posTilt = 90;
// Массив для хранения кадра 8х8 (64 пикселя)
float pixels[AMG88xx_PIXEL_ARRAY_SIZE];
void setup() {
Serial.begin(9600);
// Инициализация сервоприводов
servoPan.attach(9);
servoTilt.attach(10);
servoPan.write(posPan);
servoTilt.write(posTilt);
// Инициализация пина управления огнем (например, лазер или реле)
pinMode(12, OUTPUT);
digitalWrite(12, LOW);
// Проверка подключения тепловизора
if (!amg.begin()) {
Serial.println("Ошибка: Датчик AMG8833 не найден!");
while (1);
}
delay(100); // Время на стабилизацию сенсора
}
void loop() {
// Читаем матрицу температур с датчика
amg.readPixels(pixels);
float maxTemp = 0;
int targetX = -1;
int targetY = -1;
// Ищем самую горячую точку в матрице 8х8
for (int i = 0; i < AMG88xx_PIXEL_ARRAY_SIZE; i++) {
if (pixels[i] > maxTemp) {
maxTemp = pixels[i];
// Переводим индекс массива в координаты X и Y (0-7)
targetX = i % 8;
targetY = i / 8;
}
}
// Если самая горячая точка превышает порог — захватываем цель
if (maxTemp >= TEMP_THRESHOLD) {
Serial.print("Цель обнаружена! T: ");
Serial.print(maxTemp);
Serial.print("°C. Позиция: X=");
Serial.print(targetX);
Serial.print(" Y=");
Serial.println(targetY);
// Логика наведения: центр матрицы — это координаты (3.5, 3.5)
// Если цель левее центра (targetX < 3), крутим серво влево. Если правее — вправо.
if (targetX < 3) {
posPan = constrain(posPan + SERVO_SPEED, 0, 180);
} else if (targetX > 4) {
posPan = constrain(posPan - SERVO_SPEED, 0, 180);
}
// Если цель выше центра (targetY < 3), наклоняем вверх. Если ниже — вниз.
if (targetY < 3) {
posTilt = constrain(posTilt - SERVO_SPEED, 0, 180);
} else if (targetY > 4) {
posTilt = constrain(posTilt + SERVO_SPEED, 0, 180);
}
// Обновляем положение сервоприводов
servoPan.write(posPan);
servoTilt.write(posTilt);
// Если цель находится в центре матрицы (захват выполнен) — открываем «огонь»
if (targetX >= 3 && targetX <= 4 && targetY >= 3 && targetY <= 4) {
digitalWrite(12, HIGH); // Включаем лазер / сирену / привод
Serial.println("=== ОГОНЬ! ===");
} else {
digitalWrite(12, LOW);
}
} else {
// Если тепловых объектов нет — выключаем огонь
digitalWrite(12, LOW);
}
delay(50); // Небольшая задержка для плавности работы серво
}