Skip to main content

💡 Датчик освещенности

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

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

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

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

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

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

  • Понимание роли освещения в жизни человека
  • Развитие экологического сознания (энергосбережение)
  • Формирование интереса к автоматизации бытовых процессов

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

“Глаза для роботов - учим ESP32 видеть свет”

Учитель демонстрирует ESP32 с фоторезистором, который автоматически включает светодиод в темноте

🌟 Магическая демонстрация:

1🔦 Направляем фонарик на датчик → Светодиод гаснет
2🖐️ Закрываем датчик рукой → Светодиод загорается  
3🌤️ Открываем окно → Яркость светодиода меняется
4💡 Включаем/выключаем свет в классе → Система реагирует мгновенно!

🎭 Интерактивная аналогия “Умные глаза”:

1👁️ ГЛАЗА ЧЕЛОВЕКА           ↔    💡 ДАТЧИК ОСВЕЩЕННОСТИ
2Зрачок сужается на свету    ↔    Сопротивление уменьшается
3Зрачок расширяется в темноте ↔    Сопротивление увеличивается
4Мозг анализирует сигналы    ↔    ESP32 обрабатывает данные
5Реакция: щуриться/открывать ↔    Реакция: включить/выключить свет

🏠 Демонстрация “Умный дом в действии”:

1🌅 УТРО: Датчик видит рассвет → Постепенно выключает ночник
2☀️ ДЕНЬ: Яркое солнце → Все искусственное освещение выключено
3🌆 ВЕЧЕР: Солнце садится → Постепенно включает освещение
4🌙 НОЧЬ: Темно → Включает ночное освещение

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

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

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

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

🔬 “Фоторезистор - переменное сопротивление от света”

Физические основы работы:

 1⚡ ПРИНЦИП РАБОТЫ ФОТОРЕЗИСТОРА (LDR):
 2
 3🌟 ПРИ ЯРКОМ СВЕТЕ:
 4- Фотоны попадают на полупроводник
 5- Электроны получают энергию
 6- Проводимость увеличивается
 7- Сопротивление УМЕНЬШАЕТСЯ (100-1000 Ом)
 8
 9🌚 ПРИ СЛАБОМ СВЕТЕ:
10- Мало фотонов попадает на датчик
11- Электроны не активны
12- Проводимость падает
13- Сопротивление УВЕЛИЧИВАЕТСЯ (10кОм-1МОм)
14
15📊 ТИПИЧНЫЕ ЗНАЧЕНИЯ:
16Яркий солнечный день: 50-100 Ом
17Комнатное освещение: 1-10 кОм
18Сумерки: 10-100 кОм
19Полная темнота: 100кОм-1МОм

🔌 “Делитель напряжения - преобразуем сопротивление в напряжение”

Схема и принцип работы:

 1⚡ ДЕЛИТЕЛЬ НАПРЯЖЕНИЯ С ФОТОРЕЗИСТОРОМ:
 2
 3        +3.3V
 4 5          ├─── Постоянный резистор 10кОм
 6 7          ├─── Сигнал на ESP32 (GPIO 34)
 8 9          ├─── Фоторезистор (переменный)
1011         GND
12
13🧮 ФОРМУЛА:
14U_выход = 3.3V × (R_фото / (R_пост + R_фото))
15
16📊 ПРИМЕРЫ РАСЧЕТОВ:
17Яркий свет (R_фото = 100 Ом):
18U = 3.3V × (100 / (10000 + 100)) = 0.03V
19
20Сумерки (R_фото = 10кОм):
21U = 3.3V × (10000 / (10000 + 10000)) = 1.65V
22
23Темнота (R_фото = 100кОм):
24U = 3.3V × (100000 / (10000 + 100000)) = 3.0V

📐 “Альтернативные световые датчики”

Сравнение типов датчиков:

 1📊 СРАВНЕНИЕ СВЕТОВЫХ ДАТЧИКОВ:
 2
 3🔍 ФОТОРЕЗИСТОР (LDR):
 4✅ Простой и дешевый
 5✅ Широкий диапазон сопротивлений
 6❌ Медленный отклик (~100мс)
 7❌ Зависит от температуры
 8🎯 Применение: Уличное освещение, ночники
 9
10📱 ФОТОДИОД:
11✅ Быстрый отклик (~1мкс)
12✅ Точность измерений
13❌ Дороже
14❌ Нужна сложная схема
15🎯 Применение: Камеры, оптические мыши
16
17🌈 ФОТОТРАНЗИСТОР:
18✅ Усиление сигнала
19✅ Хорошая чувствительность
20❌ Может насыщаться
21❌ Температурная зависимость
22🎯 Применение: Охранные системы
23
24💎 BH1750 (цифровой):
25✅ Точные измерения в люксах
26✅ I2C интерфейс
27✅ Не требует калибровки
28❌ Дороже аналоговых
29🎯 Применение: Профессиональные устройства

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

Эксперименты с освещением:

 1🔬 ЛАБОРАТОРИЯ СВЕТОВЫХ ИЗМЕРЕНИЙ:
 2
 3Эксперимент 1: Измерение сопротивления
 4Оборудование: Мультиметр, фоторезистор, различные источники света
 5
 6📊 ТАБЛИЦА ИЗМЕРЕНИЙ:
 7┌─────────────────────┬──────────────┬────────────┐
 8│ Условия освещения   │ Сопротивление│ Напряжение │
 9├─────────────────────┼──────────────┼────────────┤
10│ Фонарик вплотную    │ _____ Ом     │ _____ В    │
11│ Комнатный свет      │ _____ Ом     │ _____ В    │
12│ Свет из окна        │ _____ Ом     │ _____ В    │
13│ Тень от руки        │ _____ Ом     │ _____ В    │
14│ Закрыт полностью    │ _____ Ом     │ _____ В    │
15└─────────────────────┴──────────────┴────────────┘
16
17Эксперимент 2: Скорость отклика
18- Резко закрываем/открываем фоторезистор
19- Засекаем время изменения показаний: _____ мс
20
21Эксперимент 3: Угол чувствительности  
22- Поворачиваем фоторезистор к источнику света
23- Максимальная чувствительность под углом: _____°

Блок 2: “Подключение и калибровка датчика освещенности” (15 минут)

🔧 “Схема подключения фоторезистора”

Пошаговая сборка:

 1🛠️ СБОРКА ДАТЧИКА ОСВЕЩЕННОСТИ:
 2
 3Компоненты:
 4□ ESP32 DevKit
 5□ Фоторезистор (LDR) 
 6□ Резистор 10кОм (постоянный)
 7□ Макетная плата
 8□ Провода (красный, черный, желтый)
 9
10🔗 СХЕМА ПОДКЛЮЧЕНИЯ:
11        ESP32                   Датчик освещенности
12     ┌─────────┐              ┌─────────────────┐
13     │  3.3V   │──────────────│ +3.3V           │
14     │         │              │        │        │
15     │ GPIO 34 │──────────────│ Средняя точка   │
16     │         │              │        │        │
17     │   GND   │──────────────│ GND    │        │
18     └─────────┘              │     10кОм       │
19                              │        │        │
20                              │   Фоторезистор  │
21                              └─────────────────┘
22
23🎯 ПОСЛЕДОВАТЕЛЬНОСТЬ СБОРКИ:
241. Установить резистор 10кОм между +3.3V и средней точкой
252. Подключить фоторезистор между средней точкой и GND
263. Подключить среднюю точку к GPIO 34 (аналоговый вход)
274. Проверить все соединения мультиметром

💻 “Базовая программа чтения освещенности”

Код с подробными комментариями:

  1// 💡 ПРОГРАММА ДАТЧИКА ОСВЕЩЕННОСТИ
  2// Урок 13: Измерение уровня освещенности
  3
  4// 🔧 Настройки
  5const int LIGHT_SENSOR_PIN = 34;    // Аналоговый пин датчика
  6const int LED_PIN = 2;              // Встроенный светодиод
  7const int READINGS_COUNT = 10;      // Количество измерений для усреднения
  8
  9// 📊 Переменные для калибровки
 10int minLightValue = 4095;           // Минимальное значение (яркий свет)
 11int maxLightValue = 0;              // Максимальное значение (темнота)
 12bool calibrationMode = true;       // Режим калибровки
 13unsigned long calibrationTime = 10000; // 10 секунд на калибровку
 14
 15void setup() {
 16  Serial.begin(9600);
 17  Serial.println("💡 Инициализация датчика освещенности");
 18  
 19  pinMode(LED_PIN, OUTPUT);
 20  
 21  Serial.println("🔧 Режим калибровки запущен!");
 22  Serial.println("📖 В течение 10 секунд:");
 23  Serial.println("   🔦 Посветите фонариком на датчик");
 24  Serial.println("   🖐️ Закройте датчик рукой");
 25  Serial.println("─────────────────────────────────────");
 26  
 27  // 🎯 Калибровка датчика
 28  calibrateSensor();
 29  
 30  Serial.println("✅ Калибровка завершена!");
 31  Serial.printf("📊 Диапазон: %d (свет) - %d (темнота)\n", 
 32                minLightValue, maxLightValue);
 33  Serial.println("─────────────────────────────────────");
 34}
 35
 36void loop() {
 37  // 📖 Читаем значение освещенности
 38  int lightLevel = readLightLevel();
 39  
 40  // 📊 Преобразуем в проценты (0% = темно, 100% = светло)
 41  int lightPercent = map(lightLevel, maxLightValue, minLightValue, 0, 100);
 42  lightPercent = constrain(lightPercent, 0, 100);
 43  
 44  // 🌟 Анализируем уровень освещенности
 45  String lightCondition = analyzeLightLevel(lightPercent);
 46  
 47  // 💡 Управляем светодиодом (включается в темноте)
 48  bool ledState = (lightPercent < 30);  // Включаем при освещенности < 30%
 49  digitalWrite(LED_PIN, ledState);
 50  
 51  // 📊 Выводим результаты
 52  Serial.printf("💡 Сырое значение: %d | Освещенность: %d%% | %s | LED: %s\n",
 53                lightLevel, lightPercent, lightCondition.c_str(),
 54                ledState ? "ВКЛ" : "ВЫКЛ");
 55  
 56  delay(500);  // Обновляем каждые 0.5 секунды
 57}
 58
 59// 🎯 Функция калибровки датчика
 60void calibrateSensor() {
 61  unsigned long startTime = millis();
 62  
 63  while (millis() - startTime < calibrationTime) {
 64    int currentValue = analogRead(LIGHT_SENSOR_PIN);
 65    
 66    // 📊 Находим минимум и максимум
 67    if (currentValue < minLightValue) {
 68      minLightValue = currentValue;
 69    }
 70    if (currentValue > maxLightValue) {
 71      maxLightValue = currentValue;
 72    }
 73    
 74    // 📈 Показываем прогресс
 75    unsigned long elapsed = millis() - startTime;
 76    int progress = (elapsed * 100) / calibrationTime;
 77    
 78    if (elapsed % 1000 == 0) {  // Каждую секунду
 79      Serial.printf("🔧 Калибровка: %d%% | Текущее: %d | Мин: %d | Макс: %d\n",
 80                    progress, currentValue, minLightValue, maxLightValue);
 81    }
 82    
 83    delay(50);
 84  }
 85}
 86
 87// 📖 Функция чтения уровня освещенности с усреднением
 88int readLightLevel() {
 89  long sum = 0;
 90  
 91  // 📊 Берем несколько измерений для точности
 92  for (int i = 0; i < READINGS_COUNT; i++) {
 93    sum += analogRead(LIGHT_SENSOR_PIN);
 94    delay(10);
 95  }
 96  
 97  return sum / READINGS_COUNT;
 98}
 99
100// 🔍 Функция анализа уровня освещенности
101String analyzeLightLevel(int percent) {
102  if (percent >= 80) {
103    return "☀️ Очень ярко";
104  } else if (percent >= 60) {
105    return "🌤️ Ярко";
106  } else if (percent >= 40) {
107    return "🌥️ Умеренно";
108  } else if (percent >= 20) {
109    return "🌫️ Тускло";
110  } else {
111    return "🌚 Темно";
112  }
113}

🎛️ “Продвинутая калибровка и настройка”

Автоматическая адаптация к условиям:

 1// 🎯 ПРОДВИНУТЫЕ ФУНКЦИИ КАЛИБРОВКИ
 2
 3// 📊 Переменные для адаптивной калибровки
 4struct LightCalibration {
 5  int minValue;
 6  int maxValue;
 7  unsigned long lastUpdate;
 8  bool isValid;
 9};
10
11LightCalibration calibration = {4095, 0, 0, false};
12
13// 🔄 Функция непрерывной калибровки
14void continuousCalibration() {
15  int currentReading = analogRead(LIGHT_SENSOR_PIN);
16  unsigned long currentTime = millis();
17  
18  // 📈 Обновляем границы, если прошло достаточно времени
19  if (currentTime - calibration.lastUpdate > 60000) {  // Каждую минуту
20    
21    // 🔍 Плавно адаптируем границы
22    if (currentReading < calibration.minValue) {
23      calibration.minValue = (calibration.minValue + currentReading) / 2;
24    }
25    if (currentReading > calibration.maxValue) {
26      calibration.maxValue = (calibration.maxValue + currentReading) / 2;
27    }
28    
29    calibration.lastUpdate = currentTime;
30    
31    Serial.printf("🔄 Адаптация калибровки: %d - %d\n", 
32                  calibration.minValue, calibration.maxValue);
33  }
34}
35
36// 💾 Функция сохранения калибровки в EEPROM
37void saveCalibration() {
38  // Сохраняем калибровку для следующего запуска
39  EEPROM.write(0, calibration.minValue & 0xFF);
40  EEPROM.write(1, (calibration.minValue >> 8) & 0xFF);
41  EEPROM.write(2, calibration.maxValue & 0xFF);
42  EEPROM.write(3, (calibration.maxValue >> 8) & 0xFF);
43  EEPROM.commit();
44  
45  Serial.println("💾 Калибровка сохранена в память");
46}
47
48// 📖 Функция загрузки калибровки из EEPROM
49void loadCalibration() {
50  calibration.minValue = EEPROM.read(0) | (EEPROM.read(1) << 8);
51  calibration.maxValue = EEPROM.read(2) | (EEPROM.read(3) << 8);
52  
53  // 🔍 Проверяем разумность загруженных значений
54  if (calibration.minValue < calibration.maxValue && 
55      calibration.minValue >= 0 && calibration.maxValue <= 4095) {
56    calibration.isValid = true;
57    Serial.printf("📖 Загружена калибровка: %d - %d\n", 
58                  calibration.minValue, calibration.maxValue);
59  } else {
60    calibration.isValid = false;
61    Serial.println("⚠️ Сохраненная калибровка повреждена, требуется новая");
62  }
63}

🔬 “Диагностика и отладка датчика”

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

 1🚨 ДИАГНОСТИКА ПРОБЛЕМ ДАТЧИКА ОСВЕЩЕННОСТИ:
 2
 3❌ ПРОБЛЕМА: Значения не изменяются
 4🔍 ПРОВЕРКИ:
 51. Правильность подключения фоторезистора
 62. Качество соединений на макетной плате
 73. Не закрыт ли датчик корпусом/проводами
 84. Работоспособность фоторезистора (мультиметром)
 9
10❌ ПРОБЛЕМА: Слишком малый диапазон значений
11🔍 ПРОВЕРКИ:
121. Номинал постоянного резистора (должен быть ~10кОм)
132. Не перепутаны ли местами резисторы
143. Калибровка в достаточно разных условиях
154. Чувствительность фоторезистора
16
17❌ ПРОБЛЕМА: Шумные/нестабильные значения
18🔍 ПРОВЕРКИ:
191. Добавить конденсатор 100нФ для сглаживания
202. Увеличить количество усредняемых измерений
213. Проверить качество питания ESP32
224. Убрать источники электромагнитных помех
23
24🛠️ ИНСТРУМЕНТЫ ДИАГНОСТИКИ:
25- Мультиметр для проверки сопротивлений
26- Осциллограф для анализа шумов
27- Serial Plotter для визуализации изменений
28- Контрольный фоторезистор для сравнения

Блок 3: “Создание автоматической системы освещения” (18 минут)

🏠 “Умный ночник - базовая автоматика”

Простая система автоматического освещения:

  1// 🌙 ПРОГРАММА "УМНЫЙ НОЧНИК"
  2// Автоматическое управление освещением
  3
  4// 🔧 Настройки системы
  5const int LIGHT_SENSOR_PIN = 34;
  6const int LED_PIN = 2;
  7const int EXTERNAL_LED_PIN = 5;     // Внешний светодиод (более яркий)
  8
  9// 🎛️ Пороговые значения (в процентах освещенности)
 10const int TURN_ON_THRESHOLD = 25;   // Включать при освещенности < 25%
 11const int TURN_OFF_THRESHOLD = 35;  // Выключать при освещенности > 35%
 12                                    // Гистерезис предотвращает мигание
 13
 14// ⏱️ Временные настройки
 15const unsigned long RESPONSE_DELAY = 2000;  // 2 сек задержка перед реакцией
 16const unsigned long FADE_DURATION = 3000;   // 3 сек на плавное изменение яркости
 17
 18// 📊 Переменные состояния
 19bool lightSystemOn = false;
 20unsigned long lastChangeTime = 0;
 21int currentBrightness = 0;
 22int targetBrightness = 0;
 23
 24void setup() {
 25  Serial.begin(9600);
 26  Serial.println("🌙 Умный ночник v2.0 запущен");
 27  
 28  pinMode(LED_PIN, OUTPUT);
 29  pinMode(EXTERNAL_LED_PIN, OUTPUT);
 30  
 31  // 🎯 Быстрая калибровка (или загрузка из памяти)
 32  quickCalibration();
 33  
 34  Serial.println("✅ Система готова к работе");
 35  Serial.println("🌟 Автоматическое управление освещением активно");
 36  Serial.println("─────────────────────────────────────────────────");
 37}
 38
 39void loop() {
 40  // 📖 Читаем текущий уровень освещенности
 41  int lightPercent = readLightPercent();
 42  
 43  // 🎯 Определяем нужное состояние освещения
 44  bool shouldLightBeOn = decideLightState(lightPercent);
 45  
 46  // 💡 Обновляем систему освещения
 47  updateLightSystem(shouldLightBeOn);
 48  
 49  // 📊 Выводим статус системы
 50  printSystemStatus(lightPercent);
 51  
 52  delay(100);  // Быстрый цикл для плавной работы
 53}
 54
 55// 🎯 Функция принятия решения о включении/выключении
 56bool decideLightState(int lightPercent) {
 57  static unsigned long conditionStartTime = 0;
 58  static bool conditionMet = false;
 59  
 60  // 🔍 Проверяем условия включения/выключения
 61  bool currentCondition;
 62  if (lightSystemOn) {
 63    // Система включена - проверяем условие выключения
 64    currentCondition = (lightPercent > TURN_OFF_THRESHOLD);
 65  } else {
 66    // Система выключена - проверяем условие включения
 67    currentCondition = (lightPercent < TURN_ON_THRESHOLD);
 68  }
 69  
 70  // ⏱️ Отслеживаем время выполнения условия
 71  if (currentCondition) {
 72    if (!conditionMet) {
 73      conditionMet = true;
 74      conditionStartTime = millis();
 75    }
 76    
 77    // 🎯 Условие выполняется достаточно долго?
 78    if (millis() - conditionStartTime >= RESPONSE_DELAY) {
 79      return !lightSystemOn;  // Меняем состояние
 80    }
 81  } else {
 82    conditionMet = false;
 83  }
 84  
 85  return lightSystemOn;  // Состояние не меняется
 86}
 87
 88// 💡 Функция обновления системы освещения
 89void updateLightSystem(bool shouldBeOn) {
 90  if (shouldBeOn != lightSystemOn) {
 91    // 🔄 Меняем состояние системы
 92    lightSystemOn = shouldBeOn;
 93    targetBrightness = shouldBeOn ? 255 : 0;
 94    lastChangeTime = millis();
 95    
 96    Serial.printf("🔄 Система освещения: %s\n", 
 97                  shouldBeOn ? "ВКЛЮЧЕНА" : "ВЫКЛЮЧЕНА");
 98  }
 99  
100  // 🌈 Плавное изменение яркости
101  updateBrightness();
102}
103
104// 🌈 Функция плавного изменения яркости
105void updateBrightness() {
106  if (currentBrightness != targetBrightness) {
107    unsigned long elapsed = millis() - lastChangeTime;
108    
109    if (elapsed < FADE_DURATION) {
110      // 📈 Интерполяция яркости
111      int startBrightness = lightSystemOn ? 0 : 255;
112      float progress = (float)elapsed / FADE_DURATION;
113      currentBrightness = startBrightness + 
114                         (targetBrightness - startBrightness) * progress;
115    } else {
116      currentBrightness = targetBrightness;
117    }
118    
119    // 💡 Применяем яркость к светодиодам
120    analogWrite(EXTERNAL_LED_PIN, currentBrightness);
121    digitalWrite(LED_PIN, currentBrightness > 128);
122  }
123}
124
125// 📊 Функция вывода статуса системы
126void printSystemStatus(int lightPercent) {
127  static unsigned long lastPrint = 0;
128  
129  if (millis() - lastPrint >= 1000) {  // Каждую секунду
130    Serial.printf("💡 Освещенность: %d%% | Система: %s | Яркость: %d/255\n",
131                  lightPercent,
132                  lightSystemOn ? "ВКЛ" : "ВЫКЛ",
133                  currentBrightness);
134    lastPrint = millis();
135  }
136}

🌅 “Режимы работы умного освещения”

Различные алгоритмы автоматики:

 1// 🎭 РАЗЛИЧНЫЕ РЕЖИМЫ РАБОТЫ ОСВЕЩЕНИЯ
 2
 3enum LightMode {
 4  MODE_AUTO,        // Автоматический режим
 5  MODE_SCHEDULE,    // По расписанию
 6  MODE_MOTION,      // По движению + освещенность
 7  MODE_MANUAL,      // Ручное управление
 8  MODE_ENERGY_SAVE  // Энергосберегающий
 9};
10
11LightMode currentMode = MODE_AUTO;
12
13// 🌅 Режим "Имитация рассвета/заката"
14void sunriseMode() {
15  static unsigned long sunriseStart = 0;
16  const unsigned long SUNRISE_DURATION = 30 * 60 * 1000; // 30 минут
17  
18  if (sunriseStart == 0) {
19    sunriseStart = millis();
20    Serial.println("🌅 Режим рассвета активирован");
21  }
22  
23  unsigned long elapsed = millis() - sunriseStart;
24  
25  if (elapsed < SUNRISE_DURATION) {
26    // 📈 Плавное увеличение яркости
27    int brightness = map(elapsed, 0, SUNRISE_DURATION, 0, 255);
28    analogWrite(EXTERNAL_LED_PIN, brightness);
29    
30    // 🌈 Изменение "цветовой температуры" (имитация RGB)
31    int warmth = map(elapsed, 0, SUNRISE_DURATION, 255, 100);
32    // Здесь можно добавить управление RGB светодиодом
33  } else {
34    sunriseStart = 0;  // Рассвет завершен
35  }
36}
37
38// ⚡ Энергосберегающий режим
39void energySaveMode(int lightPercent) {
40  static unsigned long lastMotion = 0;
41  const unsigned long MOTION_TIMEOUT = 5 * 60 * 1000; // 5 минут без движения
42  
43  // 🚶 Имитация датчика движения (можно заменить на реальный)
44  bool motionDetected = (lightPercent < 20); // Условная логика
45  
46  if (motionDetected) {
47    lastMotion = millis();
48  }
49  
50  unsigned long timeSinceMotion = millis() - lastMotion;
51  
52  if (timeSinceMotion < MOTION_TIMEOUT && lightPercent < 30) {
53    // 💡 Включаем освещение только при движении в темноте
54    analogWrite(EXTERNAL_LED_PIN, 128); // 50% яркости для экономии
55  } else {
56    // 💤 Переходим в спящий режим
57    analogWrite(EXTERNAL_LED_PIN, 0);
58  }
59  
60  Serial.printf("⚡ Энергосбережение: движение %lu сек назад\n", 
61                timeSinceMotion / 1000);
62}
63
64// 📅 Режим по расписанию
65void scheduleMode() {
66  // 🕐 Получаем текущее время (в реальном проекте используем RTC)
67  unsigned long uptime = millis() / 1000;
68  int hours = (uptime / 3600) % 24;
69  int minutes = (uptime / 60) % 60;
70  
71  // 🌙 Ночное время: 22:00 - 06:00
72  bool isNightTime = (hours >= 22 || hours < 6);
73  
74  // 🌆 Вечернее время: 18:00 - 22:00
75  bool isEveningTime = (hours >= 18 && hours < 22);
76  
77  if (isNightTime) {
78    analogWrite(EXTERNAL_LED_PIN, 50);   // Ночник
79  } else if (isEveningTime) {
80    analogWrite(EXTERNAL_LED_PIN, 200);  // Вечернее освещение
81  } else {
82    analogWrite(EXTERNAL_LED_PIN, 0);    // Дневное время - выключено
83  }
84  
85  Serial.printf("📅 Расписание: %02d:%02d | Режим: %s\n", 
86                hours, minutes,
87                isNightTime ? "Ночник" : 
88                isEveningTime ? "Вечер" : "День");
89}

🎛️ “Интерфейс управления и настройки”

Система команд через Serial Monitor:

 1// 🎮 ИНТЕРФЕЙС УПРАВЛЕНИЯ ЧЕРЕЗ SERIAL
 2
 3void handleSerialCommands() {
 4  if (Serial.available()) {
 5    String command = Serial.readStringUntil('\n');
 6    command.trim();
 7    command.toLowerCase();
 8    
 9    // 📋 Обработка команд
10    if (command == "help") {
11      printHelp();
12    } else if (command == "status") {
13      printDetailedStatus();
14    } else if (command == "calibrate") {
15      recalibrateSensor();
16    } else if (command.startsWith("mode ")) {
17      changeMode(command.substring(5));
18    } else if (command.startsWith("threshold ")) {
19      setThreshold(command.substring(10));
20    } else if (command.startsWith("brightness ")) {
21      setManualBrightness(command.substring(11).toInt());
22    } else {
23      Serial.println("❌ Неизвестная команда. Введите 'help' для справки");
24    }
25  }
26}
27
28// 📖 Справка по командам
29void printHelp() {
30  Serial.println("🎮 ДОСТУПНЫЕ КОМАНДЫ:");
31  Serial.println("├ help - эта справка");
32  Serial.println("├ status - подробный статус системы");
33  Serial.println("├ calibrate - перекалибровка датчика");
34  Serial.println("├ mode [auto|manual|schedule|energy] - смена режима");
35  Serial.println("├ threshold [число] - установка порога включения");
36  Serial.println("└ brightness [0-255] - ручная установка яркости");
37}
38
39// 📊 Подробный статус системы
40void printDetailedStatus() {
41  Serial.println("📊 СТАТУС СИСТЕМЫ ОСВЕЩЕНИЯ:");
42  Serial.printf("├ Режим: %s\n", getModeString(currentMode));
43  Serial.printf("├ Освещенность: %d%%\n", readLightPercent());
44  Serial.printf("├ Порог включения: %d%%\n", TURN_ON_THRESHOLD);
45  Serial.printf("├ Порог выключения: %d%%\n", TURN_OFF_THRESHOLD);
46  Serial.printf("├ Текущая яркость: %d/255\n", currentBrightness);
47  Serial.printf("├ Система освещения: %s\n", lightSystemOn ? "ВКЛ" : "ВЫКЛ");
48  Serial.printf("└ Время работы: %lu сек\n", millis() / 1000);
49}
50
51// 🔄 Смена режима работы
52void changeMode(String mode) {
53  if (mode == "auto") {
54    currentMode = MODE_AUTO;
55    Serial.println("✅ Переключен в автоматический режим");
56  } else if (mode == "manual") {
57    currentMode = MODE_MANUAL;
58    Serial.println("✅ Переключен в ручной режим");
59  } else if (mode == "schedule") {
60    currentMode = MODE_SCHEDULE;
61    Serial.println("✅ Переключен в режим по расписанию");
62  } else if (mode == "energy") {
63    currentMode = MODE_ENERGY_SAVE;
64    Serial.println("✅ Переключен в энергосберегающий режим");
65  } else {
66    Serial.println("❌ Неизвестный режим. Доступны: auto, manual, schedule, energy");
67  }
68}

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

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

Интеграция с IoT системой школы:

 1// 📡 ИНТЕГРАЦИЯ С ШКОЛЬНОЙ IoT СИСТЕМОЙ
 2
 3#include <WiFi.h>
 4#include <HTTPClient.h>
 5#include <ArduinoJson.h>
 6
 7// 🌐 Настройки для отправки данных
 8const char* serverURL = "http://192.168.1.100/api/light-data";
 9unsigned long lastDataSend = 0;
10const unsigned long DATA_SEND_INTERVAL = 30000; // Каждые 30 секунд
11
12// 📊 Структура данных для отправки
13struct LightData {
14  String deviceName;
15  String studentName;
16  int lightLevel;        // 0-100%
17  int rawValue;          // 0-4095
18  bool autoLightOn;      // Состояние автоматического освещения
19  String lightMode;      // Текущий режим
20  float averageLight;    // Средняя освещенность за период
21  int toggleCount;       // Количество переключений
22};
23
24LightData currentData;
25
26// 📤 Функция отправки данных на сервер
27void sendLightDataToServer() {
28  if (WiFi.status() != WL_CONNECTED) return;
29  
30  // 📊 Подготавливаем данные
31  currentData.deviceName = "ESP32_5А_LightSensor_" + String(ESP.getChipId());
32  currentData.studentName = "Команда_1"; // Заменить на реальное имя
33  currentData.lightLevel = readLightPercent();
34  currentData.rawValue = analogRead(LIGHT_SENSOR_PIN);
35  currentData.autoLightOn = lightSystemOn;
36  currentData.lightMode = getModeString(currentMode);
37  
38  // 📋 Формируем JSON
39  String jsonData = createLightJSON();
40  
41  // 🚀 Отправляем данные
42  HTTPClient http;
43  http.begin(serverURL);
44  http.addHeader("Content-Type", "application/json");
45  
46  int responseCode = http.POST(jsonData);
47  
48  if (responseCode == 200) {
49    Serial.println("📤 Данные освещенности отправлены на сервер");
50  } else {
51    Serial.printf("❌ Ошибка отправки: %d\n", responseCode);
52  }
53  
54  http.end();
55}
56
57// 📋 Создание JSON с данными освещенности
58String createLightJSON() {
59  StaticJsonDocument<512> doc;
60  
61  doc["device"] = currentData.deviceName;
62  doc["student"] = currentData.studentName;
63  doc["sensor_type"] = "light";
64  doc["light_level"] = currentData.lightLevel;
65  doc["raw_value"] = currentData.rawValue;
66  doc["auto_light_on"] = currentData.autoLightOn;
67  doc["mode"] = currentData.lightMode;
68  doc["timestamp"] = millis();
69  doc["location"] = "Кабинет информатики";
70  
71  String jsonString;
72  serializeJson(doc, jsonString);
73  return jsonString;
74}
75
76// 📊 Сбор статистики для аналитики
77void collectLightStatistics() {
78  static int measurementCount = 0;
79  static long lightSum = 0;
80  static int lastToggleCount = 0;
81  
82  measurementCount++;
83  lightSum += readLightPercent();
84  
85  // 📈 Каждые 10 измерений обновляем среднее
86  if (measurementCount >= 10) {
87    currentData.averageLight = (float)lightSum / measurementCount;
88    measurementCount = 0;
89    lightSum = 0;
90  }
91  
92  // 🔄 Подсчет переключений системы освещения
93  static bool lastLightState = false;
94  if (lightSystemOn != lastLightState) {
95    currentData.toggleCount++;
96    lastLightState = lightSystemOn;
97  }
98}

📱 “Веб-интерфейс для мониторинга освещения”

Отображение данных на школьном дашборде:

 1🖥️ ВЕБ-ПАНЕЛЬ МОНИТОРИНГА ОСВЕЩЕНИЯ:
 2
 3┌─────────────────────────────────────────────────┐
 4│ 💡 СИСТЕМА ОСВЕЩЕНИЯ - КЛАСС 5А                │
 5│ Обновлено: 2025-05-27 15:30:04                  │
 6├─────────────────────────────────────────────────┤
 7│ 📊 АКТИВНЫЕ ДАТЧИКИ ОСВЕЩЕННОСТИ: 6            │
 8│                                                 │
 9│ 🤖 ESP32_Команда1 | Иван Петров               │
10│    💡 Освещенность: 45% | Авто-свет: ВЫКЛ      │
11│    📈 Средняя за час: 52% | Переключений: 3    │
12│                                                 │
13│ 🤖 ESP32_Команда2 | Мария Сидорова            │
14│    💡 Освещенность: 23% | Авто-свет: ВКЛ       │
15│    📈 Средняя за час: 38% | Переключений: 5    │
16├─────────────────────────────────────────────────┤
17│ 📈 [График освещенности класса за день]        │
18│ 💡 [График работы автоматического освещения]   │
19│ ⚡ [Статистика энергопотребления]               │
20├─────────────────────────────────────────────────┤
21│ 🎛️ УПРАВЛЕНИЕ:                                 │
22│ [Настроить пороги] [Режим экономии] [Расписание]│
23└─────────────────────────────────────────────────┘
24
25🎯 АНАЛИТИКА ОСВЕЩЕНИЯ:
26- Среднее время работы авто-света: 2.3 часа/день
27- Экономия электроэнергии: 23% по сравнению с ручным режимом  
28- Пиковая освещенность: 89% (окно, 12:15)
29- Минимальная освещенность: 8% (под партой, 14:23)

🎨 Творческое задание: “Умная система освещения класса” (12 минут)

🏠 “Создание интеллектуальной системы освещения”

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

 1🎯 ПРОЕКТ "УМНОЕ ОСВЕЩЕНИЕ КЛАССА 5А":
 2
 3Обязательные функции:
 4✅ Автоматическое включение/выключение по освещенности
 5✅ Плавное изменение яркости (fade in/out)
 6✅ Система предотвращения мигания (гистерезис)
 7✅ Калибровка под условия класса
 8✅ Отправка данных на школьный сервер
 9
10Дополнительные функции (выбрать 2-3):
11🌅 Режим "Рассвет" - имитация естественного освещения
12⚡ Энергосберегающий режим с детекцией активности
13📅 Программируемое расписание работы
14🎨 Цветовая индикация уровня освещенности (RGB)
15🔊 Звуковые уведомления о критических изменениях
16📊 Детальная статистика и аналитика
17🎮 Управление через Serial команды
18📱 Мобильное приложение (web-интерфейс)

📋 “Паспорт умной системы освещения”

Документация проекта:

 1📄 ПАСПОРТ СИСТЕМЫ ОСВЕЩЕНИЯ
 2Команда: _________________ Дата: 2025-05-27
 3
 4🎯 НАЗВАНИЕ: "LightMaster [название_команды]"
 5
 6⚙️ ТЕХНИЧЕСКИЕ ХАРАКТЕРИСТИКИ:
 7- Датчик: Фоторезистор + делитель напряжения
 8- Диапазон измерений: 0-100% освещенности
 9- Точность: ±5% после калибровки
10- Время отклика: _____ секунд
11- Плавность изменения: _____ секунд fade
12- Гистерезис: _____% (предотвращение мигания)
13
14🔧 СХЕМА И ПОДКЛЮЧЕНИЕ:
15[Рисунок схемы подключения]
16- Фоторезистор: между +3.3V и GPIO 34
17- Постоянный резистор: _____ кОм
18- Исполнительное устройство: GPIO _____
19
20💻 ПРОГРАММНЫЕ ВОЗМОЖНОСТИ:
21□ Базовая автоматика вкл/выкл
22□ Плавное изменение яркости
23□ Система гистерезиса
24□ Автоматическая калибровка
25□ Отправка данных на сервер
26□ Дополнительная функция 1: _______________
27□ Дополнительная функция 2: _______________
28□ Дополнительная функция 3: _______________
29
30📊 КАЛИБРОВКА И ТЕСТИРОВАНИЕ:
31Условия калибровки:
32- Максимальная освещенность: прямой солнечный свет
33- Минимальная освещенность: закрытый датчик
34- Диапазон сырых значений: _____ - _____
35- Диапазон в процентах: 0% - 100%
36
37Тестовые сценарии:
38□ Постепенное затемнение комнаты
39□ Резкое включение/выключение света
40□ Частичное закрытие окна
41□ Движение тени по датчику
42□ Длительная работа (>30 минут)
43
44🌟 УНИКАЛЬНЫЕ ОСОБЕННОСТИ:
45Наша "фишка": ____________________________
46__________________________________________
47
48Отличие от других команд: _______________
49__________________________________________
50
51📈 РЕЗУЛЬТАТЫ ИСПЫТАНИЙ:
52Время работы без сбоев: _____ минут
53Количество ложных срабатываний: _____
54Энергоэффективность: ____% экономии
55Скорость реакции на изменения: _____ сек
56
57✅ ПРОВЕРКА ФУНКЦИОНАЛЬНОСТИ:
58□ Система включается в темноте
59□ Система выключается при достаточном свете  
60□ Нет мигания при пограничных условиях
61□ Плавное изменение яркости работает
62□ Данные корректно отправляются на сервер
63□ Все дополнительные функции работают
64
65🏆 САМООЦЕНКА ПРОЕКТА:
66Техническая сложность: ⭐⭐⭐⭐⭐
67Креативность решения: ⭐⭐⭐⭐⭐
68Стабильность работы: ⭐⭐⭐⭐⭐
69Пользовательский интерфейс: ⭐⭐⭐⭐⭐
70Общая оценка: ⭐⭐⭐⭐⭐

🎪 “Выставка систем умного освещения”

Презентация и демонстрация:

  • Каждая команда демонстрирует свою систему (4 минуты)
  • Показывает реакцию на изменение освещенности
  • Демонстрирует уникальные функции
  • Проводит сравнительные тесты с другими командами
  • Объясняет техническое решение и алгоритмы

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

💡 “Викторина световых технологий”

Быстрые вопросы с демонстрацией:

1❓ ПОКАЖИ НА ДАТЧИКЕ:
21. Где сопротивление больше - на свету или в темноте? (закрыть/открыть)
32. Сколько процентов должно быть для включения света? (показать пальцами)
43. Что такое гистерезис? (показать руками "зону неопределенности")
54. Зачем нужна плавность? (плавно поднять/опустить руку)

📊 “Шкала мастерства умного освещения”

 1🎚️ УРОВЕНЬ ВЛАДЕНИЯ СВЕТОВЫМИ СИСТЕМАМИ:
 2
 3🏆 Инженер освещения (100%):
 4"Создаю сложные системы, понимаю алгоритмы, интегрирую с IoT"
 5
 6🥇 Программист автоматики (75%):
 7"Программирую автоматические системы, настраиваю пороги и режимы"
 8
 9🥈 Техник-электронщик (50%):
10"Подключаю датчики освещенности, понимаю принципы работы"
11
12🥉 Световой новичок (25%):
13"Знаю что такое фоторезистор и автоматическое освещение"
14
15Покажите рукой свой уровень!

💭 “Световые размышления”

Каждый ученик завершает фразу:

  • “Автоматическое освещение полезно потому что…”
  • “Самое сложное в датчиках света…”
  • “В моем доме я бы установил…”
  • “Удивило меня то что…”

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

💡 “Домашний световой инженер”

Основное задание:

  1. Исследование домашнего освещения

    • Измерить освещенность в разных комнатах в разное время
    • Найти места, где нужно автоматическое освещение
    • Посчитать потенциальную экономию энергии
  2. Эксперименты с программой

    • Настроить пороги под домашние условия
    • Добавить новый режим работы (например, “Чтение”)
    • Попробовать разные алгоритмы плавности
  3. Дневник светового инженера

 1📔 МОЙ ДНЕВНИК СВЕТОВОГО ИНЖЕНЕРА - УРОК 13
 2
 3💡 ГЛАВНЫЕ ОТКРЫТИЯ:
 4- Фоторезистор работает так: ________________
 5- Делитель напряжения нужен для: ____________
 6- Гистерезис предотвращает: _________________
 7
 8🔧 МОЯ СИСТЕМА ОСВЕЩЕНИЯ:
 9Порог включения: ____%
10Порог выключения: ____%
11Время плавности: ____ секунд
12Самая крутая функция: ______________________
13
14🏠 ДОМАШНИЕ ИЗМЕРЕНИЯ:
15Кухня утром: ____%    |  Кухня вечером: ____%
16Спальня днем: ____%   |  Спальня ночью: ____%
17Коридор: ____%        |  Ванная: ____%
18
19Где нужна автоматика: _______________________
20Потенциальная экономия: ____% электричества
21
22💻 ПРОГРАММНЫЕ ДОСТИЖЕНИЯ:
23Сложность моего алгоритма: ⭐⭐⭐⭐⭐
24Какую ошибку исправил: ______________________
25Новая функция которую добавил: ______________
26
27🌟 ИДЕИ ДЛЯ РАЗВИТИЯ:
281. _________________________________________
292. _________________________________________
303. _________________________________________

🔬 Исследовательское задание (для увлеченных):

  • Изучить профессиональные датчики освещенности (люксметры)
  • Найти информацию о стандартах освещенности для разных помещений
  • Исследовать системы умного освещения в продаже

🎨 Творческое задание:

  • Нарисовать план умного дома с системой автоматического освещения
  • Создать инфографику “Экономия энергии с умным освещением”

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

“Отлично” (5):

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

“Хорошо” (4):

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

“Удовлетворительно” (3):

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

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

Для каждой команды (3-4 человека):

  • ESP32 DevKit плата
  • Фоторезистор (LDR) 5-10 кОм
  • Резистор 10 кОм (для делителя напряжения)
  • Светодиод + резистор 220 Ом (для индикации)
  • Макетная плата и провода
  • Мультиметр для диагностики

Для демонстраций учителем:

  • Различные источники света (фонарик, лампа, солнечный свет)
  • Люксметр для эталонных измерений
  • Осциллограф для демонстрации аналоговых сигналов
  • Различные типы фоторезисторов для сравнения

Программное обеспечение:

  • Arduino IDE с библиотеками для работы с аналоговыми датчиками
  • Serial Plotter для визуализации изменений освещенности
  • Веб-интерфейс школьного сервера для мониторинга

Дополнительные компоненты (для продвинутых проектов):

  • RGB светодиод для цветовой индикации
  • Потенциометр для ручной настройки порогов
  • LCD дисплей для отображения текущих значений
  • Реле для управления внешними нагрузками
  • PIR датчик движения для комбинированных систем

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

Подготовка к уроку:

  1. Тестирование датчиков: Проверить все фоторезисторы на различия в характеристиках
  2. Условия освещения: Подготовить возможность изменения освещенности в классе
  3. Эталонные измерения: Подготовить люксметр для сравнения с самодельными датчиками
  4. Схемы подключения: Создать крупные наглядные схемы делителей напряжения

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

Проблема: Большой разброс характеристик фоторезисторов Решение: Обязательная индивидуальная калибровка каждого датчика

Проблема: Нестабильность показаний из-за внешнего освещения Решение: Использование усреднения, экранирование датчиков

Проблема: Сложность понимания концепции гистерезиса Решение: Физическая демонстрация с термостатом или другими примерами

Безопасность:

  • Контроль яркости источников света (не использовать слишком яркие)
  • Правильное подключение питания к делителям напряжения
  • Осторожность при работе с паяльными принадлежностями (если используются)

Дифференциация обучения:

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

Связь с реальным миром:

  • Уличное освещение с датчиками движения и света
  • Системы умного дома
  • Автомобильные фары с автоматическим включением
  • Энергосберегающие технологии в офисах и торговых центрах

Межпредметные связи:

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

Развитие проекта:

  • Добавление датчиков движения для комплексных систем
  • Интеграция с системами климат-контроля
  • Создание мобильного приложения для управления
  • Анализ больших данных об освещенности для оптимизации