💡 Датчик освещенности
🎯 Цели и планируемые результаты урока
Предметные результаты:
- Понимание принципов работы фоторезисторов и фотодиодов
- Освоение методов измерения освещенности аналоговыми датчиками
- Навыки калибровки световых датчиков
- Умение создавать системы автоматического управления освещением
- Практические навыки работы с делителями напряжения в датчиках
- Создание умных устройств, реагирующих на освещение
Метапредметные результаты:
- Развитие понимания взаимосвязи между физическими явлениями и электроникой
- Формирование навыков калибровки и настройки измерительных систем
- Умение анализировать изменения окружающей среды
- Развитие навыков создания адаптивных систем
Личностные результаты:
- Понимание роли освещения в жизни человека
- Развитие экологического сознания (энергосбережение)
- Формирование интереса к автоматизации бытовых процессов
🚀 Мотивационное начало (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 ├─── Фоторезистор (переменный)
10 │
11 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📔 МОЙ ДНЕВНИК СВЕТОВОГО ИНЖЕНЕРА - УРОК 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 датчик движения для комбинированных систем
🔍 Методические заметки для учителя
Подготовка к уроку:
- Тестирование датчиков: Проверить все фоторезисторы на различия в характеристиках
- Условия освещения: Подготовить возможность изменения освещенности в классе
- Эталонные измерения: Подготовить люксметр для сравнения с самодельными датчиками
- Схемы подключения: Создать крупные наглядные схемы делителей напряжения
Возможные сложности:
Проблема: Большой разброс характеристик фоторезисторов Решение: Обязательная индивидуальная калибровка каждого датчика
Проблема: Нестабильность показаний из-за внешнего освещения Решение: Использование усреднения, экранирование датчиков
Проблема: Сложность понимания концепции гистерезиса Решение: Физическая демонстрация с термостатом или другими примерами
Безопасность:
- Контроль яркости источников света (не использовать слишком яркие)
- Правильное подключение питания к делителям напряжения
- Осторожность при работе с паяльными принадлежностями (если используются)
Дифференциация обучения:
- Для продвинутых: изучение цифровых датчиков освещенности, сложные алгоритмы
- Для начинающих: готовые схемы, упрощенные пороговые алгоритмы
- Для визуалов: графики изменения освещенности, схемы и диаграммы
- Для практиков: больше экспериментов с различными источниками света
Связь с реальным миром:
- Уличное освещение с датчиками движения и света
- Системы умного дома
- Автомобильные фары с автоматическим включением
- Энергосберегающие технологии в офисах и торговых центрах
Межпредметные связи:
- Физика: оптика, полупроводники, фотоэффект
- Экология: энергосбережение, влияние искусственного освещения
- Математика: работа с процентами, пропорции, графики функций
- ОБЖ: правильное освещение рабочих мест
Развитие проекта:
- Добавление датчиков движения для комплексных систем
- Интеграция с системами климат-контроля
- Создание мобильного приложения для управления
- Анализ больших данных об освещенности для оптимизации