Мониторинг уровня звука на Arduino: KY-038, LCD и 16 светодиодов
Компоненты и материалы
| Arduino UNO | 1 шт. |
| Макетная плата (full size) | 1 шт. |
| Корона 9В + разъем Jack | 1 компл. (опционально, для автономности) |
| Перемычки (M-M, M-F) | 1 набор |
| LCD 16x2 с I2C (адрес 0x27) | 1 шт. |
| Звуковой датчик KY-038 | 1 шт. |
| Светодиоды 5мм: Жёлтый | 2 шт. |
| Светодиоды 5мм: Зелёный | 4 шт. |
| Светодиоды 5мм: Красный | 2 шт. |
| Светодиоды 5мм: Белый | 4 шт. |
| Светодиоды 5мм: Синий | 4 шт. |
| Резисторы 100 Ом (для белых/синих) | 8 шт. |
| Резисторы 220 Ом (для жёлтых/красных) | 4 шт. |
| Резисторы 330 Ом (для зелёных) | 4 шт. |
Программное обеспечение
- Arduino IDE
- Библиотека
LiquidCrystal_PCF8574(для I2C LCD)
О проекте
Проект визуализирует уровень звука в реальном времени. Датчик KY-038 (аналоговый выход AO) считывает амплитуду, значение выводится на LCD и в Serial Monitor. 16 светодиодов группируются по порогам: жёлтые — тихий звук, зелёные — средний, красные/белые/синие — громкий. Пороги подбирались экспериментально: данные собирались в таблицу, выбирались частые значения для каждого диапазона.
Логика индикации
- Жёлтые (LED1–2): срабатывают при низком уровне (~650–700)
- Зелёные (LED3–6): средний уровень (~700–725)
- Красные/Белые/Синие (LED7–16): высокий уровень (~725–750+)
При превышении порога соответствующий светодиод зажигается. Все пороги задаются в коде константами.
Проблема «лишних цифр» на LCD
При смене значения (например, 1234 → 619) на LCD оставался «хвост»: 6194. Решение: после вывода значения печатать пробел lcd.print(" ") — он затирает лишние символы.
Код (SoundSensorLEDwData.ino)
#include "Arduino.h"
#include "LiquidCrystal_PCF8574.h"
#define LCD_ADDRESS 0x27
#define LCD_ROWS 2
#define LCD_COLUMNS 16
#define BACKLIGHT 255
LiquidCrystal_PCF8574 LCDi2C;
// Пины светодиодов (PWM-пины для плавности, но тут просто ВКЛ/ВЫКЛ)
int LED1 = 3, LED2 = 4, LED3 = 5, LED4 = 6;
int LED5 = 7, LED6 = 8, LED7 = 9, LED8 = 10;
int soundSensorDO = 2; // Цифровой выход DO датчика
int sensorValue = 0; // Аналоговое значение с A0
boolean LEDStatus = false;
void setup() {
Serial.begin(9600);
LCDi2C.begin(LCD_COLUMNS, LCD_ROWS, LCD_ADDRESS, BACKLIGHT);
pinMode(soundSensorDO, INPUT);
pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT); pinMode(LED6, OUTPUT); pinMode(LED7, OUTPUT); pinMode(LED8, OUTPUT);
}
void loop() {
sensorValue = analogRead(A0); // Чтение аналогового уровня
int sensorDigital = digitalRead(soundSensorDO); // Цифровой триггер (не используется в логике, но опрашивается)
if (sensorDigital == HIGH) { // Если DO сработал (уровень выше порога на модуле)
if (!LEDStatus) {
LEDStatus = true;
Serial.println(sensorValue);
LCDi2C.setCursor(0,0);
LCDi2C.print("SoundLevel Data:");
LCDi2C.setCursor(0,1);
LCDi2C.print(sensorValue);
LCDi2C.print(" "); // Затирание хвоста
}
// Пороговые срабатывания (подбирайте под свой датчик/шум)
if (sensorValue >= 750) digitalWrite(LED8, HIGH); else { LEDStatus = false; digitalWrite(LED8, LOW); }
if (sensorValue >= 735) digitalWrite(LED7, HIGH); else { LEDStatus = false; digitalWrite(LED7, LOW); }
if (sensorValue >= 725) digitalWrite(LED6, HIGH); else { LEDStatus = false; digitalWrite(LED6, LOW); }
if (sensorValue >= 720) digitalWrite(LED5, HIGH); else { LEDStatus = false; digitalWrite(LED5, LOW); }
if (sensorValue >= 715) digitalWrite(LED4, HIGH); else { LEDStatus = false; digitalWrite(LED4, LOW); }
if (sensorValue >= 700) digitalWrite(LED3, HIGH); else { LEDStatus = false; digitalWrite(LED3, LOW); }
if (sensorValue >= 675) digitalWrite(LED2, HIGH); else { LEDStatus = false; digitalWrite(LED2, LOW); }
if (sensorValue >= 650) digitalWrite(LED1, HIGH); else { LEDStatus = false; digitalWrite(LED1, LOW); }
} else {
LEDStatus = false;
digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); digitalWrite(LED7, LOW); digitalWrite(LED8, LOW);
}
}
Схема подключения
Следуйте фото: датчик KY-038 (AO → A0, DO → D2, VCC → 5V, GND → GND), LCD по I2C, светодиоды через резисторы на пины D3–D10. Общая земля.
Примечание: Порог на цифровом выходе KY-038 регулируется подстроечным резистором на модуле. Аналоговый выход даёт более точную картину.
Производственный процесс
- Würth Electronics представляет WSEN‑ITDS: компактный низкоэнергопотребляющий 3‑осевой MEMS акселерометр для Industrial IoT
- Интеграция данных сенсоров в Raspberry Pi: практическое руководство
- Датчик слежения за линией на Raspberry Pi — простой детектор двери/линии KY‑033
- Построение надёжного Temperature & Sensor API на Raspberry Pi с модулем GY‑91
- Раскрытие силы визуальных данных в IoT-экосистеме
- Шесть ключевых принципов построения высоковлиятельных сенсор-драйвенных IoT-приложений
- Arch Systems и Flex партнерят для трансформации производственных данных с продвинутой аналитикой
- Роботизированный захват с кожоподобным мягким тактильным датчиком для точной манипуляции
- Точный WiFi RSSI трекинг для датчиков МКС
- Революционные материалы для светодиодной передачи данных нового поколения