Skip to main content

👏 Звуковой датчик

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

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

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

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

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

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

  • Понимание роли звука в жизни человека и технике
  • Развитие творческого подхода к созданию интерактивных устройств
  • Формирование экологического сознания (контроль шумового загрязнения)

🚀 Мотивационное начало (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. Как звучит команда “включить свет”? (1 хлопок)
  2. Какой звук лучше всего распознает датчик? (хлопок/крик/свист)
  3. Покажи “тихий” и “громкий” звук (шепот vs хлопок)
  4. Как проверить работу адаптивного порога? (постепенно увеличивать громкость)
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. Помощь людям: ____________________________
  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.