Skip to main content

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1🌙 УМНЫЙ ДОМ НОЧЬЮ:
2- Входите в коридор → Автоматически включается приглушенный свет
3- Идете в ванную → Освещение следует за вами
4- Покидаете комнату → Через 2 минуты все выключается
5
6🛡️ СИСТЕМА БЕЗОПАСНОСТИ:
7- Движение ночью → Сигнал тревоги + фото на телефон
8- Долгое отсутствие движения → "Режим охраны" активирован
9- Обнаружен злоумышленник → Сирена + уведомление владельцу

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

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

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

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

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

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

 1🌈 СПЕКТР ЭЛЕКТРОМАГНИТНОГО ИЗЛУЧЕНИЯ:
 2
 3Видимый свет: 380-780 нм (то что видят наши глаза)
 4Ближний ИК: 780нм-1.4мкм (пульты ДУ, оптоволокно)  
 5Средний ИК: 1.4-8мкм (ТЕПЛОВОЕ излучение человека!)
 6Дальний ИК: 8-15мкм (тепловизоры, астрономия)
 7
 8🔥 ТЕПЛОВОЕ ИЗЛУЧЕНИЕ ЧЕЛОВЕКА:
 9- Температура тела: 36.6°C = 309.6K
10- Пик излучения: 9.3 мкм (средний ИК)
11- Мощность: ~100 Вт тепла с поверхности тела
12- Видимость: В полной темноте для ИК-камеры!
13
14❄️ ОКРУЖАЮЩИЕ ОБЪЕКТЫ:
15- Комнатная температура: 20°C = 293K  
16- Пик излучения: 9.9 мкм
17- Контраст: 6.6°C разности = четкое обнаружение!

🔍 “PIR - Passive Infrared sensor”

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

 1🔬 АНАТОМИЯ PIR ДАТЧИКА:
 2
 31️⃣ ПИРОЭЛЕКТРИЧЕСКИЙ ЭЛЕМЕНТ:
 4- Материал: Танталат лития (LiTaO3)
 5- Принцип: Изменение поляризации при нагреве
 6- Структура: ДВА элемента рядом (дифференциальная схема)
 7- Чувствительность: Изменения температуры 0.1°C
 8
 92️⃣ ЛИНЗА ФРЕНЕЛЯ:
10- Материал: Полиэтилен (прозрачен для ИК)
11- Функция: Фокусировка ИК-лучей на сенсор
12- Зоны: 20-60 фокусных сегментов
13- Угол обзора: 90-120 градусов
14
153️⃣ ЭЛЕКТРОННАЯ ОБРАБОТКА:
16- Усилитель: Увеличивает слабый сигнал в 1000+ раз
17- Компаратор: Превращает аналоговый сигнал в цифровой
18- Таймер: Устанавливает длительность выходного сигнала
19- Фильтр: Убирает помехи и ложные срабатывания
20
21🎯 ПРИНЦИП РАБОТЫ:
221. ИК-излучение от человека попадает на ОДИН из двух элементов
232. Возникает РАЗНОСТЬ сигналов между элементами  
243. Разность усиливается и сравнивается с порогом
254. При превышении порога → Выход становится HIGH
265. Таймер удерживает HIGH заданное время

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

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

 1🎯 ЗОНЫ ОБНАРУЖЕНИЯ PIR:
 2
 3АКТИВНЫЕ ЗОНЫ (высокая чувствительность):
 4┌─────────────────────────┐
 5│  \     /\     /\     /  │ ← Лучи линзы Френеля
 6│   \   /  \   /  \   /   │
 7│    \ /    \ /    \ /    │
 8│     X      X      X     │ ← Фокальные точки
 9│      \    /|\    /      │
10│       \  / | \  /       │
11│        \/  |  \/        │
12│           PIR            │
13└─────────────────────────┘
14
15МЕРТВЫЕ ЗОНЫ (слабая чувствительность):
16- Прямо перед датчиком (слишком близко)
17- Между активными лучами
18- Сбоку от датчика (вне угла обзора)
19- За препятствиями (стены, мебель)
20
21🚶 ОПТИМАЛЬНОЕ ДВИЖЕНИЕ:
22✅ Поперек лучей (слева направо)
23✅ На расстоянии 2-7 метров
24✅ Средняя скорость (1-2 м/с)
25
26❌ ПЛОХОЕ ОБНАРУЖЕНИЕ:
27- Движение прямо на датчик/от датчика
28- Очень медленное движение (<0.3 м/с)
29- Очень быстрое движение (>5 м/с)
30- В жаркую погоду (малый контраст)

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

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

 1🔬 ЛАБОРАТОРИЯ ДЕТЕКЦИИ ДВИЖЕНИЯ:
 2
 3Эксперимент 1: Зависимость от расстояния
 4Методика: Движение на разных расстояниях от датчика
 5
 6📊 ТАБЛИЦА ДАЛЬНОСТИ:
 7┌─────────────┬──────────────┬─────────────┬──────────────┐
 8│ Расстояние  │ Обнаружение  │ Время реакции│ Надежность  │
 9├─────────────┼──────────────┼─────────────┼──────────────┤
10│ 0.5 м       │ ДА/НЕТ       │ _____ мс    │ ____/10      │
11│ 1 м         │ ДА/НЕТ       │ _____ мс    │ ____/10      │
12│ 2 м         │ ДА/НЕТ       │ _____ мс    │ ____/10      │
13│ 3 м         │ ДА/НЕТ       │ _____ мс    │ ____/10      │
14│ 5 м         │ ДА/НЕТ       │ _____ мс    │ ____/10      │
15│ 7 м         │ ДА/НЕТ       │ _____ мс    │ ____/10      │
16└─────────────┴──────────────┴─────────────┴──────────────┘
17
18Эксперимент 2: Направление движения
19- Слева направо: Обнаружен на расстоянии _____ м
20- Справа налево: Обнаружен на расстоянии _____ м  
21- На датчик: Обнаружен на расстоянии _____ м
22- От датчика: Обнаружен на расстоянии _____ м
23- Вывод: Лучшее направление _____________
24
25Эксперимент 3: Влияние препятствий  
26- Прозрачное стекло: БЛОКИРУЕТ/ПРОПУСКАЕТ
27- Тонкая ткань: БЛОКИРУЕТ/ПРОПУСКАЕТ
28- Лист бумаги: БЛОКИРУЕТ/ПРОПУСКАЕТ
29- Пластиковая бутылка: БЛОКИРУЕТ/ПРОПУСКАЕТ
30- Вывод: ИК-излучение проходит через ___________
31
32Эксперимент 4: Ложные срабатывания
33□ Включение лампы накаливания
34□ Горячий чай рядом с датчиком
35□ Фен или обогреватель  
36□ Домашнее животное (кот/собака)
37□ Развевающиеся шторы
38□ Автомобиль за окном

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

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

 1🎛️ ОРГАНЫ УПРАВЛЕНИЯ HC-SR501:
 2
 31️⃣ ПОТЕНЦИОМЕТР ЧУВСТВИТЕЛЬНОСТИ (Sx):
 4Положение: Левый потенциометр
 5Диапазон: 3-7 метров  
 6Поворот по часовой: УВЕЛИЧИТЬ дальность
 7Поворот против часовой: УМЕНЬШИТЬ дальность
 8Рекомендация: Для класса - средняя позиция
 9
102️⃣ ПОТЕНЦИОМЕТР ВРЕМЕНИ (Tx):
11Положение: Правый потенциометр
12Диапазон: 0.3 - 300 секунд
13Поворот по часовой: УВЕЛИЧИТЬ время удержания
14Поворот против часовой: УМЕНЬШИТЬ время
15Рекомендация: Для тестов - минимум (0.3 сек)
16
173️⃣ ПЕРЕМЫЧКА РЕЖИМА РАБОТЫ:
18Позиция H: Режим "Повтора" (retriggering)
19- При новом движении время сбрасывается
20- Подходит для освещения
21
22Позиция L: Режим "Однократного срабатывания"  
23- Игнорирует движение пока идет отсчет
24- Подходит для охранных систем
25
26🔧 РЕКОМЕНДУЕМЫЕ НАСТРОЙКИ:
27Для обучения: Sx = мин, Tx = мин, Jumper = L
28Для освещения: Sx = сред, Tx = 30сек, Jumper = H  
29Для охраны: Sx = макс, Tx = макс, Jumper = L

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

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

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

 1🛠️ СХЕМА ПОДКЛЮЧЕНИЯ PIR ДАТЧИКА:
 2
 3       ESP32                    HC-SR501
 4    ┌─────────┐              ┌─────────────┐
 5    │   5V    │──────────────│ VCC (красный)│
 6    │ GPIO 13 │──────────────│ OUT (желтый) │
 7    │   GND   │──────────────│ GND (черный) │
 8    └─────────┘              └─────────────┘
 9                              │ [Sx] [Tx]  │ ← Потенциометры
10                              │    [H/L]   │ ← Перемычка
11                              └─────────────┘
12
13⚠️ ВАЖНЫЕ МОМЕНТЫ:
141. PIR требует 5V питания (не 3.3V!)
152. Выходной сигнал 3.3V - безопасен для ESP32
163. После включения нужно 60 секунд на стабилизацию
174. Не касаться руками линзы датчика
185. Устанавливать вертикально для лучшей работы
19
20🔧 ДОПОЛНИТЕЛЬНЫЕ КОМПОНЕНТЫ:
21- Светодиод + резистор 220Ом (индикация движения)
22- Buzzer (звуковая сигнализация)  
23- Реле (управление мощными нагрузками)
24- LCD дисплей (отображение статуса)

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

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

  1// 🚶 ПРОГРАММА ДАТЧИКА ДВИЖЕНИЯ PIR
  2// Урок 15: Обнаружение движения и создание охранных систем
  3
  4// 🔧 Настройки пинов
  5const int PIR_PIN = 13;              // Пин подключения PIR датчика
  6const int LED_PIN = 2;               // Встроенный светодиод
  7const int EXTERNAL_LED_PIN = 5;      // Внешний светодиод
  8const int BUZZER_PIN = 4;            // Пищалка (опционально)
  9
 10// 📊 Параметры детекции
 11const unsigned long STABILIZATION_TIME = 60000;  // 60 сек стабилизации
 12const unsigned long MOTION_TIMEOUT = 5000;       // 5 сек без движения = "покой"
 13const int MOTION_COUNTER_THRESHOLD = 3;          // Мин. количество срабатываний
 14
 15// 📈 Переменные состояния
 16bool motionDetected = false;          // Текущее состояние движения
 17bool systemArmed = false;             // Система активирована
 18unsigned long lastMotionTime = 0;    // Время последнего движения
 19unsigned long systemStartTime = 0;   // Время запуска системы
 20int motionCounter = 0;                // Счетчик движений
 21int totalMotions = 0;                 // Общее количество движений
 22
 23// 🕐 Временные метки для анализа
 24unsigned long motionTimes[10];        // История последних движений
 25int motionIndex = 0;                  // Индекс в массиве истории
 26
 27void setup() {
 28  Serial.begin(9600);
 29  Serial.println("🚶 Система детекции движения PIR v2.0");
 30  
 31  // 🔧 Настройка пинов
 32  pinMode(PIR_PIN, INPUT);
 33  pinMode(LED_PIN, OUTPUT);
 34  pinMode(EXTERNAL_LED_PIN, OUTPUT);
 35  pinMode(BUZZER_PIN, OUTPUT);
 36  
 37  systemStartTime = millis();
 38  
 39  Serial.println("⏳ Ожидание стабилизации PIR датчика...");
 40  Serial.println("   (НЕ ДВИГАЙТЕСЬ 60 секунд!)");
 41  
 42  // 🎯 Период стабилизации с индикацией
 43  stabilizationPeriod();
 44  
 45  Serial.println("✅ PIR датчик готов к работе!");
 46  Serial.println("📊 Формат: Движение | Счетчик | Время | Статус");
 47  Serial.println("─────────────────────────────────────────────────");
 48}
 49
 50void loop() {
 51  // 📖 Читаем состояние PIR датчика
 52  bool currentMotion = digitalRead(PIR_PIN);
 53  
 54  // 🔍 Обрабатываем изменения состояния
 55  if (currentMotion != motionDetected) {
 56    handleMotionChange(currentMotion);
 57  }
 58  
 59  // ⏰ Проверяем таймаут отсутствия движения
 60  checkMotionTimeout();
 61  
 62  // 💡 Обновляем индикацию
 63  updateIndicators();
 64  
 65  // 📊 Анализируем паттерны движения
 66  analyzeMotionPatterns();
 67  
 68  // 🎮 Обрабатываем команды пользователя
 69  handleSerialCommands();
 70  
 71  delay(100);  // Опрос 10 раз в секунду
 72}
 73
 74// ⏳ Функция стабилизации PIR датчика
 75void stabilizationPeriod() {
 76  unsigned long startTime = millis();
 77  
 78  while (millis() - startTime < STABILIZATION_TIME) {
 79    unsigned long elapsed = millis() - startTime;
 80    int progress = (elapsed * 100) / STABILIZATION_TIME;
 81    
 82    // 📈 Показываем прогресс каждые 10 секунд
 83    if (elapsed % 10000 == 0 && elapsed > 0) {
 84      Serial.printf("⏳ Стабилизация: %d%% (%lu сек)\n", 
 85                    progress, elapsed / 1000);
 86    }
 87    
 88    // 💡 Мигание светодиода во время стабилизации
 89    bool blinkState = (millis() / 500) % 2;
 90    digitalWrite(LED_PIN, blinkState);
 91    
 92    delay(100);
 93  }
 94  
 95  digitalWrite(LED_PIN, LOW);
 96}
 97
 98// 🔄 Функция обработки изменения состояния движения
 99void handleMotionChange(bool newState) {
100  motionDetected = newState;
101  unsigned long currentTime = millis();
102  
103  if (newState) {
104    // 🚶 ДВИЖЕНИЕ ОБНАРУЖЕНО
105    lastMotionTime = currentTime;
106    motionCounter++;
107    totalMotions++;
108    
109    // 📝 Записываем время в историю
110    motionTimes[motionIndex] = currentTime;
111    motionIndex = (motionIndex + 1) % 10;
112    
113    Serial.printf("🚶 ДВИЖЕНИЕ! Счетчик: %d | Общий: %d | Время: %lu\n",
114                  motionCounter, totalMotions, currentTime / 1000);
115    
116    // 🎯 Реакция на движение
117    onMotionDetected();
118    
119  } else {
120    // 🛑 ДВИЖЕНИЕ ПРЕКРАТИЛОСЬ
121    Serial.printf("🛑 Движение прекратилось | Длительность: %lu мс\n",
122                  currentTime - lastMotionTime);
123  }
124}
125
126// 🎯 Функция реакции на обнаруженное движение
127void onMotionDetected() {
128  // 💡 Включаем освещение
129  digitalWrite(EXTERNAL_LED_PIN, HIGH);
130  
131  // 🔊 Звуковой сигнал при активированной системе
132  if (systemArmed) {
133    tone(BUZZER_PIN, 1000, 200);  // 200мс сигнал 1кГц
134    Serial.println("🚨 ТРЕВОГА! Движение при активированной охране!");
135  }
136  
137  // 📊 Анализ активности
138  analyzeActivity();
139}
140
141// ⏰ Функция проверки таймаута движения
142void checkMotionTimeout() {
143  if (motionDetected && (millis() - lastMotionTime > MOTION_TIMEOUT)) {
144    Serial.printf("😴 Период покоя начался (>%d сек без движения)\n", 
145                  MOTION_TIMEOUT / 1000);
146    
147    // 🔄 Сбрасываем счетчик движений
148    motionCounter = 0;
149    
150    // 💡 Выключаем освещение
151    digitalWrite(EXTERNAL_LED_PIN, LOW);
152  }
153}
154
155// 💡 Функция обновления индикаторов
156void updateIndicators() {
157  // 🔴 Встроенный светодиод = текущее движение
158  digitalWrite(LED_PIN, motionDetected);
159  
160  // 🟢 Внешний светодиод = недавняя активность
161  bool recentActivity = (millis() - lastMotionTime) < MOTION_TIMEOUT;
162  digitalWrite(EXTERNAL_LED_PIN, recentActivity);
163}
164
165// 📊 Функция анализа паттернов движения
166void analyzeMotionPatterns() {
167  static unsigned long lastAnalysis = 0;
168  
169  // 📈 Анализируем каждые 30 секунд
170  if (millis() - lastAnalysis >= 30000) {
171    lastAnalysis = millis();
172    
173    // 🔍 Анализируем историю движений
174    int recentMotions = countRecentMotions(30000);  // За последние 30 сек
175    
176    Serial.printf("📊 Анализ активности: %d движений за 30 сек\n", recentMotions);
177    
178    // 🎯 Классификация активности
179    if (recentMotions == 0) {
180      Serial.println("😴 Статус: ПОКОЙ");
181    } else if (recentMotions <= 2) {
182      Serial.println("🚶 Статус: НИЗКАЯ АКТИВНОСТЬ");
183    } else if (recentMotions <= 5) {
184      Serial.println("🏃 Статус: СРЕДНЯЯ АКТИВНОСТЬ");
185    } else {
186      Serial.println("💃 Статус: ВЫСОКАЯ АКТИВНОСТЬ");
187    }
188  }
189}
190
191// 📈 Функция подсчета недавних движений
192int countRecentMotions(unsigned long timeWindow) {
193  unsigned long currentTime = millis();
194  int count = 0;
195  
196  for (int i = 0; i < 10; i++) {
197    if (motionTimes[i] != 0 && 
198        (currentTime - motionTimes[i]) <= timeWindow) {
199      count++;
200    }
201  }
202  
203  return count;
204}
205
206// 🔍 Функция анализа активности
207void analyzeActivity() {
208  // 📊 Частота движений
209  int recentMotions = countRecentMotions(60000);  // За минуту
210  
211  if (recentMotions > 10) {
212    Serial.println("🎪 Обнаружена высокая активность (возможно праздник)");
213  } else if (recentMotions > 5) {
214    Serial.println("👥 Обнаружена групповая активность");
215  } else {
216    Serial.println("👤 Обнаружена одиночная активность");
217  }
218}
219
220// 🎮 Функция обработки команд через Serial
221void handleSerialCommands() {
222  if (Serial.available()) {
223    String command = Serial.readStringUntil('\n');
224    command.trim();
225    command.toLowerCase();
226    
227    if (command == "arm") {
228      systemArmed = true;
229      Serial.println("🛡️ Система охраны АКТИВИРОВАНА");
230      tone(BUZZER_PIN, 800, 100);
231      
232    } else if (command == "disarm") {
233      systemArmed = false;
234      Serial.println("✅ Система охраны ДЕАКТИВИРОВАНА");
235      tone(BUZZER_PIN, 400, 100);
236      
237    } else if (command == "status") {
238      printSystemStatus();
239      
240    } else if (command == "reset") {
241      resetStatistics();
242      
243    } else if (command == "help") {
244      printHelp();
245      
246    } else {
247      Serial.println("❌ Неизвестная команда. Введите 'help'");
248    }
249  }
250}
251
252// 📊 Функция вывода статуса системы
253void printSystemStatus() {
254  unsigned long uptime = millis() / 1000;
255  
256  Serial.println("📊 СТАТУС СИСТЕМЫ ДВИЖЕНИЯ:");
257  Serial.printf("├ Время работы: %lu сек (%lu мин)\n", uptime, uptime / 60);
258  Serial.printf("├ Система охраны: %s\n", systemArmed ? "ВКЛ" : "ВЫКЛ");
259  Serial.printf("├ Текущее движение: %s\n", motionDetected ? "ДА" : "НЕТ");
260  Serial.printf("├ Последнее движение: %lu сек назад\n", 
261                (millis() - lastMotionTime) / 1000);
262  Serial.printf("├ Движений в текущем периоде: %d\n", motionCounter);
263  Serial.printf("├ Всего движений: %d\n", totalMotions);
264  Serial.printf("├ Активность за минуту: %d движений\n", 
265                countRecentMotions(60000));
266  Serial.printf("└ Средняя частота: %.1f движений/мин\n", 
267                (float)totalMotions / (uptime / 60.0));
268}
269
270// 🔄 Сброс статистики
271void resetStatistics() {
272  totalMotions = 0;
273  motionCounter = 0;
274  systemStartTime = millis();
275  
276  // 🔄 Очищаем историю
277  for (int i = 0; i < 10; i++) {
278    motionTimes[i] = 0;
279  }
280  motionIndex = 0;
281  
282  Serial.println("🔄 Статистика движений сброшена");
283}
284
285// 📋 Справка по командам
286void printHelp() {
287  Serial.println("📋 ДОСТУПНЫЕ КОМАНДЫ:");
288  Serial.println("├ arm - активировать охранную систему");
289  Serial.println("├ disarm - деактивировать охрану");
290  Serial.println("├ status - показать статус системы");
291  Serial.println("├ reset - сбросить статистику");
292  Serial.println("└ help - эта справка");
293}

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

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

  1// 🧠 УМНАЯ ОБРАБОТКА СИГНАЛОВ PIR
  2
  3// 📊 Структура для адаптивных настроек
  4struct PIRSettings {
  5  int minMotionDuration;     // Мин. длительность движения (мс)
  6  int maxMotionGap;          // Макс. промежуток в движении (мс)
  7  int falseAlarmThreshold;   // Порог ложных срабатываний
  8  bool adaptiveMode;         // Режим адаптации
  9  unsigned long learningTime; // Время обучения (мс)
 10};
 11
 12PIRSettings settings = {200, 2000, 5, true, 300000}; // 5 мин обучения
 13
 14// 🎯 Функция умной фильтрации движений
 15bool smartMotionFilter(bool rawMotion) {
 16  static bool lastState = false;
 17  static unsigned long stateChangeTime = 0;
 18  static int shortPulseCount = 0;
 19  static unsigned long lastShortPulse = 0;
 20  
 21  unsigned long currentTime = millis();
 22  
 23  // 🔄 Обнаружение изменения состояния
 24  if (rawMotion != lastState) {
 25    unsigned long stateDuration = currentTime - stateChangeTime;
 26    
 27    // 🔍 Анализ предыдущего состояния
 28    if (lastState == true) {
 29      // Завершилось движение
 30      if (stateDuration < settings.minMotionDuration) {
 31        // 📊 Слишком короткое движение - возможно помеха
 32        shortPulseCount++;
 33        lastShortPulse = currentTime;
 34        
 35        Serial.printf("⚠️ Короткий импульс: %lu мс (помеха?)\n", stateDuration);
 36        
 37        // 🚨 Много коротких импульсов = проблема
 38        if (shortPulseCount > settings.falseAlarmThreshold && 
 39            (currentTime - lastShortPulse) < 10000) {
 40          Serial.println("🚨 Обнаружены помехи! Увеличиваю фильтрацию");
 41          settings.minMotionDuration += 50;  // Увеличиваем порог
 42        }
 43      }
 44    }
 45    
 46    stateChangeTime = currentTime;
 47    lastState = rawMotion;
 48  }
 49  
 50  // 🎯 Сброс счетчика коротких импульсов
 51  if (currentTime - lastShortPulse > 60000) {  // Через минуту
 52    shortPulseCount = 0;
 53  }
 54  
 55  return rawMotion;
 56}
 57
 58// 🤖 Функция машинного обучения паттернов
 59void learnMotionPatterns() {
 60  static unsigned long learningStart = 0;
 61  static int normalMotions = 0;
 62  static int falseAlarms = 0;
 63  
 64  if (learningStart == 0) {
 65    learningStart = millis();
 66    Serial.println("🎓 Начинаю обучение распознаванию движений...");
 67  }
 68  
 69  unsigned long learningElapsed = millis() - learningStart;
 70  
 71  if (learningElapsed < settings.learningTime) {
 72    // 📚 Период обучения - собираем статистику
 73    // (в реальности здесь был бы более сложный алгоритм)
 74    
 75    if (learningElapsed % 60000 == 0) {  // Каждую минуту
 76      int progress = (learningElapsed * 100) / settings.learningTime;
 77      Serial.printf("🎓 Обучение: %d%% | Движений: %d | Помех: %d\n",
 78                    progress, normalMotions, falseAlarms);
 79    }
 80  } else {
 81    // ✅ Обучение завершено
 82    settings.adaptiveMode = false;
 83    
 84    float accuracy = (float)normalMotions / (normalMotions + falseAlarms) * 100;
 85    Serial.printf("🎯 Обучение завершено! Точность: %.1f%%\n", accuracy);
 86    
 87    // 🔧 Оптимизируем настройки на основе обучения
 88    if (accuracy < 90) {
 89      settings.minMotionDuration += 100;
 90      Serial.println("🔧 Увеличил фильтрацию для повышения точности");
 91    }
 92  }
 93}
 94
 95// 📊 Функция анализа качества сигнала
 96void analyzeSignalQuality() {
 97  static int signalChanges = 0;
 98  static unsigned long analysisStart = millis();
 99  static bool lastSignal = false;
100  
101  bool currentSignal = digitalRead(PIR_PIN);
102  
103  if (currentSignal != lastSignal) {
104    signalChanges++;
105    lastSignal = currentSignal;
106  }
107  
108  // 📈 Анализируем каждые 30 секунд
109  if (millis() - analysisStart >= 30000) {
110    float changesPerSecond = (float)signalChanges / 30.0;
111    
112    Serial.printf("📊 Качество сигнала: %.1f изм/сек", changesPerSecond);
113    
114    if (changesPerSecond > 2.0) {
115      Serial.println(" (ШУМНЫЙ - возможны помехи)");
116    } else if (changesPerSecond > 0.5) {
117      Serial.println(" (АКТИВНЫЙ - норма)");
118    } else {
119      Serial.println(" (СТАБИЛЬНЫЙ - отлично)");
120    }
121    
122    // 🔄 Сброс для следующего периода
123    signalChanges = 0;
124    analysisStart = millis();
125  }
126}

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

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

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

  1// 🛡️ ОХРАННАЯ СИСТЕМА "УМНЫЙ СТРАЖ" v3.0
  2
  3// 🎯 Режимы работы системы
  4enum SecurityMode {
  5  MODE_DISARMED,    // Выключена
  6  MODE_HOME,        // Домашний режим
  7  MODE_AWAY,        // Режим отсутствия
  8  MODE_NIGHT,       // Ночной режим
  9  MODE_ALARM        // Тревога
 10};
 11
 12// 📊 Структура состояния системы
 13struct SecuritySystem {
 14  SecurityMode currentMode;
 15  bool armed;
 16  unsigned long armTime;
 17  unsigned long lastMotion;
 18  int alarmLevel;        // 0-5 уровень тревоги
 19  bool sirenActive;
 20  int motionZones[4];    // 4 зоны контроля
 21  String lastAlarmReason;
 22};
 23
 24SecuritySystem security = {MODE_DISARMED, false, 0, 0, 0, false, {0}, ""};
 25
 26// ⏰ Временные настройки
 27const unsigned long ARM_DELAY = 30000;        // 30 сек на выход
 28const unsigned long ENTRY_DELAY = 15000;      // 15 сек на вход
 29const unsigned long ALARM_DURATION = 300000;  // 5 мин сирена
 30const unsigned long MOTION_MEMORY = 60000;    // 1 мин память движения
 31
 32void securitySystemLoop() {
 33  // 📖 Читаем датчики
 34  bool motionDetected = readAllMotionSensors();
 35  
 36  // 🧠 Обрабатываем состояние системы
 37  processSecurityLogic(motionDetected);
 38  
 39  // 🚨 Управляем тревогой
 40  handleAlarmState();
 41  
 42  // 💡 Обновляем индикацию
 43  updateSecurityIndicators();
 44  
 45  // 📱 Отправляем уведомления
 46  sendSecurityNotifications();
 47}
 48
 49// 📖 Функция чтения всех датчиков движения
 50bool readAllMotionSensors() {
 51  // В реальной системе здесь было бы несколько PIR датчиков
 52  bool motion = digitalRead(PIR_PIN);
 53  
 54  if (motion) {
 55    security.lastMotion = millis();
 56    
 57    // 📍 Определяем зону срабатывания (упрощенно)
 58    int zone = determineMotionZone();
 59    security.motionZones[zone]++;
 60    
 61    Serial.printf("🚶 Движение в зоне %d (всего: %d)\n", 
 62                  zone + 1, security.motionZones[zone]);
 63  }
 64  
 65  return motion;
 66}
 67
 68// 📍 Функция определения зоны движения
 69int determineMotionZone() {
 70  // Упрощенная логика - в реальности анализ нескольких датчиков
 71  unsigned long time = millis();
 72  return (time / 10000) % 4;  // Имитация разных зон
 73}
 74
 75// 🧠 Основная логика системы безопасности
 76void processSecurityLogic(bool motionDetected) {
 77  unsigned long currentTime = millis();
 78  
 79  switch (security.currentMode) {
 80    case MODE_DISARMED:
 81      // 😴 Система выключена - только мониторинг
 82      if (motionDetected) {
 83        Serial.println("👁️ Движение зафиксировано (система выключена)");
 84      }
 85      break;
 86      
 87    case MODE_HOME:
 88      // 🏠 Домашний режим - контроль периметра
 89      if (motionDetected) {
 90        int zone = determineMotionZone();
 91        if (zone == 0) {  // Входная зона
 92          triggerAlarm("Движение во входной зоне (домашний режим)");
 93        } else {
 94          Serial.printf("🏠 Нормальное движение дома (зона %d)\n", zone + 1);
 95        }
 96      }
 97      break;
 98      
 99    case MODE_AWAY:
100      // 🚶 Режим отсутствия - любое движение = тревога
101      if (motionDetected) {
102        if (currentTime - security.armTime > ARM_DELAY) {
103          startEntryDelay("Движение при отсутствии");
104        } else {
105          Serial.println("⏰ Движение в период выхода (игнорируется)");
106        }
107      }
108      break;
109      
110    case MODE_NIGHT:
111      // 🌙 Ночной режим - контроль первого этажа
112      if (motionDetected) {
113        int zone = determineMotionZone();
114        if (zone <= 1) {  // Первый этаж
115          startEntryDelay("Движение на первом этаже ночью");
116        }
117      }
118      break;
119      
120    case MODE_ALARM:
121      // 🚨 Режим тревоги - продолжаем сирену
122      handleActiveAlarm();
123      break;
124  }
125}
126
127// ⏰ Функция запуска задержки входа
128void startEntryDelay(String reason) {
129  static unsigned long entryDelayStart = 0;
130  
131  if (entryDelayStart == 0) {
132    entryDelayStart = millis();
133    security.lastAlarmReason = reason;
134    
135    Serial.printf("⏰ ЗАДЕРЖКА ВХОДА: %s\n", reason.c_str());
136    Serial.printf("   У вас %d секунд для отключения\n", ENTRY_DELAY / 1000);
137    
138    // 🔊 Предупредительные сигналы
139    for (int i = 0; i < 3; i++) {
140      tone(BUZZER_PIN, 800, 200);
141      delay(300);
142    }
143  }
144  
145  // ⏱️ Проверяем истечение времени
146  if (millis() - entryDelayStart >= ENTRY_DELAY) {
147    triggerAlarm(security.lastAlarmReason);
148    entryDelayStart = 0;
149  }
150}
151
152// 🚨 Функция активации тревоги
153void triggerAlarm(String reason) {
154  security.currentMode = MODE_ALARM;
155  security.sirenActive = true;
156  security.alarmLevel = 5;
157  security.lastAlarmReason = reason;
158  
159  Serial.printf("🚨 ТРЕВОГА АКТИВИРОВАНА: %s\n", reason.c_str());
160  Serial.println("📱 Отправляется уведомление владельцу");
161  
162  // 🔊 Включаем сирену
163  startSiren();
164  
165  // 📸 Делаем "фото" (имитация)
166  takeSecurityPhoto();
167  
168  // 📱 Отправляем уведомление
169  sendAlarmNotification(reason);
170}
171
172// 📯 Функция управления сиреной
173void startSiren() {
174  // 🔊 Паттерн европейской сирены
175  static unsigned long sirenStart = 0;
176  static bool sirenPhase = false;
177  
178  if (sirenStart == 0) {
179    sirenStart = millis();
180  }
181  
182  if (security.sirenActive) {
183    unsigned long elapsed = millis() - sirenStart;
184    
185    // 🔄 Меняем тон каждые 500мс
186    if (elapsed % 1000 < 500) {
187      tone(BUZZER_PIN, 800);  // Высокий тон
188    } else {
189      tone(BUZZER_PIN, 400);  // Низкий тон
190    }
191    
192    // ⏰ Автоматическое отключение через 5 минут
193    if (elapsed >= ALARM_DURATION) {
194      stopSiren();
195      Serial.println("⏰ Сирена автоматически отключена через 5 минут");
196    }
197  }
198}
199
200// 🔇 Функция остановки сирены
201void stopSiren() {
202  security.sirenActive = false;
203  noTone(BUZZER_PIN);
204  
205  if (security.currentMode == MODE_ALARM) {
206    Serial.println("🔇 Сирена остановлена");
207  }
208}
209
210// 📸 Функция "фотографирования" нарушителя
211void takeSecurityPhoto() {
212  Serial.println("📸 Делаю фото нарушителя...");
213  Serial.println("   [В реальной системе здесь подключение камеры]");
214  Serial.println("   Фото сохранено: intruder_2025-05-27_15-46.jpg");
215}
216
217// 📱 Функция отправки уведомлений
218void sendAlarmNotification(String reason) {
219  Serial.println("📱 ОТПРАВКА УВЕДОМЛЕНИЯ:");
220  Serial.printf("   Кому: Владелец дома (+7-XXX-XXX-XXXX)\n");
221  Serial.printf("   Текст: ТРЕВОГА! %s\n", reason.c_str());
222  Serial.printf("   Время: %s\n", getCurrentTime().c_str());
223  Serial.printf("   Фото: attached\n");
224  Serial.printf("   Управление: http://home-security.local/alarm\n");
225}
226
227// 🕐 Функция получения текущего времени
228String getCurrentTime() {
229  unsigned long uptime = millis() / 1000;
230  int hours = (uptime / 3600) % 24;
231  int minutes = (uptime / 60) % 60;
232  int seconds = uptime % 60;
233  
234  char timeStr[20];
235  sprintf(timeStr, "%02d:%02d:%02d", hours, minutes, seconds);
236  return String(timeStr);
237}
238
239// 🎮 Функция управления системой
240void handleSecurityCommands(String command) {
241  if (command == "arm home") {
242    armSystem(MODE_HOME);
243  } else if (command == "arm away") {
244    armSystem(MODE_AWAY);
245  } else if (command == "arm night") {
246    armSystem(MODE_NIGHT);
247  } else if (command == "disarm") {
248    disarmSystem();
249  } else if (command == "panic") {
250    triggerAlarm("Кнопка паники нажата");
251  } else if (command == "test") {
252    testAllSensors();
253  } else if (command == "zones") {
254    printZoneStatus();
255  }
256}
257
258// 🛡️ Функция постановки на охрану
259void armSystem(SecurityMode mode) {
260  security.currentMode = mode;
261  security.armed = true;
262  security.armTime = millis();
263  
264  String modeNames[] = {"", "ДОМАШНИЙ", "ОТСУТСТВИЕ", "НОЧНОЙ", ""};
265  Serial.printf("🛡️ Система поставлена на охрану: %s\n", 
266                modeNames[mode].c_str());
267  Serial.printf("⏰ Задержка выхода: %d секунд\n", ARM_DELAY / 1000);
268  
269  // 🔊 Подтверждающие сигналы
270  for (int i = 0; i < mode; i++) {
271    tone(BUZZER_PIN, 1000, 100);
272    delay(200);
273  }
274}
275
276// ✅ Функция снятия с охраны
277void disarmSystem() {
278  SecurityMode oldMode = security.currentMode;
279  
280  security.currentMode = MODE_DISARMED;
281  security.armed = false;
282  stopSiren();
283  
284  Serial.println("✅ Система снята с охраны");
285  
286  if (oldMode == MODE_ALARM) {
287    Serial.println("🔇 Тревога отменена");
288  }
289  
290  // 🔊 Подтверждение отключения
291  tone(BUZZER_PIN, 400, 500);
292}
293
294// 🔧 Функция тестирования датчиков
295void testAllSensors() {
296  Serial.println("🔧 ТЕСТИРОВАНИЕ СИСТЕМЫ БЕЗОПАСНОСТИ:");
297  
298  // 🚶 Тест PIR датчика
299  Serial.print("🚶 PIR датчик: ");
300  bool motion = digitalRead(PIR_PIN);
301  Serial.println(motion ? "✅ РАБОТАЕТ" : "❌ НЕТ ДВИЖЕНИЯ");
302  
303  // 🔊 Тест сирены
304  Serial.println("🔊 Тест сирены...");
305  tone(BUZZER_PIN, 1000, 1000);
306  delay(1100);
307  
308  // 💡 Тест индикации
309  Serial.println("💡 Тест светодиодов...");
310  for (int i = 0; i < 3; i++) {
311    digitalWrite(LED_PIN, HIGH);
312    digitalWrite(EXTERNAL_LED_PIN, HIGH);
313    delay(200);
314    digitalWrite(LED_PIN, LOW);
315    digitalWrite(EXTERNAL_LED_PIN, LOW);
316    delay(200);
317  }
318  
319  Serial.println("✅ Тестирование завершено");
320}
321
322// 📊 Функция вывода статуса зон
323void printZoneStatus() {
324  Serial.println("📊 СТАТУС ЗОН БЕЗОПАСНОСТИ:");
325  
326  String zoneNames[] = {"Входная группа", "Гостиная", "Кухня", "Коридор"};
327  
328  for (int i = 0; i < 4; i++) {
329    Serial.printf("├ Зона %d (%s): %d срабатываний\n", 
330                  i + 1, zoneNames[i].c_str(), security.motionZones[i]);
331  }
332  
333  unsigned long timeSinceMotion = millis() - security.lastMotion;
334  Serial.printf("└ Последнее движение: %lu сек назад\n", 
335                timeSinceMotion / 1000);
336}

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

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

  1// 💡 СИСТЕМА УМНОГО ОСВЕЩЕНИЯ "СВЕТОВОД"
  2
  3// 🌟 Режимы освещения
  4enum LightMode {
  5  LIGHT_OFF,         // Выключено
  6  LIGHT_AUTO,        // Автоматический режим
  7  LIGHT_MANUAL,      // Ручное управление
  8  LIGHT_ECONOMY,     // Экономичный режим
  9  LIGHT_PARTY,       // Праздничный режим
 10  LIGHT_NIGHT        // Ночной режим
 11};
 12
 13// 📊 Структура системы освещения
 14struct SmartLighting {
 15  LightMode currentMode;
 16  int brightness;              // 0-255
 17  bool motionActivated;        // Включено движением
 18  unsigned long lightOnTime;   // Время включения
 19  int autoOffDelay;           // Задержка автоотключения (сек)
 20  bool presenceDetected;       // Присутствие человека
 21  int lightSensorValue;        // Значение датчика света
 22};
 23
 24SmartLighting lighting = {LIGHT_AUTO, 128, false, 0, 300, false, 0};
 25
 26void smartLightingLoop() {
 27  // 📖 Читаем датчики
 28  bool motion = digitalRead(PIR_PIN);
 29  int lightLevel = analogRead(LIGHT_SENSOR_PIN);  // Если есть датчик света
 30  
 31  lighting.lightSensorValue = lightLevel;
 32  
 33  // 🧠 Определяем присутствие
 34  updatePresenceDetection(motion);
 35  
 36  // 💡 Управляем освещением
 37  controlAutoLighting();
 38  
 39  // 📊 Обновляем статистику
 40  updateLightingStats();
 41}
 42
 43// 👁️ Функция определения присутствия
 44void updatePresenceDetection(bool motion) {
 45  static unsigned long lastMotionTime = 0;
 46  static int motionCount = 0;
 47  static unsigned long presenceStart = 0;
 48  
 49  if (motion) {
 50    lastMotionTime = millis();
 51    motionCount++;
 52    
 53    if (!lighting.presenceDetected) {
 54      lighting.presenceDetected = true;
 55      presenceStart = millis();
 56      Serial.println("👤 Присутствие ОБНАРУЖЕНО");
 57    }
 58  }
 59  
 60  // 📊 Анализ отсутствия движения
 61  unsigned long timeSinceMotion = millis() - lastMotionTime;
 62  
 63  if (lighting.presenceDetected && timeSinceMotion > lighting.autoOffDelay * 1000) {
 64    lighting.presenceDetected = false;
 65    unsigned long presenceDuration = (millis() - presenceStart) / 1000;
 66    
 67    Serial.printf("👻 Присутствие ЗАВЕРШЕНО (длительность: %lu сек)\n", 
 68                  presenceDuration);
 69    
 70    // 📊 Анализ поведения
 71    analyzeUserBehavior(presenceDuration, motionCount);
 72    motionCount = 0;
 73  }
 74}
 75
 76// 💡 Функция автоматического управления освещением
 77void controlAutoLighting() {
 78  if (lighting.currentMode != LIGHT_AUTO) return;
 79  
 80  // 🌅 Определяем нужность освещения по датчику света
 81  bool needLight = lighting.lightSensorValue < 500;  // Темно
 82  
 83  // 🎯 Логика включения/выключения
 84  if (lighting.presenceDetected && needLight) {
 85    // 💡 Включаем свет
 86    if (!lighting.motionActivated) {
 87      turnOnLight();
 88    }
 89  } else {
 90    // 💤 Выключаем свет
 91    if (lighting.motionActivated) {
 92      turnOffLight();
 93    }
 94  }
 95  
 96  // 🌈 Адаптивная яркость
 97  adaptBrightness();
 98}
 99
100// 🔆 Функция включения освещения
101void turnOnLight() {
102  lighting.motionActivated = true;
103  lighting.lightOnTime = millis();
104  
105  Serial.printf("💡 Свет ВКЛЮЧЕН (режим: %s)\n", getLightModeString().c_str());
106  
107  // 🌅 Плавное включение
108  fadeLight(0, lighting.brightness, 1000);  // 1 секунда на включение
109}
110
111// 💤 Функция выключения освещения
112void turnOffLight() {
113  unsigned long onDuration = (millis() - lighting.lightOnTime) / 1000;
114  
115  Serial.printf("💤 Свет ВЫКЛЮЧЕН (горел %lu сек)\n", onDuration);
116  
117  // 🌇 Плавное выключение
118  fadeLight(lighting.brightness, 0, 2000);  // 2 секунды на выключение
119  
120  lighting.motionActivated = false;
121}
122
123// 🌈 Функция плавного изменения яркости
124void fadeLight(int fromBrightness, int toBrightness, int duration) {
125  int steps = 50;
126  int stepDelay = duration / steps;
127  
128  for (int i = 0; i <= steps; i++) {
129    int currentBrightness = map(i, 0, steps, fromBrightness, toBrightness);
130    analogWrite(EXTERNAL_LED_PIN, currentBrightness);
131    delay(stepDelay);
132  }
133}
134
135// 🎛️ Функция адаптивной яркости
136void adaptBrightness() {
137  if (!lighting.motionActivated) return;
138  
139  // 📊 Адаптация к уровню внешнего освещения
140  int targetBrightness;
141  
142  if (lighting.lightSensorValue < 200) {
143    targetBrightness = 255;  // Очень темно - максимум
144  } else if (lighting.lightSensorValue < 400) {
145    targetBrightness = 200;  // Темно - яркий свет
146  } else if (lighting.lightSensorValue < 600) {
147    targetBrightness = 150;  // Сумерки - средний свет
148  } else {
149    targetBrightness = 80;   // Светло - приглушенный
150  }
151  
152  // 🌙 Ночной режим - снижаем яркость
153  if (lighting.currentMode == LIGHT_NIGHT) {
154    targetBrightness /= 3;
155  }
156  
157  // 🔄 Плавная адаптация яркости
158  if (abs(lighting.brightness - targetBrightness) > 10) {
159    lighting.brightness = targetBrightness;
160    analogWrite(EXTERNAL_LED_PIN, lighting.brightness);
161    
162    Serial.printf("🌈 Яркость адаптирована: %d (освещенность: %d)\n",
163                  lighting.brightness, lighting.lightSensorValue);
164  }
165}
166
167// 🧠 Функция анализа поведения пользователя
168void analyzeUserBehavior(unsigned long duration, int motionCount) {
169  float motionRate = (float)motionCount / (duration / 60.0);  // движений/мин
170  
171  Serial.printf("🧠 Анализ поведения: %.1f движений/мин", motionRate);
172  
173  if (motionRate > 5) {
174    Serial.println(" (АКТИВНАЯ работа)");
175    lighting.autoOffDelay = 600;  // 10 мин для активной работы
176  } else if (motionRate > 2) {
177    Serial.println(" (ОБЫЧНАЯ активность)");
178    lighting.autoOffDelay = 300;  // 5 мин стандартно
179  } else {
180    Serial.println(" (НИЗКАЯ активность)");
181    lighting.autoOffDelay = 120;  // 2 мин для низкой активности
182  }
183  
184  Serial.printf("🕐 Новая задержка отключения: %d сек\n", lighting.autoOffDelay);
185}
186
187// 📊 Функция получения названия режима
188String getLightModeString() {
189  switch (lighting.currentMode) {
190    case LIGHT_OFF: return "ВЫКЛ";
191    case LIGHT_AUTO: return "АВТО";
192    case LIGHT_MANUAL: return "РУЧНОЙ";
193    case LIGHT_ECONOMY: return "ЭКОНОМ";
194    case LIGHT_PARTY: return "ПРАЗДНИК";
195    case LIGHT_NIGHT: return "НОЧЬ";
196    default: return "НЕИЗВЕСТЕН";
197  }
198}
199
200// 🎮 Функция управления режимами освещения
201void handleLightCommands(String command) {
202  if (command == "light auto") {
203    lighting.currentMode = LIGHT_AUTO;
204    Serial.println("💡 Режим: АВТОМАТИЧЕСКИЙ");
205  } else if (command == "light manual") {
206    lighting.currentMode = LIGHT_MANUAL;
207    Serial.println("💡 Режим: РУЧНОЙ");
208  } else if (command == "light night") {
209    lighting.currentMode = LIGHT_NIGHT;
210    Serial.println("💡 Режим: НОЧНОЙ");
211  } else if (command == "light on") {
212    lighting.currentMode = LIGHT_MANUAL;
213    turnOnLight();
214  } else if (command == "light off") {
215    turnOffLight();
216  } else if (command.startsWith("brightness ")) {
217    int newBrightness = command.substring(11).toInt();
218    setBrightness(newBrightness);
219  }
220}
221
222// 🔆 Функция установки яркости
223void setBrightness(int brightness) {
224  lighting.brightness = constrain(brightness, 0, 255);
225  
226  if (lighting.motionActivated) {
227    analogWrite(EXTERNAL_LED_PIN, lighting.brightness);
228  }
229  
230  Serial.printf("🔆 Яркость установлена: %d/255\n", lighting.brightness);
231}

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

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

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

  1
  2### **Блок 4: "Интеграция с IoT системой школы" (10 минут)**
  3
  4#### **📡 "Отправка данных о движении на сервер"**
  5
  6**Мониторинг активности в классе:**
  7
  8Данные о движении, собираемые PIR датчиками, представляют огромную ценность для анализа образовательного процесса. Система отправляет на школьный сервер информацию о:
  9
 10- **Паттернах активности учеников** - когда класс наиболее и наименее активен
 11- **Эффективности уроков** - корреляция между движением и вовлеченностью
 12- **Оптимизации расписания** - определение лучшего времени для разных типов занятий
 13- **Безопасности** - контроль присутствия и несанкционированного доступа
 14- **Энергосбережении** - статистика работы автоматического освещения
 15
 16**Собираемые метрики:**
 17- Количество движений за урок/день
 18- Периоды высокой и низкой активности
 19- Время присутствия каждого ученика
 20- Эффективность систем автоматизации
 21- Статистика ложных срабатываний
 22
 23#### **🖥️ "Веб-дашборд школьной администрации"**
 24
 25**Административная панель для директора и завучей:**
 26
 27Школьная IoT платформа предоставляет руководству детальную аналитику по всем классам:
 28
 29**Панель "Активность по классам":**
 30- Сравнение активности разных классов в реальном времени
 31- Графики вовлеченности учеников по времени суток
 32- Статистика посещаемости на основе датчиков движения
 33- Анализ эффективности различных форм обучения
 34
 35**Панель "Безопасность школы":**
 36- Мониторинг всех помещений в режиме реального времени
 37- Система оповещений о несанкционированном доступе
 38- Контроль работы систем автоматического освещения
 39- Статистика энергопотребления по зданию
 40
 41**Педагогическая аналитика:**
 42- Определение оптимального времени для проведения контрольных работ
 43- Анализ влияния физической активности на успеваемость
 44- Рекомендации по организации перемен и физкультминуток
 45- Мониторинг соблюдения санитарно-гигиенических норм
 46
 47#### **📊 "Большие данные образования"**
 48
 49**Применение данных PIR в образовательной аналитике:**
 50
 51Собранные данные используются для:
 52
 53**Исследований в области педагогики:**
 54- Изучение биоритмов учащихся и их влияния на обучение
 55- Анализ эффективности различных методов преподавания
 56- Исследование влияния физической среды на образовательный процесс
 57
 58**Оптимизации учебного процесса:**
 59- Автоматическое формирование расписания с учетом активности классов
 60- Рекомендации по продолжительности уроков для разных возрастов
 61- Планирование ремонтов и модернизации аудиторий
 62
 63**Здоровьесбережения:**
 64- Контроль соблюдения норм двигательной активности
 65- Автоматические напоминания о необходимости проветривания
 66- Мониторинг эргономики учебного пространства
 67
 68#### **🌐 "Интеграция с городской системой 'Умный город'"**
 69
 70**Школа как часть цифровой экосистемы:**
 71
 72Данные школьных PIR датчиков интегрируются с городскими системами:
 73
 74- **Транспортная система** - прогнозирование загрузки общественного транспорта
 75- **Энергосети** - оптимизация электроснабжения образовательных учреждений  
 76- **Система безопасности** - координация с районными службами охраны
 77- **Экологический мониторинг** - анализ влияния школьной активности на окружающую среду
 78
 79## 🎨 Творческое задание: "Умная система безопасности и комфорта" (12 минут)
 80
 81### **🛡️ "Создание интеллектуальной системы контроля класса"**
 82
 83**Техническое задание для команд:**
 84
 85Команды получают задание создать комплексную систему, которая не просто реагирует на движение, но анализирует поведение и адаптируется к потребностям класса.
 86
 87**Базовый функционал:**
 88- Детекция движения с возможностью различения типов активности
 89- Автоматическое управление освещением с учетом времени суток
 90- Система безопасности с градацией уровней тревоги
 91- Сбор и анализ статистики для оптимизации учебного процесса
 92
 93**Инновационные возможности:**
 94- ИИ-анализ поведенческих паттернов учеников
 95- Интеграция с другими системами умного дома
 96- Предиктивная аналитика для предотвращения проблем
 97- Адаптивное обучение алгоритмов под конкретный класс
 98
 99### **🎪 "Выставка умных решений"**
100
101**Демонстрация проектов:**
102
103Каждая команда представляет свою систему, демонстрируя:
104
105**Техническое совершенство:**
106- Надежность работы в различных условиях
107- Скорость реакции и точность детекции
108- Энергоэффективность решения
109- Масштабируемость для всей школы
110
111**Практическую применимость:**
112- Решение реальных проблем класса
113- Удобство использования для учителей
114- Безопасность и конфиденциальность данных
115- Экономическую целесообразность внедрения
116
117**Инновационность:**
118- Оригинальность технических решений
119- Креативность в применении PIR технологий
120- Интеграция с современными трендами IoT
121- Потенциал для дальнейшего развития
122
123## 📝 Рефлексия и закрепление (5 минут)
124
125### **🚶 "Викторина движения и безопасности"**
126
127**Интерактивное закрепление знаний:**
128
129Ученики демонстрируют понимание материала через практические действия:
130
131**Физические демонстрации:**
132- Показывают оптимальные траектории движения для PIR датчика
133- Демонстрируют зоны максимальной и минимальной чувствительности
134- Объясняют принципы работы через движение и жесты
135
136**Анализ ситуаций:**
137- Обсуждают этические аспекты мониторинга движения
138- Предлагают решения для повышения конфиденциальности
139- Анализируют баланс между безопасностью и приватностью
140
141### **💭 "Размышления о безопасности"**
142
143**Философские аспекты темы:**
144
145Ученики размышляют о роли технологий в современном мире:
146
147- "PIR датчики изменили мое понимание безопасности, потому что..."
148- "Самое важное в системах автоматизации это..."
149- "В будущем я бы применил эти технологии для..."
150- "Баланс между удобством и приватностью должен быть..."
151
152## 🏠 Домашнее задание
153
154### **🚶 "Домашний исследователь движения"**
155
156**Практические исследования:**
157
158**1. Наблюдение и анализ:**
159- Изучить системы безопасности в своем доме/подъезде
160- Найти PIR датчики в общественных местах (магазины, офисы)
161- Проанализировать эффективность автоматического освещения
162
163**2. Эксперименты с системой:**
164- Протестировать PIR датчик в различных условиях дома
165- Измерить влияние температуры на чувствительность
166- Найти оптимальное размещение для домашнего использования
167
168**3. Творческое применение:**
169- Придумать новые способы использования PIR датчиков
170- Спроектировать систему безопасности для своей комнаты
171- Создать план "умного дома" с автоматизацией
172
173### **📔 "Дневник инженера безопасности"**

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

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

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

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

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




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

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

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

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




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

  1
  2### **🔬 Исследовательское задание (для увлеченных):**
  3- Изучить другие типы датчиков движения (ультразвуковые, микроволновые)
  4- Найти информацию о системах компьютерного зрения
  5- Исследовать применение PIR в автомобильной промышленности
  6
  7### **🎨 Творческое задание:**
  8- Нарисовать план "умной школы" с датчиками движения
  9- Создать комикс "День из жизни PIR датчика"
 10
 11## 📊 Критерии оценивания
 12
 13### **"Отлично" (5):**
 14- Глубоко понимает принципы работы PIR датчиков и инфракрасного излучения
 15- Создает многофункциональную систему безопасности с несколькими режимами
 16- Программирует адаптивные алгоритмы анализа движения
 17- Реализует инновационные функции интеграции с IoT
 18- Демонстрирует понимание этических аспектов мониторинга
 19- Создает практически применимое решение
 20
 21### **"Хорошо" (4):**
 22- Понимает основы работы PIR датчиков
 23- Создает функциональную систему автоматического освещения и охраны
 24- Программирует базовые алгоритмы детекции движения
 25- Выполняет настройку и калибровку системы
 26- Интегрирует систему с внешними сервисами
 27
 28### **"Удовлетворительно" (3):**
 29- Имеет общее представление о датчиках движения
 30- С помощью создает простую систему реакции на движение
 31- Понимает базовые принципы систем безопасности
 32- Участвует в групповой работе над проектом
 33
 34## 🛠️ Материалы и оборудование
 35
 36### **Для каждой команды (3-4 человека):**
 37- ESP32 DevKit плата
 38- PIR датчик движения HC-SR501  
 39- Светодиоды (белый, красный, зеленый)
 40- Резисторы 220 Ом (3 шт)
 41- Пьезобузер для звуковых сигналов
 42- Макетная плата и провода
 43- Мультиметр для диагностики
 44
 45### **Для демонстраций учителем:**
 46- Инфракрасная камера (или тепловизор) для демонстрации ИК-излучения
 47- Различные источники тепла для экспериментов
 48- Препятствия разных материалов для тестирования проникновения ИК
 49- Профессиональный PIR датчик для сравнения характеристик
 50
 51### **Программное обеспечение:**
 52- Arduino IDE с библиотеками для работы с таймерами
 53- Serial Plotter для визуализации активности датчика
 54- Веб-интерфейс школьного IoT сервера
 55- Приложения для анализа данных движения
 56
 57### **Дополнительные компоненты (для продвинутых проектов):**
 58- Несколько PIR датчиков для многозонной системы
 59- Реле для управления мощным освещением
 60- LCD дисплей для отображения статуса системы
 61- SD карта для локального хранения логов
 62- Камера модуль для фото при тревоге
 63- Датчик освещенности для адаптивного управления
 64
 65## 🔍 Методические заметки для учителя
 66
 67### **Подготовка к уроку:**
 681. **Стабилизация датчиков:** За час до урока включить все PIR датчики для прогрева
 692. **Зонирование класса:** Разметить зоны для тестирования дальности обнаружения
 703. **Демонстрационные материалы:** Подготовить источники тепла и препятствия
 714. **Безопасность:** Проверить отсутствие острых углов и надежность креплений
 72
 73### **Возможные сложности:**
 74
 75**Проблема:** PIR датчик не стабилизируется или дает ложные срабатывания
 76**Решение:** Обеспечить 60+ секунд на стабилизацию, экранировать от сквозняков и ИК-источников
 77
 78**Проблема:** Учащиеся не понимают принцип работы инфракрасного излучения
 79**Решение:** Больше наглядных демонстраций с тепловизором, аналогии с живой природой
 80
 81**Проблема:** Этические вопросы о приватности и слежке
 82**Решение:** Обязательно обсудить границы применения, получение согласия, анонимизацию данных
 83
 84### **Безопасность:**
 85- Использование только безопасных источников тепла для демонстраций
 86- Контроль правильности подключения 5V питания PIR датчиков
 87- Обсуждение этических аспектов использования систем мониторинга
 88- Информирование о том, что данные используются только в образовательных целях
 89
 90### **Дифференциация обучения:**
 91- **Для продвинутых:** изучение профессиональных охранных систем, машинное обучение для анализа паттернов
 92- **Для начинающих:** готовые алгоритмы, простые схемы подключения
 93- **Для визуалов:** тепловизионные изображения, схемы зон обнаружения
 94- **Для кинестетиков:** больше движения для тестирования датчиков
 95
 96### **Связь с реальным миром:**
 97- Системы безопасности в банках, музеях, частных домах
 98- Автоматическое освещение в общественных зданиях
 99- Системы подсчета посетителей в торговых центрах
100- Умные города и IoT инфраструктура
101
102### **Межпредметные связи:**
103- **Физика:** инфракрасное излучение, тепло, оптика
104- **Биология:** терморегуляция живых организмов, органы чувств змей
105- **ОБЖ:** системы безопасности, охрана жилища
106- **Обществознание:** приватность, этика слежения, права человека
107
108### **Развитие проекта:**
109- Интеграция с камерами для распознавания лиц
110- Машинное обучение для классификации типов движения
111- Создание мобильного приложения для управления
112- Интеграция с голосовыми ассистентами