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


#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); // Небольшая задержка для плавности работы серво
}