Skip to main content

🚶 Датчик движения PIR

🎯 Цели и планируемые результаты урока

Предметные результаты:

  • Понимание принципов работы PIR датчиков и инфракрасного излучения
  • Освоение методов детекции движения и присутствия
  • Навыки настройки чувствительности и временных параметров PIR
  • Умение создавать охранные и автоматические системы
  • Практические навыки работы с цифровыми датчиками движения
  • Создание умных устройств реагирующих на присутствие человека

Метапредметные результаты:

  • Развитие понимания невидимых физических явлений
  • Формирование навыков создания автоматических систем безопасности
  • Умение анализировать паттерны движения и поведения
  • Развитие системного мышления при проектировании охранных систем

Личностные результаты:

  • Понимание важности безопасности и защиты имущества
  • Развитие ответственного отношения к приватности
  • Формирование интереса к системам “умного дома”

🚀 Мотивационное начало (8 минут)

“Невидимый страж - ESP32 с рентгеновским зрением”

Учитель демонстрирует PIR датчик, который “видит” людей через препятствия и реагирует на движение

🔍 Загадочная демонстрация “Невидимое обнаружение”:

👤 Учитель заходит в класс → Светодиод загорается ДО того, как его видят ученики
🚪 Кто-то движется за дверью → Система сразу реагирует
📄 Лист бумаги перед датчиком → Человек за листом все равно обнаруживается!
🪑 Учитель прячется за стул → Датчик "видит" сквозь мебель
❄️ Включаем кондиционер → Система не реагирует на холодный воздух

🎭 Интерактивная аналогия “Тепловое зрение хищника”:

🐍 ЗМЕЯ-ГАДЮКА              ↔    🔍 PIR ДАТЧИК
Видит тепловое излучение    ↔    Обнаруживает ИК-излучение
Реагирует на теплокровных   ↔    Реагирует на людей/животных
Не видит холодные объекты   ↔    Игнорирует неживые предметы
Охотится в полной темноте   ↔    Работает без освещения
Мгновенная реакция на жертву ↔   Быстрое срабатывание

🏠 Демонстрация умных сценариев:

🌙 УМНЫЙ ДОМ НОЧЬЮ:
- Входите в коридор → Автоматически включается приглушенный свет
- Идете в ванную → Освещение следует за вами
- Покидаете комнату → Через 2 минуты все выключается

🛡️ СИСТЕМА БЕЗОПАСНОСТИ:
- Движение ночью → Сигнал тревоги + фото на телефон
- Долгое отсутствие движения → "Режим охраны" активирован
- Обнаружен злоумышленник → Сирена + уведомление владельцу

🌟 Интрига урока: “Сегодня мы научим ESP32 видеть тепло живых существ и создадим систему, которая будет знать о каждом вашем движении!”

🎯 Вызов дня: “К концу урока ваш ESP32 станет невидимым охранником, который будет следить за классом даже в полной темноте!”

📖 Основная часть урока

Блок 1: “Принципы работы PIR датчиков - видим невидимое тепло” (15 минут)

🌡️ “Инфракрасное излучение - тепловые волны вокруг нас”

Физические основы ИК-детекции:

🌈 СПЕКТР ЭЛЕКТРОМАГНИТНОГО ИЗЛУЧЕНИЯ:

Видимый свет: 380-780 нм (то что видят наши глаза)
Ближний ИК: 780нм-1.4мкм (пульты ДУ, оптоволокно)  
Средний ИК: 1.4-8мкм (ТЕПЛОВОЕ излучение человека!)
Дальний ИК: 8-15мкм (тепловизоры, астрономия)

🔥 ТЕПЛОВОЕ ИЗЛУЧЕНИЕ ЧЕЛОВЕКА:
- Температура тела: 36.6°C = 309.6K
- Пик излучения: 9.3 мкм (средний ИК)
- Мощность: ~100 Вт тепла с поверхности тела
- Видимость: В полной темноте для ИК-камеры!

❄️ ОКРУЖАЮЩИЕ ОБЪЕКТЫ:
- Комнатная температура: 20°C = 293K  
- Пик излучения: 9.9 мкм
- Контраст: 6.6°C разности = четкое обнаружение!

🔍 “PIR - Passive Infrared sensor”

Устройство и принцип работы:

🔬 АНАТОМИЯ PIR ДАТЧИКА:

1️⃣ ПИРОЭЛЕКТРИЧЕСКИЙ ЭЛЕМЕНТ:
- Материал: Танталат лития (LiTaO3)
- Принцип: Изменение поляризации при нагреве
- Структура: ДВА элемента рядом (дифференциальная схема)
- Чувствительность: Изменения температуры 0.1°C

2️⃣ ЛИНЗА ФРЕНЕЛЯ:
- Материал: Полиэтилен (прозрачен для ИК)
- Функция: Фокусировка ИК-лучей на сенсор
- Зоны: 20-60 фокусных сегментов
- Угол обзора: 90-120 градусов

3️⃣ ЭЛЕКТРОННАЯ ОБРАБОТКА:
- Усилитель: Увеличивает слабый сигнал в 1000+ раз
- Компаратор: Превращает аналоговый сигнал в цифровой
- Таймер: Устанавливает длительность выходного сигнала
- Фильтр: Убирает помехи и ложные срабатывания

🎯 ПРИНЦИП РАБОТЫ:
1. ИК-излучение от человека попадает на ОДИН из двух элементов
2. Возникает РАЗНОСТЬ сигналов между элементами  
3. Разность усиливается и сравнивается с порогом
4. При превышении порога → Выход становится HIGH
5. Таймер удерживает HIGH заданное время

📐 “Зоны обнаружения и мертвые точки”

Геометрия работы PIR датчика:

🎯 ЗОНЫ ОБНАРУЖЕНИЯ PIR:

АКТИВНЫЕ ЗОНЫ (высокая чувствительность):
┌─────────────────────────┐
│  \     /\     /\     /  │ ← Лучи линзы Френеля
│   \   /  \   /  \   /   │
│    \ /    \ /    \ /    │
│     X      X      X     │ ← Фокальные точки
│      \    /|\    /      │
│       \  / | \  /       │
│        \/  |  \/        │
│           PIR            │
└─────────────────────────┘

МЕРТВЫЕ ЗОНЫ (слабая чувствительность):
- Прямо перед датчиком (слишком близко)
- Между активными лучами
- Сбоку от датчика (вне угла обзора)
- За препятствиями (стены, мебель)

🚶 ОПТИМАЛЬНОЕ ДВИЖЕНИЕ:
✅ Поперек лучей (слева направо)
✅ На расстоянии 2-7 метров
✅ Средняя скорость (1-2 м/с)

❌ ПЛОХОЕ ОБНАРУЖЕНИЕ:
- Движение прямо на датчик/от датчика
- Очень медленное движение (<0.3 м/с)
- Очень быстрое движение (>5 м/с)
- В жаркую погоду (малый контраст)

🧪 Практическое исследование “Поведение PIR датчика”

Эксперименты с обнаружением движения:

🔬 ЛАБОРАТОРИЯ ДЕТЕКЦИИ ДВИЖЕНИЯ:

Эксперимент 1: Зависимость от расстояния
Методика: Движение на разных расстояниях от датчика

📊 ТАБЛИЦА ДАЛЬНОСТИ:
┌─────────────┬──────────────┬─────────────┬──────────────┐
│ Расстояние  │ Обнаружение  │ Время реакции│ Надежность  │
├─────────────┼──────────────┼─────────────┼──────────────┤
│ 0.5 м       │ ДА/НЕТ       │ _____ мс    │ ____/10      │
│ 1 м         │ ДА/НЕТ       │ _____ мс    │ ____/10      │
│ 2 м         │ ДА/НЕТ       │ _____ мс    │ ____/10      │
│ 3 м         │ ДА/НЕТ       │ _____ мс    │ ____/10      │
│ 5 м         │ ДА/НЕТ       │ _____ мс    │ ____/10      │
│ 7 м         │ ДА/НЕТ       │ _____ мс    │ ____/10      │
└─────────────┴──────────────┴─────────────┴──────────────┘

Эксперимент 2: Направление движения
- Слева направо: Обнаружен на расстоянии _____ м
- Справа налево: Обнаружен на расстоянии _____ м  
- На датчик: Обнаружен на расстоянии _____ м
- От датчика: Обнаружен на расстоянии _____ м
- Вывод: Лучшее направление _____________

Эксперимент 3: Влияние препятствий  
- Прозрачное стекло: БЛОКИРУЕТ/ПРОПУСКАЕТ
- Тонкая ткань: БЛОКИРУЕТ/ПРОПУСКАЕТ
- Лист бумаги: БЛОКИРУЕТ/ПРОПУСКАЕТ
- Пластиковая бутылка: БЛОКИРУЕТ/ПРОПУСКАЕТ
- Вывод: ИК-излучение проходит через ___________

Эксперимент 4: Ложные срабатывания
□ Включение лампы накаливания
□ Горячий чай рядом с датчиком
□ Фен или обогреватель  
□ Домашнее животное (кот/собака)
□ Развевающиеся шторы
□ Автомобиль за окном

⚙️ “Настройки PIR модуля HC-SR501”

Регулировка параметров работы:

🎛️ ОРГАНЫ УПРАВЛЕНИЯ HC-SR501:

1️⃣ ПОТЕНЦИОМЕТР ЧУВСТВИТЕЛЬНОСТИ (Sx):
Положение: Левый потенциометр
Диапазон: 3-7 метров  
Поворот по часовой: УВЕЛИЧИТЬ дальность
Поворот против часовой: УМЕНЬШИТЬ дальность
Рекомендация: Для класса - средняя позиция

2️⃣ ПОТЕНЦИОМЕТР ВРЕМЕНИ (Tx):
Положение: Правый потенциометр
Диапазон: 0.3 - 300 секунд
Поворот по часовой: УВЕЛИЧИТЬ время удержания
Поворот против часовой: УМЕНЬШИТЬ время
Рекомендация: Для тестов - минимум (0.3 сек)

3️⃣ ПЕРЕМЫЧКА РЕЖИМА РАБОТЫ:
Позиция H: Режим "Повтора" (retriggering)
- При новом движении время сбрасывается
- Подходит для освещения

Позиция L: Режим "Однократного срабатывания"  
- Игнорирует движение пока идет отсчет
- Подходит для охранных систем

🔧 РЕКОМЕНДУЕМЫЕ НАСТРОЙКИ:
Для обучения: Sx = мин, Tx = мин, Jumper = L
Для освещения: Sx = сред, Tx = 30сек, Jumper = H  
Для охраны: Sx = макс, Tx = макс, Jumper = L

Блок 2: “Подключение и программирование PIR датчика” (14 минут)

🔌 “Схема подключения HC-SR501”

Простое подключение к ESP32:

🛠️ СХЕМА ПОДКЛЮЧЕНИЯ PIR ДАТЧИКА:

       ESP32                    HC-SR501
    ┌─────────┐              ┌─────────────┐
    │   5V    │──────────────│ VCC (красный)│
    │ GPIO 13 │──────────────│ OUT (желтый) │
    │   GND   │──────────────│ GND (черный) │
    └─────────┘              └─────────────┘
                              │ [Sx] [Tx]  │ ← Потенциометры
                              │    [H/L]   │ ← Перемычка
                              └─────────────┘

⚠️ ВАЖНЫЕ МОМЕНТЫ:
1. PIR требует 5V питания (не 3.3V!)
2. Выходной сигнал 3.3V - безопасен для ESP32
3. После включения нужно 60 секунд на стабилизацию
4. Не касаться руками линзы датчика
5. Устанавливать вертикально для лучшей работы

🔧 ДОПОЛНИТЕЛЬНЫЕ КОМПОНЕНТЫ:
- Светодиод + резистор 220Ом (индикация движения)
- Buzzer (звуковая сигнализация)  
- Реле (управление мощными нагрузками)
- LCD дисплей (отображение статуса)

💻 “Базовая программа детекции движения”

Код с обработкой PIR сигналов:

// 🚶 ПРОГРАММА ДАТЧИКА ДВИЖЕНИЯ PIR
// Урок 15: Обнаружение движения и создание охранных систем

// 🔧 Настройки пинов
const int PIR_PIN = 13;              // Пин подключения PIR датчика
const int LED_PIN = 2;               // Встроенный светодиод
const int EXTERNAL_LED_PIN = 5;      // Внешний светодиод
const int BUZZER_PIN = 4;            // Пищалка (опционально)

// 📊 Параметры детекции
const unsigned long STABILIZATION_TIME = 60000;  // 60 сек стабилизации
const unsigned long MOTION_TIMEOUT = 5000;       // 5 сек без движения = "покой"
const int MOTION_COUNTER_THRESHOLD = 3;          // Мин. количество срабатываний

// 📈 Переменные состояния
bool motionDetected = false;          // Текущее состояние движения
bool systemArmed = false;             // Система активирована
unsigned long lastMotionTime = 0;    // Время последнего движения
unsigned long systemStartTime = 0;   // Время запуска системы
int motionCounter = 0;                // Счетчик движений
int totalMotions = 0;                 // Общее количество движений

// 🕐 Временные метки для анализа
unsigned long motionTimes[10];        // История последних движений
int motionIndex = 0;                  // Индекс в массиве истории

void setup() {
  Serial.begin(9600);
  Serial.println("🚶 Система детекции движения PIR v2.0");
  
  // 🔧 Настройка пинов
  pinMode(PIR_PIN, INPUT);
  pinMode(LED_PIN, OUTPUT);
  pinMode(EXTERNAL_LED_PIN, OUTPUT);
  pinMode(BUZZER_PIN, OUTPUT);
  
  systemStartTime = millis();
  
  Serial.println("⏳ Ожидание стабилизации PIR датчика...");
  Serial.println("   (НЕ ДВИГАЙТЕСЬ 60 секунд!)");
  
  // 🎯 Период стабилизации с индикацией
  stabilizationPeriod();
  
  Serial.println("✅ PIR датчик готов к работе!");
  Serial.println("📊 Формат: Движение | Счетчик | Время | Статус");
  Serial.println("─────────────────────────────────────────────────");
}

void loop() {
  // 📖 Читаем состояние PIR датчика
  bool currentMotion = digitalRead(PIR_PIN);
  
  // 🔍 Обрабатываем изменения состояния
  if (currentMotion != motionDetected) {
    handleMotionChange(currentMotion);
  }
  
  // ⏰ Проверяем таймаут отсутствия движения
  checkMotionTimeout();
  
  // 💡 Обновляем индикацию
  updateIndicators();
  
  // 📊 Анализируем паттерны движения
  analyzeMotionPatterns();
  
  // 🎮 Обрабатываем команды пользователя
  handleSerialCommands();
  
  delay(100);  // Опрос 10 раз в секунду
}

// ⏳ Функция стабилизации PIR датчика
void stabilizationPeriod() {
  unsigned long startTime = millis();
  
  while (millis() - startTime < STABILIZATION_TIME) {
    unsigned long elapsed = millis() - startTime;
    int progress = (elapsed * 100) / STABILIZATION_TIME;
    
    // 📈 Показываем прогресс каждые 10 секунд
    if (elapsed % 10000 == 0 && elapsed > 0) {
      Serial.printf("⏳ Стабилизация: %d%% (%lu сек)\n", 
                    progress, elapsed / 1000);
    }
    
    // 💡 Мигание светодиода во время стабилизации
    bool blinkState = (millis() / 500) % 2;
    digitalWrite(LED_PIN, blinkState);
    
    delay(100);
  }
  
  digitalWrite(LED_PIN, LOW);
}

// 🔄 Функция обработки изменения состояния движения
void handleMotionChange(bool newState) {
  motionDetected = newState;
  unsigned long currentTime = millis();
  
  if (newState) {
    // 🚶 ДВИЖЕНИЕ ОБНАРУЖЕНО
    lastMotionTime = currentTime;
    motionCounter++;
    totalMotions++;
    
    // 📝 Записываем время в историю
    motionTimes[motionIndex] = currentTime;
    motionIndex = (motionIndex + 1) % 10;
    
    Serial.printf("🚶 ДВИЖЕНИЕ! Счетчик: %d | Общий: %d | Время: %lu\n",
                  motionCounter, totalMotions, currentTime / 1000);
    
    // 🎯 Реакция на движение
    onMotionDetected();
    
  } else {
    // 🛑 ДВИЖЕНИЕ ПРЕКРАТИЛОСЬ
    Serial.printf("🛑 Движение прекратилось | Длительность: %lu мс\n",
                  currentTime - lastMotionTime);
  }
}

// 🎯 Функция реакции на обнаруженное движение
void onMotionDetected() {
  // 💡 Включаем освещение
  digitalWrite(EXTERNAL_LED_PIN, HIGH);
  
  // 🔊 Звуковой сигнал при активированной системе
  if (systemArmed) {
    tone(BUZZER_PIN, 1000, 200);  // 200мс сигнал 1кГц
    Serial.println("🚨 ТРЕВОГА! Движение при активированной охране!");
  }
  
  // 📊 Анализ активности
  analyzeActivity();
}

// ⏰ Функция проверки таймаута движения
void checkMotionTimeout() {
  if (motionDetected && (millis() - lastMotionTime > MOTION_TIMEOUT)) {
    Serial.printf("😴 Период покоя начался (>%d сек без движения)\n", 
                  MOTION_TIMEOUT / 1000);
    
    // 🔄 Сбрасываем счетчик движений
    motionCounter = 0;
    
    // 💡 Выключаем освещение
    digitalWrite(EXTERNAL_LED_PIN, LOW);
  }
}

// 💡 Функция обновления индикаторов
void updateIndicators() {
  // 🔴 Встроенный светодиод = текущее движение
  digitalWrite(LED_PIN, motionDetected);
  
  // 🟢 Внешний светодиод = недавняя активность
  bool recentActivity = (millis() - lastMotionTime) < MOTION_TIMEOUT;
  digitalWrite(EXTERNAL_LED_PIN, recentActivity);
}

// 📊 Функция анализа паттернов движения
void analyzeMotionPatterns() {
  static unsigned long lastAnalysis = 0;
  
  // 📈 Анализируем каждые 30 секунд
  if (millis() - lastAnalysis >= 30000) {
    lastAnalysis = millis();
    
    // 🔍 Анализируем историю движений
    int recentMotions = countRecentMotions(30000);  // За последние 30 сек
    
    Serial.printf("📊 Анализ активности: %d движений за 30 сек\n", recentMotions);
    
    // 🎯 Классификация активности
    if (recentMotions == 0) {
      Serial.println("😴 Статус: ПОКОЙ");
    } else if (recentMotions <= 2) {
      Serial.println("🚶 Статус: НИЗКАЯ АКТИВНОСТЬ");
    } else if (recentMotions <= 5) {
      Serial.println("🏃 Статус: СРЕДНЯЯ АКТИВНОСТЬ");
    } else {
      Serial.println("💃 Статус: ВЫСОКАЯ АКТИВНОСТЬ");
    }
  }
}

// 📈 Функция подсчета недавних движений
int countRecentMotions(unsigned long timeWindow) {
  unsigned long currentTime = millis();
  int count = 0;
  
  for (int i = 0; i < 10; i++) {
    if (motionTimes[i] != 0 && 
        (currentTime - motionTimes[i]) <= timeWindow) {
      count++;
    }
  }
  
  return count;
}

// 🔍 Функция анализа активности
void analyzeActivity() {
  // 📊 Частота движений
  int recentMotions = countRecentMotions(60000);  // За минуту
  
  if (recentMotions > 10) {
    Serial.println("🎪 Обнаружена высокая активность (возможно праздник)");
  } else if (recentMotions > 5) {
    Serial.println("👥 Обнаружена групповая активность");
  } else {
    Serial.println("👤 Обнаружена одиночная активность");
  }
}

// 🎮 Функция обработки команд через Serial
void handleSerialCommands() {
  if (Serial.available()) {
    String command = Serial.readStringUntil('\n');
    command.trim();
    command.toLowerCase();
    
    if (command == "arm") {
      systemArmed = true;
      Serial.println("🛡️ Система охраны АКТИВИРОВАНА");
      tone(BUZZER_PIN, 800, 100);
      
    } else if (command == "disarm") {
      systemArmed = false;
      Serial.println("✅ Система охраны ДЕАКТИВИРОВАНА");
      tone(BUZZER_PIN, 400, 100);
      
    } else if (command == "status") {
      printSystemStatus();
      
    } else if (command == "reset") {
      resetStatistics();
      
    } else if (command == "help") {
      printHelp();
      
    } else {
      Serial.println("❌ Неизвестная команда. Введите 'help'");
    }
  }
}

// 📊 Функция вывода статуса системы
void printSystemStatus() {
  unsigned long uptime = millis() / 1000;
  
  Serial.println("📊 СТАТУС СИСТЕМЫ ДВИЖЕНИЯ:");
  Serial.printf("├ Время работы: %lu сек (%lu мин)\n", uptime, uptime / 60);
  Serial.printf("├ Система охраны: %s\n", systemArmed ? "ВКЛ" : "ВЫКЛ");
  Serial.printf("├ Текущее движение: %s\n", motionDetected ? "ДА" : "НЕТ");
  Serial.printf("├ Последнее движение: %lu сек назад\n", 
                (millis() - lastMotionTime) / 1000);
  Serial.printf("├ Движений в текущем периоде: %d\n", motionCounter);
  Serial.printf("├ Всего движений: %d\n", totalMotions);
  Serial.printf("├ Активность за минуту: %d движений\n", 
                countRecentMotions(60000));
  Serial.printf("└ Средняя частота: %.1f движений/мин\n", 
                (float)totalMotions / (uptime / 60.0));
}

// 🔄 Сброс статистики
void resetStatistics() {
  totalMotions = 0;
  motionCounter = 0;
  systemStartTime = millis();
  
  // 🔄 Очищаем историю
  for (int i = 0; i < 10; i++) {
    motionTimes[i] = 0;
  }
  motionIndex = 0;
  
  Serial.println("🔄 Статистика движений сброшена");
}

// 📋 Справка по командам
void printHelp() {
  Serial.println("📋 ДОСТУПНЫЕ КОМАНДЫ:");
  Serial.println("├ arm - активировать охранную систему");
  Serial.println("├ disarm - деактивировать охрану");
  Serial.println("├ status - показать статус системы");
  Serial.println("├ reset - сбросить статистику");
  Serial.println("└ help - эта справка");
}

🎛️ “Настройка чувствительности и фильтрация”

Адаптивные алгоритмы детекции:

// 🧠 УМНАЯ ОБРАБОТКА СИГНАЛОВ PIR

// 📊 Структура для адаптивных настроек
struct PIRSettings {
  int minMotionDuration;     // Мин. длительность движения (мс)
  int maxMotionGap;          // Макс. промежуток в движении (мс)
  int falseAlarmThreshold;   // Порог ложных срабатываний
  bool adaptiveMode;         // Режим адаптации
  unsigned long learningTime; // Время обучения (мс)
};

PIRSettings settings = {200, 2000, 5, true, 300000}; // 5 мин обучения

// 🎯 Функция умной фильтрации движений
bool smartMotionFilter(bool rawMotion) {
  static bool lastState = false;
  static unsigned long stateChangeTime = 0;
  static int shortPulseCount = 0;
  static unsigned long lastShortPulse = 0;
  
  unsigned long currentTime = millis();
  
  // 🔄 Обнаружение изменения состояния
  if (rawMotion != lastState) {
    unsigned long stateDuration = currentTime - stateChangeTime;
    
    // 🔍 Анализ предыдущего состояния
    if (lastState == true) {
      // Завершилось движение
      if (stateDuration < settings.minMotionDuration) {
        // 📊 Слишком короткое движение - возможно помеха
        shortPulseCount++;
        lastShortPulse = currentTime;
        
        Serial.printf("⚠️ Короткий импульс: %lu мс (помеха?)\n", stateDuration);
        
        // 🚨 Много коротких импульсов = проблема
        if (shortPulseCount > settings.falseAlarmThreshold && 
            (currentTime - lastShortPulse) < 10000) {
          Serial.println("🚨 Обнаружены помехи! Увеличиваю фильтрацию");
          settings.minMotionDuration += 50;  // Увеличиваем порог
        }
      }
    }
    
    stateChangeTime = currentTime;
    lastState = rawMotion;
  }
  
  // 🎯 Сброс счетчика коротких импульсов
  if (currentTime - lastShortPulse > 60000) {  // Через минуту
    shortPulseCount = 0;
  }
  
  return rawMotion;
}

// 🤖 Функция машинного обучения паттернов
void learnMotionPatterns() {
  static unsigned long learningStart = 0;
  static int normalMotions = 0;
  static int falseAlarms = 0;
  
  if (learningStart == 0) {
    learningStart = millis();
    Serial.println("🎓 Начинаю обучение распознаванию движений...");
  }
  
  unsigned long learningElapsed = millis() - learningStart;
  
  if (learningElapsed < settings.learningTime) {
    // 📚 Период обучения - собираем статистику
    // (в реальности здесь был бы более сложный алгоритм)
    
    if (learningElapsed % 60000 == 0) {  // Каждую минуту
      int progress = (learningElapsed * 100) / settings.learningTime;
      Serial.printf("🎓 Обучение: %d%% | Движений: %d | Помех: %d\n",
                    progress, normalMotions, falseAlarms);
    }
  } else {
    // ✅ Обучение завершено
    settings.adaptiveMode = false;
    
    float accuracy = (float)normalMotions / (normalMotions + falseAlarms) * 100;
    Serial.printf("🎯 Обучение завершено! Точность: %.1f%%\n", accuracy);
    
    // 🔧 Оптимизируем настройки на основе обучения
    if (accuracy < 90) {
      settings.minMotionDuration += 100;
      Serial.println("🔧 Увеличил фильтрацию для повышения точности");
    }
  }
}

// 📊 Функция анализа качества сигнала
void analyzeSignalQuality() {
  static int signalChanges = 0;
  static unsigned long analysisStart = millis();
  static bool lastSignal = false;
  
  bool currentSignal = digitalRead(PIR_PIN);
  
  if (currentSignal != lastSignal) {
    signalChanges++;
    lastSignal = currentSignal;
  }
  
  // 📈 Анализируем каждые 30 секунд
  if (millis() - analysisStart >= 30000) {
    float changesPerSecond = (float)signalChanges / 30.0;
    
    Serial.printf("📊 Качество сигнала: %.1f изм/сек", changesPerSecond);
    
    if (changesPerSecond > 2.0) {
      Serial.println(" (ШУМНЫЙ - возможны помехи)");
    } else if (changesPerSecond > 0.5) {
      Serial.println(" (АКТИВНЫЙ - норма)");
    } else {
      Serial.println(" (СТАБИЛЬНЫЙ - отлично)");
    }
    
    // 🔄 Сброс для следующего периода
    signalChanges = 0;
    analysisStart = millis();
  }
}

Блок 3: “Создание охранных и автоматических систем” (16 минут)

🛡️ “Система безопасности с PIR датчиком”

Полноценная охранная система:

// 🛡️ ОХРАННАЯ СИСТЕМА "УМНЫЙ СТРАЖ" v3.0

// 🎯 Режимы работы системы
enum SecurityMode {
  MODE_DISARMED,    // Выключена
  MODE_HOME,        // Домашний режим
  MODE_AWAY,        // Режим отсутствия
  MODE_NIGHT,       // Ночной режим
  MODE_ALARM        // Тревога
};

// 📊 Структура состояния системы
struct SecuritySystem {
  SecurityMode currentMode;
  bool armed;
  unsigned long armTime;
  unsigned long lastMotion;
  int alarmLevel;        // 0-5 уровень тревоги
  bool sirenActive;
  int motionZones[4];    // 4 зоны контроля
  String lastAlarmReason;
};

SecuritySystem security = {MODE_DISARMED, false, 0, 0, 0, false, {0}, ""};

// ⏰ Временные настройки
const unsigned long ARM_DELAY = 30000;        // 30 сек на выход
const unsigned long ENTRY_DELAY = 15000;      // 15 сек на вход
const unsigned long ALARM_DURATION = 300000;  // 5 мин сирена
const unsigned long MOTION_MEMORY = 60000;    // 1 мин память движения

void securitySystemLoop() {
  // 📖 Читаем датчики
  bool motionDetected = readAllMotionSensors();
  
  // 🧠 Обрабатываем состояние системы
  processSecurityLogic(motionDetected);
  
  // 🚨 Управляем тревогой
  handleAlarmState();
  
  // 💡 Обновляем индикацию
  updateSecurityIndicators();
  
  // 📱 Отправляем уведомления
  sendSecurityNotifications();
}

// 📖 Функция чтения всех датчиков движения
bool readAllMotionSensors() {
  // В реальной системе здесь было бы несколько PIR датчиков
  bool motion = digitalRead(PIR_PIN);
  
  if (motion) {
    security.lastMotion = millis();
    
    // 📍 Определяем зону срабатывания (упрощенно)
    int zone = determineMotionZone();
    security.motionZones[zone]++;
    
    Serial.printf("🚶 Движение в зоне %d (всего: %d)\n", 
                  zone + 1, security.motionZones[zone]);
  }
  
  return motion;
}

// 📍 Функция определения зоны движения
int determineMotionZone() {
  // Упрощенная логика - в реальности анализ нескольких датчиков
  unsigned long time = millis();
  return (time / 10000) % 4;  // Имитация разных зон
}

// 🧠 Основная логика системы безопасности
void processSecurityLogic(bool motionDetected) {
  unsigned long currentTime = millis();
  
  switch (security.currentMode) {
    case MODE_DISARMED:
      // 😴 Система выключена - только мониторинг
      if (motionDetected) {
        Serial.println("👁️ Движение зафиксировано (система выключена)");
      }
      break;
      
    case MODE_HOME:
      // 🏠 Домашний режим - контроль периметра
      if (motionDetected) {
        int zone = determineMotionZone();
        if (zone == 0) {  // Входная зона
          triggerAlarm("Движение во входной зоне (домашний режим)");
        } else {
          Serial.printf("🏠 Нормальное движение дома (зона %d)\n", zone + 1);
        }
      }
      break;
      
    case MODE_AWAY:
      // 🚶 Режим отсутствия - любое движение = тревога
      if (motionDetected) {
        if (currentTime - security.armTime > ARM_DELAY) {
          startEntryDelay("Движение при отсутствии");
        } else {
          Serial.println("⏰ Движение в период выхода (игнорируется)");
        }
      }
      break;
      
    case MODE_NIGHT:
      // 🌙 Ночной режим - контроль первого этажа
      if (motionDetected) {
        int zone = determineMotionZone();
        if (zone <= 1) {  // Первый этаж
          startEntryDelay("Движение на первом этаже ночью");
        }
      }
      break;
      
    case MODE_ALARM:
      // 🚨 Режим тревоги - продолжаем сирену
      handleActiveAlarm();
      break;
  }
}

// ⏰ Функция запуска задержки входа
void startEntryDelay(String reason) {
  static unsigned long entryDelayStart = 0;
  
  if (entryDelayStart == 0) {
    entryDelayStart = millis();
    security.lastAlarmReason = reason;
    
    Serial.printf("⏰ ЗАДЕРЖКА ВХОДА: %s\n", reason.c_str());
    Serial.printf("   У вас %d секунд для отключения\n", ENTRY_DELAY / 1000);
    
    // 🔊 Предупредительные сигналы
    for (int i = 0; i < 3; i++) {
      tone(BUZZER_PIN, 800, 200);
      delay(300);
    }
  }
  
  // ⏱️ Проверяем истечение времени
  if (millis() - entryDelayStart >= ENTRY_DELAY) {
    triggerAlarm(security.lastAlarmReason);
    entryDelayStart = 0;
  }
}

// 🚨 Функция активации тревоги
void triggerAlarm(String reason) {
  security.currentMode = MODE_ALARM;
  security.sirenActive = true;
  security.alarmLevel = 5;
  security.lastAlarmReason = reason;
  
  Serial.printf("🚨 ТРЕВОГА АКТИВИРОВАНА: %s\n", reason.c_str());
  Serial.println("📱 Отправляется уведомление владельцу");
  
  // 🔊 Включаем сирену
  startSiren();
  
  // 📸 Делаем "фото" (имитация)
  takeSecurityPhoto();
  
  // 📱 Отправляем уведомление
  sendAlarmNotification(reason);
}

// 📯 Функция управления сиреной
void startSiren() {
  // 🔊 Паттерн европейской сирены
  static unsigned long sirenStart = 0;
  static bool sirenPhase = false;
  
  if (sirenStart == 0) {
    sirenStart = millis();
  }
  
  if (security.sirenActive) {
    unsigned long elapsed = millis() - sirenStart;
    
    // 🔄 Меняем тон каждые 500мс
    if (elapsed % 1000 < 500) {
      tone(BUZZER_PIN, 800);  // Высокий тон
    } else {
      tone(BUZZER_PIN, 400);  // Низкий тон
    }
    
    // ⏰ Автоматическое отключение через 5 минут
    if (elapsed >= ALARM_DURATION) {
      stopSiren();
      Serial.println("⏰ Сирена автоматически отключена через 5 минут");
    }
  }
}

// 🔇 Функция остановки сирены
void stopSiren() {
  security.sirenActive = false;
  noTone(BUZZER_PIN);
  
  if (security.currentMode == MODE_ALARM) {
    Serial.println("🔇 Сирена остановлена");
  }
}

// 📸 Функция "фотографирования" нарушителя
void takeSecurityPhoto() {
  Serial.println("📸 Делаю фото нарушителя...");
  Serial.println("   [В реальной системе здесь подключение камеры]");
  Serial.println("   Фото сохранено: intruder_2025-05-27_15-46.jpg");
}

// 📱 Функция отправки уведомлений
void sendAlarmNotification(String reason) {
  Serial.println("📱 ОТПРАВКА УВЕДОМЛЕНИЯ:");
  Serial.printf("   Кому: Владелец дома (+7-XXX-XXX-XXXX)\n");
  Serial.printf("   Текст: ТРЕВОГА! %s\n", reason.c_str());
  Serial.printf("   Время: %s\n", getCurrentTime().c_str());
  Serial.printf("   Фото: attached\n");
  Serial.printf("   Управление: http://home-security.local/alarm\n");
}

// 🕐 Функция получения текущего времени
String getCurrentTime() {
  unsigned long uptime = millis() / 1000;
  int hours = (uptime / 3600) % 24;
  int minutes = (uptime / 60) % 60;
  int seconds = uptime % 60;
  
  char timeStr[20];
  sprintf(timeStr, "%02d:%02d:%02d", hours, minutes, seconds);
  return String(timeStr);
}

// 🎮 Функция управления системой
void handleSecurityCommands(String command) {
  if (command == "arm home") {
    armSystem(MODE_HOME);
  } else if (command == "arm away") {
    armSystem(MODE_AWAY);
  } else if (command == "arm night") {
    armSystem(MODE_NIGHT);
  } else if (command == "disarm") {
    disarmSystem();
  } else if (command == "panic") {
    triggerAlarm("Кнопка паники нажата");
  } else if (command == "test") {
    testAllSensors();
  } else if (command == "zones") {
    printZoneStatus();
  }
}

// 🛡️ Функция постановки на охрану
void armSystem(SecurityMode mode) {
  security.currentMode = mode;
  security.armed = true;
  security.armTime = millis();
  
  String modeNames[] = {"", "ДОМАШНИЙ", "ОТСУТСТВИЕ", "НОЧНОЙ", ""};
  Serial.printf("🛡️ Система поставлена на охрану: %s\n", 
                modeNames[mode].c_str());
  Serial.printf("⏰ Задержка выхода: %d секунд\n", ARM_DELAY / 1000);
  
  // 🔊 Подтверждающие сигналы
  for (int i = 0; i < mode; i++) {
    tone(BUZZER_PIN, 1000, 100);
    delay(200);
  }
}

// ✅ Функция снятия с охраны
void disarmSystem() {
  SecurityMode oldMode = security.currentMode;
  
  security.currentMode = MODE_DISARMED;
  security.armed = false;
  stopSiren();
  
  Serial.println("✅ Система снята с охраны");
  
  if (oldMode == MODE_ALARM) {
    Serial.println("🔇 Тревога отменена");
  }
  
  // 🔊 Подтверждение отключения
  tone(BUZZER_PIN, 400, 500);
}

// 🔧 Функция тестирования датчиков
void testAllSensors() {
  Serial.println("🔧 ТЕСТИРОВАНИЕ СИСТЕМЫ БЕЗОПАСНОСТИ:");
  
  // 🚶 Тест PIR датчика
  Serial.print("🚶 PIR датчик: ");
  bool motion = digitalRead(PIR_PIN);
  Serial.println(motion ? "✅ РАБОТАЕТ" : "❌ НЕТ ДВИЖЕНИЯ");
  
  // 🔊 Тест сирены
  Serial.println("🔊 Тест сирены...");
  tone(BUZZER_PIN, 1000, 1000);
  delay(1100);
  
  // 💡 Тест индикации
  Serial.println("💡 Тест светодиодов...");
  for (int i = 0; i < 3; i++) {
    digitalWrite(LED_PIN, HIGH);
    digitalWrite(EXTERNAL_LED_PIN, HIGH);
    delay(200);
    digitalWrite(LED_PIN, LOW);
    digitalWrite(EXTERNAL_LED_PIN, LOW);
    delay(200);
  }
  
  Serial.println("✅ Тестирование завершено");
}

// 📊 Функция вывода статуса зон
void printZoneStatus() {
  Serial.println("📊 СТАТУС ЗОН БЕЗОПАСНОСТИ:");
  
  String zoneNames[] = {"Входная группа", "Гостиная", "Кухня", "Коридор"};
  
  for (int i = 0; i < 4; i++) {
    Serial.printf("├ Зона %d (%s): %d срабатываний\n", 
                  i + 1, zoneNames[i].c_str(), security.motionZones[i]);
  }
  
  unsigned long timeSinceMotion = millis() - security.lastMotion;
  Serial.printf("└ Последнее движение: %lu сек назад\n", 
                timeSinceMotion / 1000);
}

💡 “Система умного освещения с PIR”

Автоматическое управление освещением:

// 💡 СИСТЕМА УМНОГО ОСВЕЩЕНИЯ "СВЕТОВОД"

// 🌟 Режимы освещения
enum LightMode {
  LIGHT_OFF,         // Выключено
  LIGHT_AUTO,        // Автоматический режим
  LIGHT_MANUAL,      // Ручное управление
  LIGHT_ECONOMY,     // Экономичный режим
  LIGHT_PARTY,       // Праздничный режим
  LIGHT_NIGHT        // Ночной режим
};

// 📊 Структура системы освещения
struct SmartLighting {
  LightMode currentMode;
  int brightness;              // 0-255
  bool motionActivated;        // Включено движением
  unsigned long lightOnTime;   // Время включения
  int autoOffDelay;           // Задержка автоотключения (сек)
  bool presenceDetected;       // Присутствие человека
  int lightSensorValue;        // Значение датчика света
};

SmartLighting lighting = {LIGHT_AUTO, 128, false, 0, 300, false, 0};

void smartLightingLoop() {
  // 📖 Читаем датчики
  bool motion = digitalRead(PIR_PIN);
  int lightLevel = analogRead(LIGHT_SENSOR_PIN);  // Если есть датчик света
  
  lighting.lightSensorValue = lightLevel;
  
  // 🧠 Определяем присутствие
  updatePresenceDetection(motion);
  
  // 💡 Управляем освещением
  controlAutoLighting();
  
  // 📊 Обновляем статистику
  updateLightingStats();
}

// 👁️ Функция определения присутствия
void updatePresenceDetection(bool motion) {
  static unsigned long lastMotionTime = 0;
  static int motionCount = 0;
  static unsigned long presenceStart = 0;
  
  if (motion) {
    lastMotionTime = millis();
    motionCount++;
    
    if (!lighting.presenceDetected) {
      lighting.presenceDetected = true;
      presenceStart = millis();
      Serial.println("👤 Присутствие ОБНАРУЖЕНО");
    }
  }
  
  // 📊 Анализ отсутствия движения
  unsigned long timeSinceMotion = millis() - lastMotionTime;
  
  if (lighting.presenceDetected && timeSinceMotion > lighting.autoOffDelay * 1000) {
    lighting.presenceDetected = false;
    unsigned long presenceDuration = (millis() - presenceStart) / 1000;
    
    Serial.printf("👻 Присутствие ЗАВЕРШЕНО (длительность: %lu сек)\n", 
                  presenceDuration);
    
    // 📊 Анализ поведения
    analyzeUserBehavior(presenceDuration, motionCount);
    motionCount = 0;
  }
}

// 💡 Функция автоматического управления освещением
void controlAutoLighting() {
  if (lighting.currentMode != LIGHT_AUTO) return;
  
  // 🌅 Определяем нужность освещения по датчику света
  bool needLight = lighting.lightSensorValue < 500;  // Темно
  
  // 🎯 Логика включения/выключения
  if (lighting.presenceDetected && needLight) {
    // 💡 Включаем свет
    if (!lighting.motionActivated) {
      turnOnLight();
    }
  } else {
    // 💤 Выключаем свет
    if (lighting.motionActivated) {
      turnOffLight();
    }
  }
  
  // 🌈 Адаптивная яркость
  adaptBrightness();
}

// 🔆 Функция включения освещения
void turnOnLight() {
  lighting.motionActivated = true;
  lighting.lightOnTime = millis();
  
  Serial.printf("💡 Свет ВКЛЮЧЕН (режим: %s)\n", getLightModeString().c_str());
  
  // 🌅 Плавное включение
  fadeLight(0, lighting.brightness, 1000);  // 1 секунда на включение
}

// 💤 Функция выключения освещения
void turnOffLight() {
  unsigned long onDuration = (millis() - lighting.lightOnTime) / 1000;
  
  Serial.printf("💤 Свет ВЫКЛЮЧЕН (горел %lu сек)\n", onDuration);
  
  // 🌇 Плавное выключение
  fadeLight(lighting.brightness, 0, 2000);  // 2 секунды на выключение
  
  lighting.motionActivated = false;
}

// 🌈 Функция плавного изменения яркости
void fadeLight(int fromBrightness, int toBrightness, int duration) {
  int steps = 50;
  int stepDelay = duration / steps;
  
  for (int i = 0; i <= steps; i++) {
    int currentBrightness = map(i, 0, steps, fromBrightness, toBrightness);
    analogWrite(EXTERNAL_LED_PIN, currentBrightness);
    delay(stepDelay);
  }
}

// 🎛️ Функция адаптивной яркости
void adaptBrightness() {
  if (!lighting.motionActivated) return;
  
  // 📊 Адаптация к уровню внешнего освещения
  int targetBrightness;
  
  if (lighting.lightSensorValue < 200) {
    targetBrightness = 255;  // Очень темно - максимум
  } else if (lighting.lightSensorValue < 400) {
    targetBrightness = 200;  // Темно - яркий свет
  } else if (lighting.lightSensorValue < 600) {
    targetBrightness = 150;  // Сумерки - средний свет
  } else {
    targetBrightness = 80;   // Светло - приглушенный
  }
  
  // 🌙 Ночной режим - снижаем яркость
  if (lighting.currentMode == LIGHT_NIGHT) {
    targetBrightness /= 3;
  }
  
  // 🔄 Плавная адаптация яркости
  if (abs(lighting.brightness - targetBrightness) > 10) {
    lighting.brightness = targetBrightness;
    analogWrite(EXTERNAL_LED_PIN, lighting.brightness);
    
    Serial.printf("🌈 Яркость адаптирована: %d (освещенность: %d)\n",
                  lighting.brightness, lighting.lightSensorValue);
  }
}

// 🧠 Функция анализа поведения пользователя
void analyzeUserBehavior(unsigned long duration, int motionCount) {
  float motionRate = (float)motionCount / (duration / 60.0);  // движений/мин
  
  Serial.printf("🧠 Анализ поведения: %.1f движений/мин", motionRate);
  
  if (motionRate > 5) {
    Serial.println(" (АКТИВНАЯ работа)");
    lighting.autoOffDelay = 600;  // 10 мин для активной работы
  } else if (motionRate > 2) {
    Serial.println(" (ОБЫЧНАЯ активность)");
    lighting.autoOffDelay = 300;  // 5 мин стандартно
  } else {
    Serial.println(" (НИЗКАЯ активность)");
    lighting.autoOffDelay = 120;  // 2 мин для низкой активности
  }
  
  Serial.printf("🕐 Новая задержка отключения: %d сек\n", lighting.autoOffDelay);
}

// 📊 Функция получения названия режима
String getLightModeString() {
  switch (lighting.currentMode) {
    case LIGHT_OFF: return "ВЫКЛ";
    case LIGHT_AUTO: return "АВТО";
    case LIGHT_MANUAL: return "РУЧНОЙ";
    case LIGHT_ECONOMY: return "ЭКОНОМ";
    case LIGHT_PARTY: return "ПРАЗДНИК";
    case LIGHT_NIGHT: return "НОЧЬ";
    default: return "НЕИЗВЕСТЕН";
  }
}

// 🎮 Функция управления режимами освещения
void handleLightCommands(String command) {
  if (command == "light auto") {
    lighting.currentMode = LIGHT_AUTO;
    Serial.println("💡 Режим: АВТОМАТИЧЕСКИЙ");
  } else if (command == "light manual") {
    lighting.currentMode = LIGHT_MANUAL;
    Serial.println("💡 Режим: РУЧНОЙ");
  } else if (command == "light night") {
    lighting.currentMode = LIGHT_NIGHT;
    Serial.println("💡 Режим: НОЧНОЙ");
  } else if (command == "light on") {
    lighting.currentMode = LIGHT_MANUAL;
    turnOnLight();
  } else if (command == "light off") {
    turnOffLight();
  } else if (command.startsWith("brightness ")) {
    int newBrightness = command.substring(11).toInt();
    setBrightness(newBrightness);
  }
}

// 🔆 Функция установки яркости
void setBrightness(int brightness) {
  lighting.brightness = constrain(brightness, 0, 255);
  
  if (lighting.motionActivated) {
    analogWrite(EXTERNAL_LED_PIN, lighting.brightness);
  }
  
  Serial.printf("🔆 Яркость установлена: %d/255\n", lighting.brightness);
}

Блок 4: “Интеграция с IoT системой школы” (10 минут)

📡 “Отправка данных о движении на сервер”

Мониторинг активности в классе:


### **Блок 4: "Интеграция с IoT системой школы" (10 минут)**

#### **📡 "Отправка данных о движении на сервер"**

**Мониторинг активности в классе:**

Данные о движении, собираемые PIR датчиками, представляют огромную ценность для анализа образовательного процесса. Система отправляет на школьный сервер информацию о:

- **Паттернах активности учеников** - когда класс наиболее и наименее активен
- **Эффективности уроков** - корреляция между движением и вовлеченностью
- **Оптимизации расписания** - определение лучшего времени для разных типов занятий
- **Безопасности** - контроль присутствия и несанкционированного доступа
- **Энергосбережении** - статистика работы автоматического освещения

**Собираемые метрики:**
- Количество движений за урок/день
- Периоды высокой и низкой активности
- Время присутствия каждого ученика
- Эффективность систем автоматизации
- Статистика ложных срабатываний

#### **🖥️ "Веб-дашборд школьной администрации"**

**Административная панель для директора и завучей:**

Школьная IoT платформа предоставляет руководству детальную аналитику по всем классам:

**Панель "Активность по классам":**
- Сравнение активности разных классов в реальном времени
- Графики вовлеченности учеников по времени суток
- Статистика посещаемости на основе датчиков движения
- Анализ эффективности различных форм обучения

**Панель "Безопасность школы":**
- Мониторинг всех помещений в режиме реального времени
- Система оповещений о несанкционированном доступе
- Контроль работы систем автоматического освещения
- Статистика энергопотребления по зданию

**Педагогическая аналитика:**
- Определение оптимального времени для проведения контрольных работ
- Анализ влияния физической активности на успеваемость
- Рекомендации по организации перемен и физкультминуток
- Мониторинг соблюдения санитарно-гигиенических норм

#### **📊 "Большие данные образования"**

**Применение данных PIR в образовательной аналитике:**

Собранные данные используются для:

**Исследований в области педагогики:**
- Изучение биоритмов учащихся и их влияния на обучение
- Анализ эффективности различных методов преподавания
- Исследование влияния физической среды на образовательный процесс

**Оптимизации учебного процесса:**
- Автоматическое формирование расписания с учетом активности классов
- Рекомендации по продолжительности уроков для разных возрастов
- Планирование ремонтов и модернизации аудиторий

**Здоровьесбережения:**
- Контроль соблюдения норм двигательной активности
- Автоматические напоминания о необходимости проветривания
- Мониторинг эргономики учебного пространства

#### **🌐 "Интеграция с городской системой 'Умный город'"**

**Школа как часть цифровой экосистемы:**

Данные школьных PIR датчиков интегрируются с городскими системами:

- **Транспортная система** - прогнозирование загрузки общественного транспорта
- **Энергосети** - оптимизация электроснабжения образовательных учреждений  
- **Система безопасности** - координация с районными службами охраны
- **Экологический мониторинг** - анализ влияния школьной активности на окружающую среду

## 🎨 Творческое задание: "Умная система безопасности и комфорта" (12 минут)

### **🛡️ "Создание интеллектуальной системы контроля класса"**

**Техническое задание для команд:**

Команды получают задание создать комплексную систему, которая не просто реагирует на движение, но анализирует поведение и адаптируется к потребностям класса.

**Базовый функционал:**
- Детекция движения с возможностью различения типов активности
- Автоматическое управление освещением с учетом времени суток
- Система безопасности с градацией уровней тревоги
- Сбор и анализ статистики для оптимизации учебного процесса

**Инновационные возможности:**
- ИИ-анализ поведенческих паттернов учеников
- Интеграция с другими системами умного дома
- Предиктивная аналитика для предотвращения проблем
- Адаптивное обучение алгоритмов под конкретный класс

### **🎪 "Выставка умных решений"**

**Демонстрация проектов:**

Каждая команда представляет свою систему, демонстрируя:

**Техническое совершенство:**
- Надежность работы в различных условиях
- Скорость реакции и точность детекции
- Энергоэффективность решения
- Масштабируемость для всей школы

**Практическую применимость:**
- Решение реальных проблем класса
- Удобство использования для учителей
- Безопасность и конфиденциальность данных
- Экономическую целесообразность внедрения

**Инновационность:**
- Оригинальность технических решений
- Креативность в применении PIR технологий
- Интеграция с современными трендами IoT
- Потенциал для дальнейшего развития

## 📝 Рефлексия и закрепление (5 минут)

### **🚶 "Викторина движения и безопасности"**

**Интерактивное закрепление знаний:**

Ученики демонстрируют понимание материала через практические действия:

**Физические демонстрации:**
- Показывают оптимальные траектории движения для PIR датчика
- Демонстрируют зоны максимальной и минимальной чувствительности
- Объясняют принципы работы через движение и жесты

**Анализ ситуаций:**
- Обсуждают этические аспекты мониторинга движения
- Предлагают решения для повышения конфиденциальности
- Анализируют баланс между безопасностью и приватностью

### **💭 "Размышления о безопасности"**

**Философские аспекты темы:**

Ученики размышляют о роли технологий в современном мире:

- "PIR датчики изменили мое понимание безопасности, потому что..."
- "Самое важное в системах автоматизации это..."
- "В будущем я бы применил эти технологии для..."
- "Баланс между удобством и приватностью должен быть..."

## 🏠 Домашнее задание

### **🚶 "Домашний исследователь движения"**

**Практические исследования:**

**1. Наблюдение и анализ:**
- Изучить системы безопасности в своем доме/подъезде
- Найти PIR датчики в общественных местах (магазины, офисы)
- Проанализировать эффективность автоматического освещения

**2. Эксперименты с системой:**
- Протестировать PIR датчик в различных условиях дома
- Измерить влияние температуры на чувствительность
- Найти оптимальное размещение для домашнего использования

**3. Творческое применение:**
- Придумать новые способы использования PIR датчиков
- Спроектировать систему безопасности для своей комнаты
- Создать план "умного дома" с автоматизацией

### **📔 "Дневник инженера безопасности"**

📔 МОЙ ДНЕВНИК ИНЖЕНЕРА БЕЗОПАСНОСТИ - УРОК 15

🚶 ГЛАВНЫЕ ОТКРЫТИЯ:

  • PIR датчик работает на основе: _______________
  • Лучше всего обнаруживает движение: __________
  • Мертвые зоны находятся: ___________________
  • Время стабилизации нужно потому что: _______

🛡️ МОЯ СИСТЕМА БЕЗОПАСНОСТИ: Дальность обнаружения: _____ метров Время задержки выключения: _____ секунд Количество режимов охраны: _____ штук Самая полезная функция: ____________________

🏠 ДОМАШНИЕ НАБЛЮДЕНИЯ: PIR датчики которые я нашел:




Автоматическое освещение работает:

  • В подъезде: ХОРОШО/ПЛОХО/НЕТ
  • В магазине: ХОРОШО/ПЛОХО/НЕТ
  • В офисе: ХОРОШО/ПЛОХО/НЕТ

💻 ПРОГРАММНЫЕ ДОСТИЖЕНИЯ: Сложность моих алгоритмов: ⭐⭐⭐⭐⭐ Самая трудная функция: _____________________ Что я улучшил в коде: ______________________

🔮 БУДУЩИЕ ПЛАНЫ: Где я применю PIR датчики:




Какую проблему хочу решить: _________________ Мое изобретение с PIR: _____________________


### **🔬 Исследовательское задание (для увлеченных):**
- Изучить другие типы датчиков движения (ультразвуковые, микроволновые)
- Найти информацию о системах компьютерного зрения
- Исследовать применение PIR в автомобильной промышленности

### **🎨 Творческое задание:**
- Нарисовать план "умной школы" с датчиками движения
- Создать комикс "День из жизни PIR датчика"

## 📊 Критерии оценивания

### **"Отлично" (5):**
- Глубоко понимает принципы работы PIR датчиков и инфракрасного излучения
- Создает многофункциональную систему безопасности с несколькими режимами
- Программирует адаптивные алгоритмы анализа движения
- Реализует инновационные функции интеграции с IoT
- Демонстрирует понимание этических аспектов мониторинга
- Создает практически применимое решение

### **"Хорошо" (4):**
- Понимает основы работы PIR датчиков
- Создает функциональную систему автоматического освещения и охраны
- Программирует базовые алгоритмы детекции движения
- Выполняет настройку и калибровку системы
- Интегрирует систему с внешними сервисами

### **"Удовлетворительно" (3):**
- Имеет общее представление о датчиках движения
- С помощью создает простую систему реакции на движение
- Понимает базовые принципы систем безопасности
- Участвует в групповой работе над проектом

## 🛠️ Материалы и оборудование

### **Для каждой команды (3-4 человека):**
- ESP32 DevKit плата
- PIR датчик движения HC-SR501  
- Светодиоды (белый, красный, зеленый)
- Резисторы 220 Ом (3 шт)
- Пьезобузер для звуковых сигналов
- Макетная плата и провода
- Мультиметр для диагностики

### **Для демонстраций учителем:**
- Инфракрасная камера (или тепловизор) для демонстрации ИК-излучения
- Различные источники тепла для экспериментов
- Препятствия разных материалов для тестирования проникновения ИК
- Профессиональный PIR датчик для сравнения характеристик

### **Программное обеспечение:**
- Arduino IDE с библиотеками для работы с таймерами
- Serial Plotter для визуализации активности датчика
- Веб-интерфейс школьного IoT сервера
- Приложения для анализа данных движения

### **Дополнительные компоненты (для продвинутых проектов):**
- Несколько PIR датчиков для многозонной системы
- Реле для управления мощным освещением
- LCD дисплей для отображения статуса системы
- SD карта для локального хранения логов
- Камера модуль для фото при тревоге
- Датчик освещенности для адаптивного управления

## 🔍 Методические заметки для учителя

### **Подготовка к уроку:**
1. **Стабилизация датчиков:** За час до урока включить все PIR датчики для прогрева
2. **Зонирование класса:** Разметить зоны для тестирования дальности обнаружения
3. **Демонстрационные материалы:** Подготовить источники тепла и препятствия
4. **Безопасность:** Проверить отсутствие острых углов и надежность креплений

### **Возможные сложности:**

**Проблема:** PIR датчик не стабилизируется или дает ложные срабатывания
**Решение:** Обеспечить 60+ секунд на стабилизацию, экранировать от сквозняков и ИК-источников

**Проблема:** Учащиеся не понимают принцип работы инфракрасного излучения
**Решение:** Больше наглядных демонстраций с тепловизором, аналогии с живой природой

**Проблема:** Этические вопросы о приватности и слежке
**Решение:** Обязательно обсудить границы применения, получение согласия, анонимизацию данных

### **Безопасность:**
- Использование только безопасных источников тепла для демонстраций
- Контроль правильности подключения 5V питания PIR датчиков
- Обсуждение этических аспектов использования систем мониторинга
- Информирование о том, что данные используются только в образовательных целях

### **Дифференциация обучения:**
- **Для продвинутых:** изучение профессиональных охранных систем, машинное обучение для анализа паттернов
- **Для начинающих:** готовые алгоритмы, простые схемы подключения
- **Для визуалов:** тепловизионные изображения, схемы зон обнаружения
- **Для кинестетиков:** больше движения для тестирования датчиков

### **Связь с реальным миром:**
- Системы безопасности в банках, музеях, частных домах
- Автоматическое освещение в общественных зданиях
- Системы подсчета посетителей в торговых центрах
- Умные города и IoT инфраструктура

### **Межпредметные связи:**
- **Физика:** инфракрасное излучение, тепло, оптика
- **Биология:** терморегуляция живых организмов, органы чувств змей
- **ОБЖ:** системы безопасности, охрана жилища
- **Обществознание:** приватность, этика слежения, права человека

### **Развитие проекта:**
- Интеграция с камерами для распознавания лиц
- Машинное обучение для классификации типов движения
- Создание мобильного приложения для управления
- Интеграция с голосовыми ассистентами