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

Анализатор звукового спектра 32 (Linier) / 11 (псевдо-лог) диапазона

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

Arduino Nano R3
× 1
Резистор 10 кОм
× 1
Резистор 100 кОм
× 2
Резистор 4,75 кОм
× 3
Перемычки (общие)
× 1
Макет (общий)
× 1
Кабель USB-A - Mini-USB
× 1
Тактильный переключатель, срабатывающий сверху
× 1
Male-Header 36 Position 1 Row- Long (0.1 ")
× 1

Необходимые инструменты и машины

Паяльник (общий)

Приложения и онлайн-сервисы

IDE Arduino

Об этом проекте

Это была моя первая попытка создать проект Arduino. Меня интересует все, что касается аудиопроектов. Нашел аудиовизуализатор от Shajeeb, попытался сделать шкалу на дисплее другим. Вроде логарифмической, но я просто делаю несколько (логарифмических / экспоненциальных) таблиц в Excel и реализую отображение данных вручную в коде проекта.

Добавлена ​​/ модифицирована кнопка изменения отображения:одинарная полоса (отображение линейной шкалы / двойная полоса - псевдолог).

Надеюсь, вам понравится, наслаждайтесь строительством.

Код

  • 32_Band_LED_Spectrum_Analyzer-009.ino
32_Band_LED_Spectrum_Analyzer-009.ino Arduino
Не стесняйтесь изменять / настраивать в соответствии с вашими потребностями в моем коде части настройки (повторное отображение данных, отмеченных комментарием).
 // Модифицированный код Кристианом Сурьянто, из (c) 2019 Shajeeb TM // HAZI TECH / / Обновлено Кристианом Сурьянто // #include  #include  #include  #include  #define HARDWARE_TYPE MD_MAX72XX ::FC16_HW // Установите тип отображения, чтобы MD_MAX72xx библиотека определяет это правильно # define CLK_PIN 13 // тактовый контакт для связи с дисплеем # define DATA_PIN 11 // контакт данных для связи с дисплеем # define CS_PIN 10 // управляющий контакт для связи с дисплеем # define SAMPLES 64 // должно быть питание of 2 # define MAX_DEVICES 4 // Общее количество модулей отображения # define xres 32 // Общее количество столбцов на дисплее, должно быть <=SAMPLES / 2 # define yres 8 // Общее количество строк на дисплее #define PREV 0xFF02FD // адрес - FFA25D, но добавлен 0x, потому что таким образом arduino сообщает, что он ШЕСТИГРАННЫЙ. # define NEXT 0xFFC23D // контрольный стоп-код # определить PWR 0xFFA25D // управление Powerint audio_response =35; // введите значение от 10 до 80. Чем меньше число, тем выше ответ звука double vReal [SAMPLES]; // double vReal2 [SAMPLES]; double vImag [SAMPLES]; char data_avgs [xres]; int yvalue; int displaycolumn, displayvalue; int peaks [xres]; const int buttonPin =6; // номер состояния контакта кнопки =HIGH; // текущее значение входного pinint previousState =LOW; // предыдущее чтение из ввода pinint displaymode; беззнаковый длинный lastDebounceTime =0; // последний раз, когда выходной вывод был переключен unsigned long debounceDelay =50; // время дребезга; увеличить, если на выходе мерцает int MY_ARRAY [] ={0, 128, 192, 224, 240, 248, 252, 254, 255}; // по умолчанию =стандартный шаблон // int MY_MODE_1 [] ={0, 128, 192, 224, 240, 248, 252, 254, 255}; // стандартный шаблон // int MY_MODE_2 [] ={0, 128, 64, 32, 16, 8, 4, 2, 1}; // только образец пика // int MY_MODE_3 [] ={0, 128, 192, 160, 144, 136, 132, 130, 129}; // только вершина + нижняя точка // int MY_MODE_4 [] ={0, 128, 192, 160, 208, 232, 244, 250, 253}; // один пробел вверху, третий свет и далее bool EQ_ON =true; // установите значение false, чтобы отключить eqbyte eq1 [32] ={40, 45, 50, 60, 65, 70, 75, 95, 110, 110, 110, 110, 110, 110, 110, 110, 130, 130, 130, 130, 130, 130, 130, 130, 145, 155, 170, 180, 215, 220, 245, 255}; байт eq2 [11] ={40, 70, 75, 110, 110, 140, 145, 220, 220, 230, 250}; MD_MAX72XX mx =MD_MAX72XX (HARDWARE_TYPE, CS_PIN, MAX_DEVICES); // отображаем объект arduinoFFT FFT =arduinoFFT (); // объект БПФ void setup () {EEPROM.update (1,1); // (адрес памяти, значение), ЗАПУСТИТЬ ЭТО В ПЕРВЫЙ РАЗ displaymode =EEPROM.read (1); // displaymode =1; ADCSRA =0b11100101; // установить АЦП в режим автономной работы и установить предскалярное значение 32 (0xe5) ADMUX =0b00000000; // использовать вывод A0 и внешний источник опорного напряжения pinMode (buttonPin, INPUT); mx.begin (); // инициализировать отображение mx.control (MD_MAX72XX ::INTENSITY, 0); // установить задержку яркости светодиода (50); // ждем стабилизации опорного напряжения} void loop () {// ++ Sampling int numData; двойная сумма; для (int я =0; я <ОБРАЗЦЫ; я ++) {в то время как (! (ADCSRA &0x10)); // ждем, пока АЦП завершит преобразование тока, т.е. установлен бит ADIF ADCSRA =0b11110101; // очищаем бит ADIF, чтобы АЦП мог выполнить следующую операцию (0xf5) int value =ADC - 512; // Считываем из АЦП и вычитаем вызванное смещение постоянного тока значение value =value / 8; vReal [i] =значение; // Копировать в бункеры после сжатия vImag [i] =0; } // - Выборка // ++ FFT FFT.Windowing (vReal, SAMPLES, FFT_WIN_TYP_HAMMING, FFT_FORWARD); FFT.Compute (vReal, vImag, SAMPLES, FFT_FORWARD); БПФ.ComplexToMagnitude (vReal, vImag, SAMPLES); // - БПФ int step =(SAMPLES) / xres; // переназначение данных - Настроено Кристианом Сурьянто /// switch (displaymode) {case 1:{numData =32; data_avgs [0] =(vReal [0] + vReal [0]) / 2; data_avgs [1] =(vReal [1] + vReal [63]) / 2; data_avgs [2] =(vReal [2] + vReal [62]) / 2; data_avgs [3] =(vReal [3] + vReal [61]) / 2; data_avgs [4] =(vReal [4] + vReal [60]) / 2; data_avgs [5] =(vReal [5] + vReal [59]) / 2; data_avgs [6] =(vReal [6] + vReal [58]) / 2; data_avgs [7] =(vReal [7] + vReal [57]) / 2; data_avgs [8] =(vReal [8] + vReal [56]) / 2; data_avgs [9] =(vReal [9] + vReal [55]) / 2; data_avgs [10] =(vReal [10] + vReal [54]) / 2; data_avgs [11] =(vReal [11] + vReal [53]) / 2; data_avgs [12] =(vReal [12] + vReal [52]) / 2; data_avgs [13] =(vReal [13] + vReal [51]) / 2; data_avgs [14] =(vReal [14] + vReal [50]) / 2; data_avgs [15] =(vReal [15] + vReal [49]) / 2; data_avgs [16] =(vReal [16] + vReal [48]) / 2; data_avgs [17] =(vReal [17] + vReal [47]) / 2; data_avgs [18] =(vReal [18] + vReal [46]) / 2; data_avgs [19] =(vReal [19] + vReal [45]) / 2; data_avgs [20] =(vReal [20] + vReal [44]) / 2; data_avgs [21] =(vReal [21] + vReal [43]) / 2; data_avgs [22] =(vReal [22] + vReal [42]) / 2; data_avgs [23] =(vReal [23] + vReal [41]) / 2; data_avgs [24] =(vReal [24] + vReal [40]) / 2; data_avgs [25] =(vReal [25] + vReal [39]) / 2; data_avgs [26] =(vReal [26] + vReal [38]) / 2; data_avgs [27] =(vReal [27] + vReal [37]) / 2; data_avgs [28] =(vReal [28] + vReal [36]) / 2; data_avgs [29] =(vReal [29] + vReal [35]) / 2; data_avgs [30] =(vReal [30] + vReal [34]) / 2; data_avgs [31] =(vReal [31] + vReal [33]) / 2; } ломать; случай 2:{numData =11; data_avgs [0] =(vReal [0] + vReal [0]) / 2; data_avgs [1] =(vReal [0] + vReal [0] + vReal [1] + vReal [63]) / 4; data_avgs [2] =(vReal [1] + vReal [63] + vReal [2] + vReal [62] + vReal [3] + vReal [61]) / 6; data_avgs [3] =(vReal [2] + vReal [62] + vReal [3] + vReal [61] + vReal [4] + vReal [60]) / 6; data_avgs [4] =(vReal [5] + vReal [59] + vReal [6] + vReal [58] + vReal [7] + vReal [57]) / 6; data_avgs [5] =(vReal [8] + vReal [56] + vReal [9] + vReal [55] + vReal [10] + vReal [54] + vReal [11] + vReal [53]) / 8; data_avgs [6] =(vReal [12] + vReal [52] + vReal [13] + vReal [51] + vReal [14] + vReal [50] + vReal [15] + vReal [49]) / 8; data_avgs [7] =(vReal [16] + vReal [48] + vReal [17] + vReal [47] + vReal [18] + vReal [46]) / 6; data_avgs [8] =(vReal [19] + vReal [45] + vReal [20] + vReal [44] + vReal [21] + vReal [43] + vReal [22] + vReal [42]) / 8; data_avgs [9] =(vReal [23] + vReal [41] + vReal [24] + vReal [40] + vReal [25] + vReal [39] + vReal [26] + vReal [38] + vReal [27]) + vReal [37]) / 10; data_avgs [10] =(vReal [28] + vReal [36] + vReal [29] + vReal [35] + vReal [30] + vReal [34] + vReal [31] + vReal [33]) / 8; } ломать; } // переназначение данных - Настроено Кристианом Сурьянто /// for (int i =0; i  peaks [i]) peaks [i] =yvalue; yvalue =пики [i]; displayvalue =MY_ARRAY [yvalue]; переключатель (режим отображения) {случай 1:{displaycolumn =31-i; mx.setColumn (displaycolumn, displayvalue); // слева направо} break; случай 2:{displaycolumn =31- (3 * i); mx.setColumn (displaycolumn-1, displayvalue); // слева направо mx.setColumn (displaycolumn, displayvalue); // слева направо} break; }} // - отправить на дисплей по измеренному значению displayModeChange (); // проверяем, нажата ли кнопка для изменения режима отображения} void displayModeChange () {int reading =digitalRead (buttonPin); if (reading ==HIGH &&previousState ==LOW &&millis () - lastDebounceTime> debounceDelay) // работает только при нажатии {switch (displaymode) {case 1:// переход из режима 1 в режим 2 displaymode =2; mx.clear (); задержка (200); EEPROM.update (1,2); ломать; case 2:// перейти из режима 2 в 3 displaymode =1; mx.clear (); задержка (200); EEPROM.update (1,1); ломать; } lastDebounceTime =millis (); } previousState =чтение;} 

Схема


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

  1. Сигнал тревоги для растений, предупреждающий о жажде
  2. Итальянские часы со словами
  3. Только три контакта для клавиатуры 4x3
  4. Счетчик кВтч Sigfox
  5. Монитор температуры Bluetooth
  6. DIY Простой измеритель емкости с автоматическим выбором диапазона (10pF-10000microF)
  7. Блокировка, управляемая жестами
  8. Компаньон IC
  9. Изолированный аналоговый вход для Arduino
  10. Измерьте время реакции