Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Мониторинг уровня звука на Arduino: KY-038, LCD и 16 светодиодов

Компоненты и материалы

Arduino UNO1 шт.
Макетная плата (full size)1 шт.
Корона 9В + разъем Jack1 компл. (опционально, для автономности)
Перемычки (M-M, M-F)1 набор
LCD 16x2 с I2C (адрес 0x27)1 шт.
Звуковой датчик KY-0381 шт.
Светодиоды 5мм: Жёлтый2 шт.
Светодиоды 5мм: Зелёный4 шт.
Светодиоды 5мм: Красный2 шт.
Светодиоды 5мм: Белый4 шт.
Светодиоды 5мм: Синий4 шт.
Резисторы 100 Ом (для белых/синих)8 шт.
Резисторы 220 Ом (для жёлтых/красных)4 шт.
Резисторы 330 Ом (для зелёных)4 шт.

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

О проекте

Проект визуализирует уровень звука в реальном времени. Датчик KY-038 (аналоговый выход AO) считывает амплитуду, значение выводится на LCD и в Serial Monitor. 16 светодиодов группируются по порогам: жёлтые — тихий звук, зелёные — средний, красные/белые/синие — громкий. Пороги подбирались экспериментально: данные собирались в таблицу, выбирались частые значения для каждого диапазона.

Логика индикации

При превышении порога соответствующий светодиод зажигается. Все пороги задаются в коде константами.

Проблема «лишних цифр» на 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. Общая земля.

Мониторинг уровня звука на Arduino: KY-038, LCD и 16 светодиодов
Разводка на макетной плате

Примечание: Порог на цифровом выходе KY-038 регулируется подстроечным резистором на модуле. Аналоговый выход даёт более точную картину.

Производственный процесс

  1. Würth Electronics представляет WSEN‑ITDS: компактный низкоэнергопотребляющий 3‑осевой MEMS акселерометр для Industrial IoT
  2. Интеграция данных сенсоров в Raspberry Pi: практическое руководство
  3. Датчик слежения за линией на Raspberry Pi — простой детектор двери/линии KY‑033
  4. Построение надёжного Temperature & Sensor API на Raspberry Pi с модулем GY‑91
  5. Раскрытие силы визуальных данных в IoT-экосистеме
  6. Шесть ключевых принципов построения высоковлиятельных сенсор-драйвенных IoT-приложений
  7. Arch Systems и Flex партнерят для трансформации производственных данных с продвинутой аналитикой
  8. Роботизированный захват с кожоподобным мягким тактильным датчиком для точной манипуляции
  9. Точный WiFi RSSI трекинг для датчиков МКС
  10. Революционные материалы для светодиодной передачи данных нового поколения