👏 Звуковой датчик
🎯 Цели и планируемые результаты урока
Предметные результаты:
- Понимание принципов работы звуковых датчиков и микрофонов
- Освоение методов измерения звукового давления и громкости
- Навыки работы с аналоговыми и цифровыми звуковыми сигналами
- Умение создавать системы звуковой активации
- Практические навыки фильтрации и обработки звуковых данных
- Создание интерактивных устройств, реагирующих на звук
Метапредметные результаты:
- Развитие понимания акустических явлений в электронике
- Формирование навыков работы с зашумленными сигналами
- Умение создавать адаптивные пороговые системы
- Развитие навыков отладки чувствительных измерительных систем
Личностные результаты:
- Понимание роли звука в жизни человека и технике
- Развитие творческого подхода к созданию интерактивных устройств
- Формирование экологического сознания (контроль шумового загрязнения)
🚀 Мотивационное начало (8 минут)
“Электронные уши - учим ESP32 слышать мир”
Учитель демонстрирует ESP32 со звуковым датчиком, который реагирует на хлопки, речь и музыку
🎵 Интерактивная демонстрация “Звуковая магия”:
1👏 Хлопок в ладоши → Светодиод мигает
2🗣️ Произносим "Привет!" → Система отвечает световым сигналом
3🎵 Включаем музыку → Светодиод "танцует" в ритм
4🤫 Полная тишина → Система переходит в спящий режим
5📢 Громкий звук → Активируется "режим тревоги"
🎭 Аналогия “Электронное ухо”:
1👂 УХО ЧЕЛОВЕКА ↔ 🎤 ЗВУКОВОЙ ДАТЧИК
2Барабанная перепонка колеблется ↔ Мембрана микрофона вибрирует
3Преобразует звук в нервные сигналы ↔ Преобразует звук в электричество
4Мозг анализирует громкость ↔ ESP32 измеряет амплитуду
5Реакция на важные звуки ↔ Программа принимает решения
🏠 Демонстрация умных применений:
1🚨 ОХРАННАЯ СИСТЕМА: Звук разбитого стекла → Сигнал тревоги
2🎵 МУЗЫКАЛЬНЫЙ АНАЛИЗАТОР: Ритм песни → Световое шоу
3👶 РАДИОНЯНЯ: Плач ребенка → Уведомление родителям
4📢 КОНТРОЛЬ ШУМА: Превышение 80дБ → Автоматическое предупреждение
5🎮 ИГРОВОЙ КОНТРОЛЛЕР: Хлопки → Управление персонажем
🌟 Интрига урока: “Сегодня мы подарим ESP32 способность слышать и создадим устройства, которые будут реагировать на наш голос!”
🎯 Вызов дня: “К концу урока ваш ESP32 будет управляться хлопками и сможет определять уровень шума в классе!”
📖 Основная часть урока
Блок 1: “Принципы работы звуковых датчиков” (14 минут)
🎤 “Микрофон - преобразователь звука в электричество”
Физические основы звуковых датчиков:
1🌊 ПРИНЦИП РАБОТЫ ЭЛЕКТРЕТНОГО МИКРОФОНА:
2
3🎵 ЗВУКОВАЯ ВОЛНА:
4- Звук = колебания воздуха с частотой 20Гц - 20кГц
5- Громкость = амплитуда колебаний (измеряется в децибелах)
6- Тембр = спектр частот (форма волны)
7
8🎤 ПРЕОБРАЗОВАНИЕ В ЭЛЕКТРИЧЕСТВО:
91. Звук заставляет вибрировать мембрану микрофона
102. Мембрана изменяет расстояние до электрода
113. Изменяется емкость между электродами
124. Это создает переменное напряжение (AC)
135. Усилитель преобразует в сигнал 0-3.3В (DC)
14
15📊 ХАРАКТЕРИСТИКИ ЗВУКА:
16Шепот: 20-30 дБ = 0.3-0.5В на выходе
17Разговор: 40-60 дБ = 0.8-1.5В на выходе
18Крик: 80-90 дБ = 2.0-2.8В на выходе
19Болевой порог: 120+ дБ = 3.0+ В (опасно!)
🔧 “Модуль KY-038 - готовое решение”
Изучение популярного звукового модуля:
1📋 ТЕХНИЧЕСКИЕ ХАРАКТЕРИСТИКИ KY-038:
2
3🎤 МИКРОФОН:
4- Тип: Электретный конденсаторный
5- Чувствительность: -60дБ ±3дБ
6- Частотный диапазон: 20Гц - 20кГц
7- Направленность: Всенаправленный
8
9⚡ ЭЛЕКТРОНИКА:
10- Рабочее напряжение: 3.3-5В
11- Ток потребления: 4-5мА
12- Встроенный усилитель: LM358
13- Регулируемая чувствительность (потенциометр)
14
15🔌 ВЫХОДЫ:
16AO (Analog Out): Аналоговый сигнал 0-3.3В
17DO (Digital Out): Цифровой сигнал HIGH/LOW
18VCC: Питание +3.3В или +5В
19GND: Общий провод
20
21💡 ИНДИКАТОРЫ:
22Power LED: Питание подключено
23Signal LED: Сигнал превышает порог (только для DO)
📊 “Аналоговый vs Цифровой выход”
Сравнение режимов работы:
1📈 АНАЛОГОВЫЙ ВЫХОД (AO):
2
3✅ ПРЕИМУЩЕСТВА:
4- Полная информация о громкости
5- Можно измерять точный уровень звука
6- Возможность частотного анализа
7- Подходит для музыкальных приложений
8
9❌ НЕДОСТАТКИ:
10- Требует калибровки
11- Чувствителен к помехам
12- Нужна обработка сигнала
13- Более сложное программирование
14
15🎯 ПРИМЕНЕНИЕ: Измерение громкости, анализ звука
16
17──────────────────────────────────────────────
18
19🔲 ЦИФРОВОЙ ВЫХОД (DO):
20
21✅ ПРЕИМУЩЕСТВА:
22- Простота использования
23- Настраиваемый порог (потенциометр)
24- Помехоустойчивость
25- Быстрая реакция
26
27❌ НЕДОСТАТКИ:
28- Только есть/нет звука
29- Нет информации о громкости
30- Фиксированный порог
31- Ограниченная функциональность
32
33🎯 ПРИМЕНЕНИЕ: Звуковая активация, охрана
🧪 Практическое исследование “Поведение звукового датчика”
Эксперименты с различными звуками:
1🔬 ЛАБОРАТОРИЯ ЗВУКОВЫХ ИЗМЕРЕНИЙ:
2
3Эксперимент 1: Калибровка громкости
4Оборудование: KY-038, осциллограф/мультиметр, источники звука
5
6📊 ТАБЛИЦА ИЗМЕРЕНИЙ:
7┌─────────────────────┬────────────┬──────────┬─────────┐
8│ Источник звука │ Расстояние │ Напряжение│ Примечание│
9├─────────────────────┼────────────┼──────────┼─────────┤
10│ Тишина │ - │ _____ В │ Фон │
11│ Шепот │ 10см │ _____ В │ │
12│ Нормальная речь │ 30см │ _____ В │ │
13│ Хлопок в ладоши │ 50см │ _____ В │ Пик │
14│ Крик │ 1м │ _____ В │ Макс │
15│ Музыка (средняя) │ 20см │ _____ В │ Ритм │
16└─────────────────────┴────────────┴──────────┴─────────┘
17
18Эксперимент 2: Частотная характеристика
19- Низкий тон (гудение): _____ В
20- Средний тон (речь): _____ В
21- Высокий тон (свист): _____ В
22- Вывод: Какие частоты лучше воспринимает датчик?
23
24Эксперимент 3: Направленность
25- Звук спереди: _____ В
26- Звук сбоку: _____ В
27- Звук сзади: _____ В
28- Вывод: Насколько направленный микрофон?
🔍 “Помехи и фильтрация сигналов”
Проблемы реальных измерений:
1🚨 ТИПИЧНЫЕ ПОМЕХИ В ЗВУКОВЫХ ДАТЧИКАХ:
2
3⚡ ЭЛЕКТРОМАГНИТНЫЕ ПОМЕХИ:
4Источники: WiFi, Bluetooth, сотовые телефоны
5Проявление: Постоянный фон, ложные срабатывания
6Решение: Экранирование, фильтрация, правильная разводка
7
8🌊 ВИБРАЦИИ:
9Источники: Движение датчика, удары по столу
10Проявление: Резкие выбросы сигнала
11Решение: Механическая изоляция, программная фильтрация
12
13🔊 АКУСТИЧЕСКИЕ ПОМЕХИ:
14Источники: Эхо, резонанс, фоновый шум
15Проявление: Ложные пики, нестабильный фон
16Решение: Правильное размещение, адаптивные пороги
17
18💻 ЦИФРОВЫЕ ПОМЕХИ:
19Источники: ШИМ, тактовые частоты, переключения GPIO
20Проявление: Регулярные пики на определенных частотах
21Решение: Разделение аналоговой и цифровой частей
Блок 2: “Подключение и программирование звукового датчика” (16 минут)
🔌 “Схема подключения KY-038”
Правильное подключение к ESP32:
1🛠️ СХЕМА ПОДКЛЮЧЕНИЯ ЗВУКОВОГО ДАТЧИКА:
2
3 ESP32 KY-038
4 ┌─────────┐ ┌─────────┐
5 │ 3.3V │──────────────│ VCC │
6 │ GPIO 34 │──────────────│ AO │ (аналоговый)
7 │ GPIO 35 │──────────────│ DO │ (цифровой)
8 │ GND │──────────────│ GND │
9 └─────────┘ └─────────┘
10 │ 🎛️ │
11 │ Потенц. │ (настройка порога)
12 └─────────┘
13
14⚠️ ВАЖНЫЕ МОМЕНТЫ:
151. Использовать только аналоговые GPIO (32-39)
162. VCC можно подключить к 3.3V или 5V
173. При 5V питании чувствительность выше
184. Потенциометр настраивает только DO выход
195. Не забыть общий GND!
20
21🔧 ДОПОЛНИТЕЛЬНЫЕ КОМПОНЕНТЫ:
22- Конденсатор 100мкФ между VCC-GND (сглаживание питания)
23- Резистор 1кОм последовательно с DO (защита GPIO)
24- Экранированный кабель для AO (защита от помех)
💻 “Базовая программа чтения звука”
Код с обработкой аналогового сигнала:
1// 🎤 ПРОГРАММА ЗВУКОВОГО ДАТЧИКА
2// Урок 14: Измерение уровня звука и звуковая активация
3
4// 🔧 Настройки пинов
5const int SOUND_ANALOG_PIN = 34; // Аналоговый вход (AO)
6const int SOUND_DIGITAL_PIN = 35; // Цифровой вход (DO)
7const int LED_PIN = 2; // Светодиод для индикации
8const int EXTERNAL_LED_PIN = 5; // Внешний светодиод
9
10// 📊 Параметры измерения
11const int SAMPLES_COUNT = 50; // Количество измерений для усреднения
12const int SAMPLE_DELAY = 2; // Задержка между измерениями (мс)
13const int NOISE_THRESHOLD = 100; // Порог обнаружения звука
14const int CLAP_THRESHOLD = 300; // Порог обнаружения хлопка
15
16// 📈 Переменные для анализа
17int baselineNoise = 0; // Уровень фонового шума
18int maxSoundLevel = 0; // Максимальный уровень за период
19int avgSoundLevel = 0; // Средний уровень звука
20bool soundDetected = false; // Флаг обнаружения звука
21unsigned long lastSoundTime = 0; // Время последнего звука
22
23void setup() {
24 Serial.begin(9600);
25 Serial.println("🎤 Инициализация звукового датчика");
26
27 // 🔧 Настройка пинов
28 pinMode(LED_PIN, OUTPUT);
29 pinMode(EXTERNAL_LED_PIN, OUTPUT);
30 pinMode(SOUND_DIGITAL_PIN, INPUT);
31
32 Serial.println("🔇 Калибровка фонового шума...");
33 Serial.println(" (Соблюдайте тишину 5 секунд)");
34
35 // 🎯 Калибровка фонового шума
36 calibrateBaseline();
37
38 Serial.printf("✅ Калибровка завершена! Фон: %d\n", baselineNoise);
39 Serial.println("📊 Формат: Сырой | Уровень | Состояние | Тип");
40 Serial.println("─────────────────────────────────────────────");
41}
42
43void loop() {
44 // 📖 Читаем текущий уровень звука
45 int currentLevel = readSoundLevel();
46
47 // 📊 Анализируем звуковой сигнал
48 String soundAnalysis = analyzeSoundLevel(currentLevel);
49
50 // 🎵 Обнаружение специальных звуков
51 detectSpecialSounds(currentLevel);
52
53 // 💡 Управление светодиодами
54 updateLEDs(currentLevel);
55
56 // 📊 Вывод данных
57 printSoundStatus(currentLevel, soundAnalysis);
58
59 delay(100); // Обновление 10 раз в секунду
60}
61
62// 🎯 Функция калибровки фонового шума
63void calibrateBaseline() {
64 long sum = 0;
65 int measurements = 100;
66
67 for (int i = 0; i < measurements; i++) {
68 sum += analogRead(SOUND_ANALOG_PIN);
69 delay(50);
70
71 // 📈 Показываем прогресс
72 if (i % 20 == 0) {
73 Serial.printf("🔇 Калибровка: %d%%\n", (i * 100) / measurements);
74 }
75 }
76
77 baselineNoise = sum / measurements;
78}
79
80// 📖 Функция чтения уровня звука с усреднением
81int readSoundLevel() {
82 long sum = 0;
83 int maxVal = 0;
84 int minVal = 4095;
85
86 // 📊 Собираем выборку измерений
87 for (int i = 0; i < SAMPLES_COUNT; i++) {
88 int reading = analogRead(SOUND_ANALOG_PIN);
89 sum += reading;
90
91 if (reading > maxVal) maxVal = reading;
92 if (reading < minVal) minVal = reading;
93
94 delay(SAMPLE_DELAY);
95 }
96
97 // 📈 Вычисляем среднее и размах
98 avgSoundLevel = sum / SAMPLES_COUNT;
99 int range = maxVal - minVal; // Размах = показатель активности
100
101 // 🔊 Возвращаем размах как меру громкости
102 return range;
103}
104
105// 🔍 Функция анализа уровня звука
106String analyzeSoundLevel(int level) {
107 // 📊 Вычисляем уровень относительно фона
108 int relativeLevel = level;
109
110 if (relativeLevel < NOISE_THRESHOLD) {
111 soundDetected = false;
112 return "🔇 Тишина";
113 } else if (relativeLevel < NOISE_THRESHOLD * 2) {
114 soundDetected = true;
115 return "🔉 Тихий звук";
116 } else if (relativeLevel < NOISE_THRESHOLD * 4) {
117 soundDetected = true;
118 return "🔊 Громкий звук";
119 } else {
120 soundDetected = true;
121 return "📢 Очень громко!";
122 }
123}
124
125// 👏 Функция обнаружения специальных звуков
126void detectSpecialSounds(int level) {
127 static int previousLevel = 0;
128 static unsigned long lastClapTime = 0;
129 static int clapCount = 0;
130
131 // 👏 Обнаружение хлопка (резкий скачок громкости)
132 if (level > CLAP_THRESHOLD && previousLevel < NOISE_THRESHOLD) {
133 unsigned long currentTime = millis();
134
135 // 🕐 Проверяем, не слишком ли быстро повторяется
136 if (currentTime - lastClapTime > 200) { // Минимум 200мс между хлопками
137 clapCount++;
138 lastClapTime = currentTime;
139
140 Serial.printf("👏 ХЛОПОК обнаружен! (№%d) Уровень: %d\n", clapCount, level);
141
142 // 🎯 Реакция на хлопок
143 onClapDetected(clapCount);
144 }
145 }
146
147 // 🕐 Сброс счетчика хлопков через 3 секунды
148 if (millis() - lastClapTime > 3000) {
149 if (clapCount > 0) {
150 Serial.printf("🏁 Серия из %d хлопков завершена\n", clapCount);
151 clapCount = 0;
152 }
153 }
154
155 previousLevel = level;
156}
157
158// 🎯 Функция реакции на хлопок
159void onClapDetected(int clapNumber) {
160 // 💡 Мигаем светодиодом количество раз = номер хлопка
161 for (int i = 0; i < clapNumber; i++) {
162 digitalWrite(EXTERNAL_LED_PIN, HIGH);
163 delay(100);
164 digitalWrite(EXTERNAL_LED_PIN, LOW);
165 delay(100);
166 }
167
168 // 🎵 Различные реакции на количество хлопков
169 switch (clapNumber) {
170 case 1:
171 Serial.println("💡 Одиночный хлопок - переключение основного света");
172 break;
173 case 2:
174 Serial.println("🌙 Двойной хлопок - режим ночника");
175 break;
176 case 3:
177 Serial.println("🚨 Тройной хлопок - режим тревоги");
178 break;
179 default:
180 Serial.println("🎉 Много хлопков - праздничный режим!");
181 break;
182 }
183}
184
185// 💡 Функция управления светодиодами
186void updateLEDs(int soundLevel) {
187 // 📊 Встроенный светодиод показывает наличие звука
188 digitalWrite(LED_PIN, soundDetected);
189
190 // 🌈 Внешний светодиод показывает громкость
191 int brightness = map(soundLevel, 0, 1000, 0, 255);
192 brightness = constrain(brightness, 0, 255);
193 analogWrite(EXTERNAL_LED_PIN, brightness);
194
195 // 🔊 Цифровой выход для сравнения
196 bool digitalSound = digitalRead(SOUND_DIGITAL_PIN);
197 if (digitalSound != soundDetected) {
198 Serial.printf("⚠️ Расхождение: Аналог=%s, Цифра=%s\n",
199 soundDetected ? "ДА" : "НЕТ",
200 digitalSound ? "ДА" : "НЕТ");
201 }
202}
203
204// 📊 Функция вывода статуса звука
205void printSoundStatus(int level, String analysis) {
206 static unsigned long lastPrint = 0;
207
208 if (millis() - lastPrint >= 500) { // Каждые 0.5 секунды
209 Serial.printf("🎤 Сырой: %4d | Уровень: %3d | %s\n",
210 avgSoundLevel, level, analysis.c_str());
211 lastPrint = millis();
212 }
213}
🎛️ “Адаптивные пороги и фильтрация”
Умная обработка звукового сигнала:
1// 🧠 ПРОДВИНУТАЯ ОБРАБОТКА ЗВУКА
2
3// 📊 Структура для хранения статистики
4struct SoundStatistics {
5 int minLevel;
6 int maxLevel;
7 float avgLevel;
8 int peakCount;
9 unsigned long analysisStartTime;
10};
11
12SoundStatistics stats = {4095, 0, 0, 0, 0};
13
14// 📈 Функция адаптивного порога
15int calculateAdaptiveThreshold() {
16 static unsigned long lastUpdate = 0;
17 static int adaptiveThreshold = NOISE_THRESHOLD;
18
19 // 🕐 Обновляем порог каждые 10 секунд
20 if (millis() - lastUpdate > 10000) {
21 // 📊 Анализируем последнюю статистику
22 float backgroundLevel = stats.avgLevel;
23 float dynamicRange = stats.maxLevel - stats.minLevel;
24
25 // 🎯 Вычисляем новый порог
26 adaptiveThreshold = backgroundLevel + (dynamicRange * 0.3);
27
28 // 🔒 Ограничиваем разумными пределами
29 adaptiveThreshold = constrain(adaptiveThreshold, 50, 500);
30
31 Serial.printf("🎯 Адаптивный порог обновлен: %d\n", adaptiveThreshold);
32
33 // 🔄 Сбрасываем статистику
34 resetStatistics();
35 lastUpdate = millis();
36 }
37
38 return adaptiveThreshold;
39}
40
41// 🌊 Функция цифрового фильтра (простой FIR)
42int applyDigitalFilter(int newSample) {
43 static int buffer[5] = {0}; // Буфер для 5 последних значений
44 static int index = 0;
45
46 // 📝 Добавляем новое значение в буфер
47 buffer[index] = newSample;
48 index = (index + 1) % 5;
49
50 // 📊 Вычисляем взвешенное среднее
51 int filtered = (buffer[0] + buffer[1]*2 + buffer[2]*3 + buffer[3]*2 + buffer[4]) / 9;
52
53 return filtered;
54}
55
56// 🔍 Функция обнаружения речи
57bool detectSpeech(int soundLevel) {
58 static int speechPattern[10];
59 static int patternIndex = 0;
60 static bool inSpeech = false;
61
62 // 📝 Записываем паттерн активности
63 speechPattern[patternIndex] = (soundLevel > NOISE_THRESHOLD) ? 1 : 0;
64 patternIndex = (patternIndex + 1) % 10;
65
66 // 📊 Анализируем паттерн (речь = ритмичные изменения)
67 int transitions = 0;
68 for (int i = 0; i < 9; i++) {
69 if (speechPattern[i] != speechPattern[i+1]) {
70 transitions++;
71 }
72 }
73
74 // 🗣️ Речь характеризуется 3-7 переходами в окне
75 bool speechDetected = (transitions >= 3 && transitions <= 7);
76
77 if (speechDetected != inSpeech) {
78 inSpeech = speechDetected;
79 Serial.printf("🗣️ Речь: %s (переходов: %d)\n",
80 speechDetected ? "ОБНАРУЖЕНА" : "ЗАВЕРШЕНА", transitions);
81 }
82
83 return speechDetected;
84}
85
86// 📊 Функция сбора статистики
87void updateStatistics(int level) {
88 if (level < stats.minLevel) stats.minLevel = level;
89 if (level > stats.maxLevel) stats.maxLevel = level;
90
91 // 📈 Скользящее среднее
92 static float alpha = 0.1; // Коэффициент сглаживания
93 stats.avgLevel = alpha * level + (1 - alpha) * stats.avgLevel;
94
95 // 🔊 Подсчет пиков
96 static int lastLevel = 0;
97 if (level > lastLevel + 100) { // Резкий рост = пик
98 stats.peakCount++;
99 }
100 lastLevel = level;
101}
102
103// 🔄 Сброс статистики
104void resetStatistics() {
105 stats.minLevel = 4095;
106 stats.maxLevel = 0;
107 stats.avgLevel = 0;
108 stats.peakCount = 0;
109 stats.analysisStartTime = millis();
110}
Блок 3: “Создание интерактивных звуковых устройств” (15 минут)
👏 “Система управления хлопками”
Умное устройство с звуковым управлением:
1// 👏 СИСТЕМА УПРАВЛЕНИЯ ХЛОПКАМИ v2.0
2
3// 🎯 Команды и их паттерны хлопков
4enum ClapCommand {
5 CMD_NONE,
6 CMD_LIGHT_TOGGLE, // 1 хлопок
7 CMD_NIGHT_MODE, // 2 хлопка
8 CMD_ALARM_MODE, // 3 хлопка
9 CMD_MUSIC_MODE, // 4 хлопка
10 CMD_SYSTEM_RESET // 5 хлопков
11};
12
13// 🕐 Параметры распознавания
14const unsigned long CLAP_TIMEOUT = 3000; // 3 сек на серию хлопков
15const unsigned long MIN_CLAP_INTERVAL = 150; // Мин. интервал между хлопками
16const unsigned long MAX_CLAP_INTERVAL = 800; // Макс. интервал в серии
17const int CLAP_SENSITIVITY = 300; // Чувствительность
18
19// 📊 Переменные состояния системы
20struct SystemState {
21 bool mainLight;
22 bool nightMode;
23 bool alarmMode;
24 bool musicMode;
25 int brightness;
26 unsigned long lastCommandTime;
27};
28
29SystemState system = {false, false, false, false, 128, 0};
30
31void setup() {
32 Serial.begin(9600);
33 Serial.println("👏 Система управления хлопками v2.0");
34
35 // 🔧 Инициализация
36 pinMode(LED_PIN, OUTPUT);
37 pinMode(EXTERNAL_LED_PIN, OUTPUT);
38
39 calibrateBaseline();
40
41 Serial.println("✅ Система готова к управлению хлопками!");
42 printCommands();
43}
44
45void loop() {
46 // 🎤 Обработка звука
47 int soundLevel = readSoundLevel();
48
49 // 👏 Обнаружение и обработка команд
50 ClapCommand command = detectClapCommand(soundLevel);
51
52 if (command != CMD_NONE) {
53 executeCommand(command);
54 }
55
56 // 💡 Обновление состояния системы
57 updateSystemOutputs();
58
59 delay(50); // 20 FPS для точного распознавания
60}
61
62// 👏 Функция распознавания команд по хлопкам
63ClapCommand detectClapCommand(int soundLevel) {
64 static unsigned long clapTimes[10]; // Времена хлопков
65 static int clapCount = 0;
66 static unsigned long lastClapTime = 0;
67 static bool waitingForSeries = false;
68
69 unsigned long currentTime = millis();
70
71 // 🔍 Обнаружение хлопка
72 bool clapDetected = detectClap(soundLevel);
73
74 if (clapDetected) {
75 // ⏱️ Проверяем интервал с предыдущим хлопком
76 unsigned long interval = currentTime - lastClapTime;
77
78 if (interval >= MIN_CLAP_INTERVAL) {
79 // 📝 Записываем время хлопка
80 clapTimes[clapCount] = currentTime;
81 clapCount++;
82 lastClapTime = currentTime;
83 waitingForSeries = true;
84
85 Serial.printf("👏 Хлопок #%d (интервал: %lums)\n", clapCount, interval);
86
87 // 🚫 Защита от переполнения
88 if (clapCount >= 10) clapCount = 10;
89 }
90 }
91
92 // 🕐 Проверяем таймаут серии хлопков
93 if (waitingForSeries && (currentTime - lastClapTime > CLAP_TIMEOUT)) {
94 ClapCommand command = analyzeClaps(clapTimes, clapCount);
95
96 // 🔄 Сбрасываем состояние
97 clapCount = 0;
98 waitingForSeries = false;
99
100 return command;
101 }
102
103 return CMD_NONE;
104}
105
106// 🔍 Функция обнаружения одиночного хлопка
107bool detectClap(int soundLevel) {
108 static int previousLevel = 0;
109 static bool clapInProgress = false;
110
111 // 📈 Резкий скачок громкости = начало хлопка
112 if (!clapInProgress && soundLevel > CLAP_SENSITIVITY &&
113 previousLevel < NOISE_THRESHOLD) {
114 clapInProgress = true;
115 return true;
116 }
117
118 // 📉 Падение ниже порога = конец хлопка
119 if (clapInProgress && soundLevel < NOISE_THRESHOLD) {
120 clapInProgress = false;
121 }
122
123 previousLevel = soundLevel;
124 return false;
125}
126
127// 🧠 Функция анализа паттерна хлопков
128ClapCommand analyzeClaps(unsigned long* times, int count) {
129 if (count == 0) return CMD_NONE;
130
131 Serial.printf("🧠 Анализ серии из %d хлопков:\n", count);
132
133 // 📊 Анализируем интервалы между хлопками
134 bool validSeries = true;
135 for (int i = 1; i < count; i++) {
136 unsigned long interval = times[i] - times[i-1];
137 Serial.printf(" Интервал %d: %lums\n", i, interval);
138
139 // ⏱️ Слишком большой интервал = разные серии
140 if (interval > MAX_CLAP_INTERVAL) {
141 validSeries = false;
142 break;
143 }
144 }
145
146 if (!validSeries) {
147 Serial.println("❌ Серия невалидна (слишком большие интервалы)");
148 return CMD_NONE;
149 }
150
151 // 🎯 Определяем команду по количеству хлопков
152 switch (count) {
153 case 1: return CMD_LIGHT_TOGGLE;
154 case 2: return CMD_NIGHT_MODE;
155 case 3: return CMD_ALARM_MODE;
156 case 4: return CMD_MUSIC_MODE;
157 case 5: return CMD_SYSTEM_RESET;
158 default:
159 Serial.printf("❓ Неизвестная команда (%d хлопков)\n", count);
160 return CMD_NONE;
161 }
162}
163
164// ⚡ Функция выполнения команд
165void executeCommand(ClapCommand command) {
166 system.lastCommandTime = millis();
167
168 switch (command) {
169 case CMD_LIGHT_TOGGLE:
170 system.mainLight = !system.mainLight;
171 Serial.printf("💡 Основное освещение: %s\n",
172 system.mainLight ? "ВКЛ" : "ВЫКЛ");
173 break;
174
175 case CMD_NIGHT_MODE:
176 system.nightMode = !system.nightMode;
177 system.brightness = system.nightMode ? 50 : 128;
178 Serial.printf("🌙 Ночной режим: %s (яркость: %d)\n",
179 system.nightMode ? "ВКЛ" : "ВЫКЛ", system.brightness);
180 break;
181
182 case CMD_ALARM_MODE:
183 system.alarmMode = !system.alarmMode;
184 Serial.printf("🚨 Режим тревоги: %s\n",
185 system.alarmMode ? "ВКЛ" : "ВЫКЛ");
186 break;
187
188 case CMD_MUSIC_MODE:
189 system.musicMode = !system.musicMode;
190 Serial.printf("🎵 Музыкальный режим: %s\n",
191 system.musicMode ? "ВКЛ" : "ВЫКЛ");
192 break;
193
194 case CMD_SYSTEM_RESET:
195 Serial.println("🔄 Сброс системы...");
196 resetSystemState();
197 break;
198 }
199
200 // 🎉 Подтверждение выполнения команды
201 confirmCommand(command);
202}
203
204// ✅ Функция подтверждения команды
205void confirmCommand(ClapCommand command) {
206 // 💡 Световое подтверждение
207 for (int i = 0; i < (int)command; i++) {
208 digitalWrite(LED_PIN, HIGH);
209 delay(200);
210 digitalWrite(LED_PIN, LOW);
211 delay(200);
212 }
213
214 // 🔊 Звуковое подтверждение (если есть buzzer)
215 // tone(BUZZER_PIN, 1000, 100);
216}
217
218// 🔄 Сброс состояния системы
219void resetSystemState() {
220 system.mainLight = false;
221 system.nightMode = false;
222 system.alarmMode = false;
223 system.musicMode = false;
224 system.brightness = 128;
225
226 Serial.println("✅ Система сброшена в исходное состояние");
227}
228
229// 💡 Обновление выходов системы
230void updateSystemOutputs() {
231 // 🌙 Ночной режим имеет приоритет
232 if (system.nightMode) {
233 analogWrite(EXTERNAL_LED_PIN, system.brightness);
234 digitalWrite(LED_PIN, false);
235 return;
236 }
237
238 // 🚨 Режим тревоги
239 if (system.alarmMode) {
240 // Мигающий красный свет
241 bool blinkState = (millis() / 250) % 2;
242 digitalWrite(EXTERNAL_LED_PIN, blinkState);
243 digitalWrite(LED_PIN, blinkState);
244 return;
245 }
246
247 // 🎵 Музыкальный режим
248 if (system.musicMode) {
249 // Реакция на текущий уровень звука
250 int currentSound = readSoundLevel();
251 int musicBrightness = map(currentSound, 0, 500, 0, 255);
252 analogWrite(EXTERNAL_LED_PIN, musicBrightness);
253 return;
254 }
255
256 // 💡 Обычное освещение
257 if (system.mainLight) {
258 analogWrite(EXTERNAL_LED_PIN, system.brightness);
259 } else {
260 analogWrite(EXTERNAL_LED_PIN, 0);
261 }
262
263 digitalWrite(LED_PIN, system.mainLight);
264}
265
266// 📋 Вывод доступных команд
267void printCommands() {
268 Serial.println("📋 ДОСТУПНЫЕ КОМАНДЫ:");
269 Serial.println("├ 👏 = Переключить основное освещение");
270 Serial.println("├ 👏👏 = Ночной режим вкл/выкл");
271 Serial.println("├ 👏👏👏 = Режим тревоги вкл/выкл");
272 Serial.println("├ 👏👏👏👏 = Музыкальный режим вкл/выкл");
273 Serial.println("└ 👏👏👏👏👏 = Сброс системы");
274 Serial.println("⏱️ Интервал между хлопками: 150-800мс");
275 Serial.println("🕐 Таймаут серии: 3 секунды");
276}
🎵 “Музыкальный анализатор и светомузыка”
Создание светомузыкального устройства:
1// 🎵 СВЕТОМУЗЫКАЛЬНАЯ УСТАНОВКА
2
3// 🌈 RGB светодиод для цветомузыки
4const int RED_PIN = 25;
5const int GREEN_PIN = 26;
6const int BLUE_PIN = 27;
7
8// 📊 Параметры анализа музыки
9const int FREQ_BANDS = 3; // Низкие, средние, высокие частоты
10const int HISTORY_SIZE = 20; // Размер истории для анализа
11const int BEAT_THRESHOLD = 150; // Порог обнаружения ритма
12
13// 📈 Структура для анализа частот
14struct FrequencyAnalysis {
15 int lowFreq; // Низкие частоты (бас)
16 int midFreq; // Средние частоты (вокал)
17 int highFreq; // Высокие частоты (тарелки)
18 int total; // Общая энергия
19 bool beatDetected; // Обнаружен ритм
20};
21
22// 🎨 Режимы светомузыки
23enum LightMusicMode {
24 MODE_SPECTRUM, // Спектральный анализ
25 MODE_BEAT, // Реакция на ритм
26 MODE_ENERGY, // По общей энергии
27 MODE_DISCO // Дискотечный режим
28};
29
30LightMusicMode currentMode = MODE_SPECTRUM;
31
32void musicAnalyzerLoop() {
33 // 🎤 Анализируем звук
34 FrequencyAnalysis analysis = analyzeFrequencies();
35
36 // 🎵 Обновляем светомузыку
37 updateLightMusic(analysis);
38
39 // 📊 Выводим анализ
40 printMusicAnalysis(analysis);
41}
42
43// 📊 Функция анализа частот (упрощенная)
44FrequencyAnalysis analyzeFrequencies() {
45 FrequencyAnalysis result = {0, 0, 0, 0, false};
46
47 // 📈 Собираем данные за короткий период
48 int samples[50];
49 for (int i = 0; i < 50; i++) {
50 samples[i] = analogRead(SOUND_ANALOG_PIN);
51 delayMicroseconds(500); // 1kHz sampling
52 }
53
54 // 🔍 Простой анализ энергии в разных диапазонах
55 // (в реальности нужна FFT для точного частотного анализа)
56
57 int totalEnergy = 0;
58 int highEnergyCount = 0;
59
60 for (int i = 1; i < 49; i++) {
61 int energy = abs(samples[i] - samples[i-1]);
62 totalEnergy += energy;
63
64 // 🎵 Высокие частоты = резкие изменения
65 if (energy > 50) highEnergyCount++;
66 }
67
68 result.total = totalEnergy;
69 result.lowFreq = totalEnergy * 0.6; // Примерное распределение
70 result.midFreq = totalEnergy * 0.3;
71 result.highFreq = highEnergyCount * 10;
72
73 // 🥁 Обнаружение ритма (резкий скачок энергии)
74 static int lastTotalEnergy = 0;
75 result.beatDetected = (result.total > lastTotalEnergy + BEAT_THRESHOLD);
76 lastTotalEnergy = result.total;
77
78 return result;
79}
80
81// 🌈 Функция управления светомузыкой
82void updateLightMusic(FrequencyAnalysis analysis) {
83 switch (currentMode) {
84 case MODE_SPECTRUM:
85 // 🌈 Каждый цвет = своя частота
86 analogWrite(RED_PIN, map(analysis.lowFreq, 0, 500, 0, 255));
87 analogWrite(GREEN_PIN, map(analysis.midFreq, 0, 300, 0, 255));
88 analogWrite(BLUE_PIN, map(analysis.highFreq, 0, 200, 0, 255));
89 break;
90
91 case MODE_BEAT:
92 // 🥁 Вспышка на каждый ритм
93 if (analysis.beatDetected) {
94 // Белая вспышка
95 analogWrite(RED_PIN, 255);
96 analogWrite(GREEN_PIN, 255);
97 analogWrite(BLUE_PIN, 255);
98 delay(50);
99 }
100 // Затухание
101 fadeToBlack(0.9);
102 break;
103
104 case MODE_ENERGY:
105 // ⚡ Яркость по общей энергии
106 int brightness = map(analysis.total, 0, 1000, 0, 255);
107 // Циклические цвета
108 setHSV((millis() / 50) % 360, 255, brightness);
109 break;
110
111 case MODE_DISCO:
112 // 🕺 Случайные цвета на ритм
113 if (analysis.beatDetected) {
114 int r = random(256);
115 int g = random(256);
116 int b = random(256);
117 analogWrite(RED_PIN, r);
118 analogWrite(GREEN_PIN, g);
119 analogWrite(BLUE_PIN, b);
120 }
121 break;
122 }
123}
124
125// 🌈 Функция установки цвета по HSV
126void setHSV(int hue, int saturation, int value) {
127 // Упрощенное преобразование HSV в RGB
128 int r, g, b;
129
130 int sector = hue / 60;
131 int remainder = hue % 60;
132
133 int p = (value * (255 - saturation)) / 255;
134 int q = (value * (255 - (saturation * remainder) / 60)) / 255;
135 int t = (value * (255 - (saturation * (60 - remainder)) / 60)) / 255;
136
137 switch (sector) {
138 case 0: r = value; g = t; b = p; break;
139 case 1: r = q; g = value; b = p; break;
140 case 2: r = p; g = value; b = t; break;
141 case 3: r = p; g = q; b = value; break;
142 case 4: r = t; g = p; b = value; break;
143 default: r = value; g = p; b = q; break;
144 }
145
146 analogWrite(RED_PIN, r);
147 analogWrite(GREEN_PIN, g);
148 analogWrite(BLUE_PIN, b);
149}
150
151// 🌑 Функция затухания к черному
152void fadeToBlack(float factor) {
153 static int lastR = 0, lastG = 0, lastB = 0;
154
155 lastR *= factor;
156 lastG *= factor;
157 lastB *= factor;
158
159 analogWrite(RED_PIN, lastR);
160 analogWrite(GREEN_PIN, lastG);
161 analogWrite(BLUE_PIN, lastB);
162}
Блок 4: “Интеграция с IoT системой” (10 минут)
📡 “Отправка звуковых данных на сервер”
Мониторинг шумового загрязнения:
1// 📊 СИСТЕМА МОНИТОРИНГА ШУМА
2
3#include <WiFi.h>
4#include <HTTPClient.h>
5#include <ArduinoJson.h>
6
7// 🌐 Настройки сервера
8const char* soundDataURL = "http://192.168.1.100/api/sound-data";
9
10// 📊 Структура данных о шуме
11struct NoiseData {
12 String deviceName;
13 String location;
14 int averageLevel; // Средний уровень за период
15 int peakLevel; // Пиковый уровень
16 int noiseEvents; // Количество превышений порога
17 float noisePercentage; // Процент времени с шумом
18 bool speechDetected; // Обнаружена речь
19 int clapCommands; // Количество команд хлопками
20};
21
22NoiseData currentData;
23
24// 📤 Функция отправки данных о шуме
25void sendNoiseDataToServer() {
26 if (WiFi.status() != WL_CONNECTED) return;
27
28 // 📋 Формируем JSON с данными о шуме
29 String jsonData = createNoiseJSON();
30
31 HTTPClient http;
32 http.begin(soundDataURL);
33 http.addHeader("Content-Type", "application/json");
34
35 int responseCode = http.POST(jsonData);
36
37 if (responseCode == 200) {
38 Serial.println("📤 Данные о шуме отправлены на сервер");
39 } else {
40 Serial.printf("❌ Ошибка отправки шума: %d\n", responseCode);
41 }
42
43 http.end();
44}
45
46// 📋 Создание JSON с данными о шуме
47String createNoiseJSON() {
48 StaticJsonDocument<512> doc;
49
50 doc["device"] = "ESP32_5А_SoundSensor_" + String(ESP.getChipId());
51 doc["student"] = "Команда_1"; // Заменить на реальное имя
52 doc["sensor_type"] = "sound";
53 doc["location"] = "Кабинет информатики";
54 doc["average_level"] = currentData.averageLevel;
55 doc["peak_level"] = currentData.peakLevel;
56 doc["noise_events"] = currentData.noiseEvents;
57 doc["noise_percentage"] = currentData.noisePercentage;
58 doc["speech_detected"] = currentData.speechDetected;
59 doc["clap_commands"] = currentData.clapCommands;
60 doc["timestamp"] = millis();
61
62 String jsonString;
63 serializeJson(doc, jsonString);
64 return jsonString;
65}
66
67// 📊 Сбор статистики шума
68void collectNoiseStatistics(int soundLevel) {
69 static unsigned long periodStart = millis();
70 static int measurementCount = 0;
71 static long levelSum = 0;
72 static int noisyMeasurements = 0;
73
74 measurementCount++;
75 levelSum += soundLevel;
76
77 // 📈 Обновляем пиковый уровень
78 if (soundLevel > currentData.peakLevel) {
79 currentData.peakLevel = soundLevel;
80 }
81
82 // 🔊 Подсчитываем шумные измерения
83 if (soundLevel > NOISE_THRESHOLD) {
84 noisyMeasurements++;
85 currentData.noiseEvents++;
86 }
87
88 // 📊 Каждые 30 секунд обновляем статистику
89 if (millis() - periodStart >= 30000) {
90 currentData.averageLevel = levelSum / measurementCount;
91 currentData.noisePercentage = (float)noisyMeasurements / measurementCount * 100;
92
93 // 📤 Отправляем данные каждые 5 минут
94 static int periodCount = 0;
95 periodCount++;
96 if (periodCount >= 10) { // 10 периодов по 30 сек = 5 минут
97 sendNoiseDataToServer();
98
99 // 🔄 Сбрасываем долгосрочную статистику
100 currentData.peakLevel = 0;
101 currentData.noiseEvents = 0;
102 currentData.clapCommands = 0;
103 periodCount = 0;
104 }
105
106 // 🔄 Сбрасываем текущий период
107 measurementCount = 0;
108 levelSum = 0;
109 noisyMeasurements = 0;
110 periodStart = millis();
111 }
112}
🖥️ “Веб-дашборд мониторинга шума”
Отображение на школьном сервере:
1🖥️ ПАНЕЛЬ МОНИТОРИНГА ШУМА - КЛАСС 5А
2
3┌─────────────────────────────────────────────────┐
4│ 🔊 АКУСТИЧЕСКИЙ МОНИТОРИНГ │
5│ Обновлено: 2025-05-27 15:36:45 │
6├─────────────────────────────────────────────────┤
7│ 📊 АКТИВНЫЕ ЗВУКОВЫЕ ДАТЧИКИ: 4 │
8│ │
9│ 🤖 ESP32_Команда1 | Иван Петров │
10│ 🔊 Средний уровень: 45дБ | Пик: 67дБ │
11│ 📈 Шумность: 23% времени | Речь: Да │
12│ 👏 Команд хлопками: 12 │
13│ │
14│ 🤖 ESP32_Команда2 | Мария Сидорова │
15│ 🔊 Средний уровень: 38дБ | Пик: 72дБ │
16│ 📈 Шумность: 31% времени | Речь: Нет │
17│ 👏 Команд хлопками: 8 │
18├─────────────────────────────────────────────────┤
19│ 📈 [График уровня шума за день] │
20│ 🗣️ [График активности речи] │
21│ 👏 [Статистика команд хлопками] │
22├─────────────────────────────────────────────────┤
23│ 🎯 АНАЛИЗ КЛАССА: │
24│ • Средний уровень шума: 42дБ (норма: <50дБ) │
25│ • Пиковое превышение: 89дБ в 14:23 │
26│ • Самый тихий период: 12:15-12:30 │
27│ • Активность речи: 67% времени урока │
28│ • Эффективность управления хлопками: 94% │
29├─────────────────────────────────────────────────┤
30│ 🚨 ПРЕДУПРЕЖДЕНИЯ: │
31│ ⚠️ Превышение 80дБ: 3 раза за последний час │
32│ 📢 Рекомендация: проветрить класс │
33└─────────────────────────────────────────────────┘
34
35🎯 ЭКОЛОГИЧЕСКИЙ МОНИТОРИНГ:
36- Соответствие санитарным нормам: ✅ ДА
37- Комфортность звуковой среды: 8/10
38- Необходимость звукоизоляции: НЕТ
🎨 Творческое задание: “Умная звуковая система класса” (12 минут)
🎵 “Создание интеллектуальной звуковой экосистемы”
Техническое задание для команд:
1🎯 ПРОЕКТ "ЗВУКОВОЙ ИНТЕЛЛЕКТ КЛАССА 5А":
2
3Обязательные функции:
4✅ Измерение уровня шума с калибровкой
5✅ Система управления хлопками (минимум 3 команды)
6✅ Обнаружение речи и громких звуков
7✅ Адаптивные пороги и фильтрация помех
8✅ Отправка статистики на школьный сервер
9
10Дополнительные функции (выбрать 2-3):
11🎵 Светомузыкальная установка с RGB
12🚨 Система звуковых уведомлений (buzzer)
13🤖 Голосовое управление (распознавание команд)
14📊 Детальный анализ звукового спектра
15🎮 Интерактивные звуковые игры
16🛡️ Система безопасности с звуковыми ловушками
17📱 Мобильное приложение для управления
18🌍 Мониторинг экологии (контроль шумового загрязнения)
📋 “Паспорт умной звуковой системы”
Документация проекта:
1📄 ПАСПОРТ ЗВУКОВОЙ СИСТЕМЫ
2Команда: _________________ Дата: 2025-05-27
3
4🎯 НАЗВАНИЕ: "SoundMaster [название_команды]"
5
6⚙️ ТЕХНИЧЕСКИЕ ХАРАКТЕРИСТИКИ:
7- Датчик: KY-038 (электретный микрофон)
8- Частотный диапазон: 20Гц - 20кГц
9- Чувствительность: регулируемая потенциометром
10- Время отклика: _____ мс
11- Точность измерения: ±_____ дБ
12- Диапазон команд хлопками: 1-5 хлопков
13
14🔧 СХЕМА И ПОДКЛЮЧЕНИЕ:
15[Рисунок схемы подключения]
16- KY-038 VCC → ESP32 3.3V/5V
17- KY-038 AO → ESP32 GPIO 34 (аналоговый)
18- KY-038 DO → ESP32 GPIO 35 (цифровой)
19- KY-038 GND → ESP32 GND
20
21💻 ПРОГРАММНЫЕ ВОЗМОЖНОСТИ:
22□ Базовое измерение уровня звука
23□ Калибровка фонового шума
24□ Система управления хлопками
25□ Обнаружение речи
26□ Адаптивные пороги
27□ Цифровая фильтрация сигнала
28□ Отправка данных на сервер
29□ Дополнительная функция 1: _______________
30□ Дополнительная функция 2: _______________
31□ Дополнительная функция 3: _______________
32
33📊 КАЛИБРОВКА И ТЕСТИРОВАНИЕ:
34Калибровка в тишине:
35- Фоновый шум: _____ (сырое значение)
36- Порог обнаружения: _____
37- Чувствительность потенциометра: _____
38
39Тестовые звуки:
40□ Шепот (10см): _____ | Обнаружен: ДА/НЕТ
41□ Разговор (30см): _____ | Обнаружен: ДА/НЕТ
42□ Хлопок (50см): _____ | Команда: ДА/НЕТ
43□ Крик (1м): _____ | Тревога: ДА/НЕТ
44□ Музыка: _____ | Анализ: ДА/НЕТ
45
46👏 СИСТЕМА КОМАНД ХЛОПКАМИ:
47□ 1 хлопок → ________________________________
48□ 2 хлопка → ________________________________
49□ 3 хлопка → ________________________________
50□ 4 хлопка → ________________________________
51□ 5 хлопков → _______________________________
52
53Точность распознавания: ____% (из 20 попыток)
54
55🌟 УНИКАЛЬНЫЕ ОСОБЕННОСТИ:
56Наша "изюминка": ____________________________
57__________________________________________
58
59Самая сложная функция: ______________________
60__________________________________________
61
62📈 РЕЗУЛЬТАТЫ ИСПЫТАНИЙ:
63Время непрерывной работы: _____ часов
64Ложных срабатываний: _____ из _____ тестов
65Пропущенных команд: _____ из _____ тестов
66Помехоустойчивость: ____% (при работающем WiFi)
67Энергопотребление: _____ мА
68
69🔊 АКУСТИЧЕСКИЙ АНАЛИЗ:
70Лучше всего распознает: _____________________
71Хуже всего распознает: ______________________
72Оптимальное расстояние: _____ см
73Влияние фонового шума: СИЛЬНОЕ/СЛАБОЕ/НЕТ
74
75Извините, связь действительно оборвалась! Продолжаю с места остановки:
✅ ПРОВЕРКА ФУНКЦИОНАЛЬНОСТИ: □ Система реагирует на звуки выше порога □ Хлопки распознаются с интервалом 150-800мс □ Нет ложных срабатываний от вибраций □ Адаптивные пороги корректно работают □ Речь отличается от других звуков □ Данные корректно отправляются на сервер □ Все дополнительные функции стабильны □ Система работает >30 минут без сбоев
🏆 САМООЦЕНКА ПРОЕКТА: Техническая сложность: ⭐⭐⭐⭐⭐ Креативность алгоритмов: ⭐⭐⭐⭐⭐ Надежность работы: ⭐⭐⭐⭐⭐ Пользовательский опыт: ⭐⭐⭐⭐⭐ Общая оценка: ⭐⭐⭐⭐⭐
🎯 ПЛАНЫ РАЗВИТИЯ:
1
2### **🎪 "Выставка звуковых технологий"**
3
4**Презентация и демонстрация:**
5- Каждая команда демонстрирует свою звуковую систему (4 минуты)
6- Показывает реакцию на различные звуки и команды
7- Тестирует систему управления хлопками на публике
8- Демонстрирует уникальные функции (светомузыка, анализ речи)
9- Сравнивает точность распознавания с другими командами
10
11## 📝 Рефлексия и закрепление (5 минут)
12
13### **🎤 "Викторина звуковых технологий"**
14
15**Интерактивные вопросы с демонстрацией:**
❓ ПОКАЖИ ЗВУКОМ:
- Как звучит команда “включить свет”? (1 хлопок)
- Какой звук лучше всего распознает датчик? (хлопок/крик/свист)
- Покажи “тихий” и “громкий” звук (шепот vs хлопок)
- Как проверить работу адаптивного порога? (постепенно увеличивать громкость)
1
2### **📊 "Шкала мастерства звуковых систем"**
🎚️ УРОВЕНЬ ВЛАДЕНИЯ ЗВУКОВЫМИ ТЕХНОЛОГИЯМИ:
🏆 Звуковой инженер (100%): “Создаю сложные системы распознавания, понимаю акустику, программирую ИИ”
🥇 Аудио-программист (75%): “Программирую распознавание команд, настраиваю фильтры, создаю интерактивные системы”
🥈 Звуковой техник (50%): “Подключаю микрофоны, измеряю громкость, понимаю принципы работы”
🥉 Акустический новичок (25%): “Знаю что такое звуковой датчик и микрофон”
Покажите хлопком свой уровень! (1-4 хлопка)
1
2### **💭 "Звуковые откровения"**
3
4**Каждый ученик завершает фразу:**
5- "Звуковые датчики удивили меня тем что..."
6- "Самое сложное в распознавании звука..."
7- "Я бы применил звуковое управление для..."
8- "Узнал что микрофон это..."
9
10## 🏠 Домашнее задание
11
12### **🎤 "Домашний звуковой исследователь"**
13
14**Основное задание:**
151. **Акустическое исследование дома**
16 - Измерить уровень шума в разных комнатах
17 - Найти самое тихое и самое шумное место
18 - Протестировать команды хлопками в разных условиях
19
202. **Эксперименты с программой**
21 - Настроить систему под домашние условия
22 - Добавить новую команду (например, 6 хлопков)
23 - Попробовать распознавание других звуков (свист, стук)
24
253. **Дневник звукового инженера**
📔 МОЙ ДНЕВНИК ЗВУКОВОГО ИНЖЕНЕРА - УРОК 14
🎤 ГЛАВНЫЕ ОТКРЫТИЯ:
- Микрофон преобразует звук в: _______________
- Адаптивные пороги нужны для: ______________
- Самый сложный звук для распознавания: ____
🔧 МОЯ ЗВУКОВАЯ СИСТЕМА: Точность распознавания хлопков: ____% Количество ложных срабатываний: ____ Лучшая команда: ____________________________ Самая крутая функция: ______________________
🏠 ДОМАШНИЕ ИЗМЕРЕНИЯ: Кухня: дБ (/10) | Спальня: дБ (/10) Гостиная: дБ (/10) | Ванная: дБ (/10) На улице: дБ (/10) | В подъезде: дБ (/10)
Самое тихое место: __________________________ Самое шумное место: _________________________
💻 ПРОГРАММНЫЕ ДОСТИЖЕНИЯ: Какую новую функцию добавил: ________________ Сложность моего алгоритма: ⭐⭐⭐⭐⭐ Проблему которую решил: ____________________
🌟 ИДЕИ ДЛЯ ПРИМЕНЕНИЯ:
- Умный дом: _______________________________
- Безопасность: ____________________________
- Развлечения: _____________________________
- Помощь людям: ____________________________
1
2### **🔬 Исследовательское задание (для увлеченных):**
3- Изучить профессиональные микрофоны и их характеристики
4- Найти информацию о цифровой обработке сигналов (DSP)
5- Исследовать технологии распознавания речи (Siri, Alexa)
6
7### **🎨 Творческое задание:**
8- Нарисовать схему "умного дома" с звуковым управлением
9- Создать комикс "Приключения звуковой волны в микрофоне"
10
11## 📊 Критерии оценивания
12
13### **"Отлично" (5):**
14- Понимает принципы работы микрофонов и звуковых датчиков
15- Создает стабильную систему распознавания звуковых команд
16- Программирует адаптивные пороги и цифровую фильтрацию
17- Реализует дополнительные функции (светомузыка, анализ речи)
18- Интегрирует систему с IoT платформой
19- Демонстрирует творческий подход к звуковым интерфейсам
20
21### **"Хорошо" (4):**
22- Понимает основы работы звуковых датчиков
23- Создает работающую систему управления хлопками
24- Программирует базовые функции измерения звука
25- Выполняет калибровку и настройку системы
26- Понимает проблемы помех и способы их решения
27
28### **"Удовлетворительно" (3):**
29- Имеет общее представление о звуковых датчиках
30- С помощью создает простую систему реакции на звук
31- Понимает базовые принципы звукового управления
32- Участвует в групповой работе над проектом
33
34## 🛠️ Материалы и оборудование
35
36### **Для каждой команды (3-4 человека):**
37- ESP32 DevKit плата
38- Модуль звукового датчика KY-038
39- RGB светодиод (для светомузыки)
40- Резисторы 220 Ом (3 шт, для RGB)
41- Пьезобузер (опционально)
42- Макетная плата и провода
43- Мультиметр для диагностики
44
45### **Для демонстраций учителем:**
46- Профессиональный шумомер для сравнения
47- Различные источники звука (музыка, звуковые эффекты)
48- Осциллограф для демонстрации звуковых сигналов
49- Спектроанализатор (приложение на телефоне)
50
51### **Программное обеспечение:**
52- Arduino IDE с библиотеками для работы с аналоговыми датчиками
53- Serial Plotter для визуализации звуковых сигналов
54- Аудио-редактор для создания тестовых звуков
55- Веб-интерфейс школьного сервера для мониторинга
56
57### **Дополнительные компоненты (для продвинутых проектов):**
58- I2S микрофон для высококачественной записи
59- SD карта модуль для записи звука
60- Bluetooth модуль для беспроводного управления
61- LCD дисплей для отображения уровня звука
62- Реле для управления внешними устройствами
63
64## 🔍 Методические заметки для учителя
65
66### **Подготовка к уроку:**
671. **Тестирование датчиков:** Проверить все модули KY-038 на одинаковость характеристик
682. **Акустические условия:** Подготовить возможность создания тишины и контролируемого шума
693. **Калибровка:** Подготовить эталонные источники звука известной громкости
704. **Безопасность:** Убедиться, что громкие звуки не превышают безопасные уровни
71
72### **Возможные сложности:**
73
74**Проблема:** Различия в чувствительности микрофонов
75**Решение:** Обязательная индивидуальная калибровка, использование потенциометра
76
77**Проблема:** Помехи от WiFi и других электронных устройств
78**Решение:** Экранирование, цифровая фильтрация, правильная разводка проводов
79
80**Проблема:** Ложные срабатывания от вибраций стола
81**Решение:** Механическая изоляция датчиков, программная фильтрация
82
83### **Безопасность:**
84- Контроль уровня громкости демонстраций (не выше 80дБ)
85- Защита слуха при работе с громкими звуками
86- Правильное подключение питания к чувствительным микрофонам
87
88### **Дифференциация обучения:**
89- **Для продвинутых:** изучение DSP, создание спектроанализатора, машинное обучение
90- **Для начинающих:** готовые пороги, упрощенные алгоритмы распознавания
91- **Для визуалов:** графики звуковых сигналов, спектрограммы
92- **Для аудиалов:** больше работы с различными звуками и музыкой
93
94### **Связь с реальным миром:**
95- Системы "умный дом" с голосовым управлением
96- Охранные системы с звуковыми датчиками
97- Мониторинг шумового загрязнения в городах
98- Звукотехника и профессиональная аудиоаппаратура
99
100### **Межпредметные связи:**
101- **Физика:** акустика, колебания, волны, децибелы
102- **Музыка:** частоты, тембр, ритм, звукозапись
103- **Экология:** шумовое загрязнение, влияние на здоровье
104- **Информатика:** цифровая обработка сигналов, алгоритмы распознавания
105
106### **Развитие проекта:**
107- Интеграция с системами распознавания речи
108- Создание голосовых ассистентов на ESP32
109- Профессиональные звукомеры и анализаторы спектра
110- Системы активного шумоподавления
111
112Этот урок формирует понимание звуковых технологий и готовит учащихся к созданию интерактивных устройств с голосовым и звуковым управлением - важного направления современной электроники и IoT.