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

Визуализатор аудиоспектра FHT

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

Arduino Nano R3
× 1
WS2812B 8X32 RGB LED MATRIX
× 1
Резистор 4,75 кОм
× 3
Резистор 100 кОм
× 2
Резистор 10 кОм
× 2
Резистор в сквозное отверстие, 390 Ом
× 1
1N4007 - высоковольтный диод с высоким номинальным током
Даже 1N4004 подойдет
× 1
Конденсатор 100 нФ
× 2
Конденсатор 1000 мкФ
× 1
Кнопочный переключатель SparkFun, 12 мм
Или две кнопки панели, если вы планируете вставить схему в коробку
× 2
Общая прототипная плата 4x6 см
× 1
Стерео штекер RCA для печатной платы
× 1

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

Паяльник (общий)
Кабель аудиоразъема 3,5 мм к стерео разъему RCA

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

Библиотека Arduino FHT

FHT выполняет ту же работу, что и более известный FFT, но в отличие от этого он использует только реальные данные, тогда как FFT работает со сложными данными, поэтому FHT использует половину вычислительной мощности и половину системной памяти.

Эта библиотека использует один массив для выборки данных вместо двух, один для реальных значений и один для мнимых значений, используемых FFT lib, она также упрощает сложные математические вычисления, избегая циклов со сложными логарифмическими вычислениями с плавающей запятой, и вместо этого использует некоторые числовые таблицы .

Обратной стороной является то, что он всегда возвращает половину значений размера массива, используемого для выполнения выборки, что приводит к некоторой потере разрешения и точности на двух концах звукового диапазона. Однако в конкретном случае нам не нужно разрабатывать измерительный инструмент, а простое устройство, нам не нужна особая точность, нам просто нужно включить несколько светодиодов в музыкальном ритме.

Конечно, это не подходящее место для обсуждения модальности работы библиотеки FHT, любой, кто хочет узнать больше, может обратиться на веб-сайт Open Music Lab, где они найдут всю необходимую документацию, чтобы понять используемые трюки, подробное объяснение различные функции и некоторые общие примеры, уже написанные для Arduino.

Библиотека БПФ работает быстро, настолько быстро, что пришлось вставлять в код задержку, чтобы уменьшить мерцание. Вы сразу заметите конечный результат:дисплей работает намного быстрее и отзывчивее, чем версия, использующая библиотеку FFT, которая часто отстает от музыки. Меньшее использование системных ресурсов позволило нам добавить несколько строк кода для управления дополнительными функциями.

Новая версия

Проект идентичен предыдущей версии, поэтому тем, кто уже сделал предыдущую, нужно только добавить кнопку и резистор 10K и обновить код.

Помимо реализации библиотеки FHT, эта версия имеет следующие дополнительные функции:

  • есть дополнительная кнопка для регулировки яркости;
  • позволяет сохранять настройки цвета и яркости в EEPROM, чтобы перезагрузить их при следующем включении;
  • отображает уровень настроек цвета и яркости при нажатии кнопок и при включении (можно отключить).

Код

  • Версия кода FHT
Версия кода FHT Arduino
 / * Авторские права (c) 2020 Janux Настоящим предоставляется бесплатное разрешение любому лицу, получающему копию этого программного обеспечения и связанных файлов документации («Программное обеспечение»), для работы с Программным обеспечением без ограничений, в том числе без ограничение прав на использование, копирование, изменение, объединение, публикацию, распространение, сублицензирование и / или продажу копий Программного обеспечения, а также разрешение лицам, которым предоставляется Программное обеспечение, делать это при соблюдении следующих условий:Вышеуказанные авторские права уведомление и это уведомление о разрешении должны быть включены во все копии или существенные части Программного обеспечения. ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИИ КОММЕРЧЕСКОЙ ЦЕННОСТИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ И НЕЗАЩИТЫ ОТ ПРАКТИКИ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ АВТОРЫ ИЛИ ВЛАДЕЛЬЦЫ АВТОРСКИХ ПРАВ НЕ НЕСЕТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЕТЕНЗИИ, УБЫТКИ ИЛИ ДРУГИЕ ОТВЕТСТВЕННОСТЬ, ПРОИЗВОДИМЫЕ В РЕЗУЛЬТАТЕ ДОГОВОРА, ПРАКТИКИ ИЛИ ИНЫМ ОБРАЗОМ, ВОЗНИКАЮЩИМ, ВНУТРЕННИЕ ИЛИ В СВЯЗИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ ДРУГИМИ ДЕЛАМИ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. На основе оригинального проекта светодиодной матрицы MAX72xx и библиотеки FFT от Shajeeb. Раздел настроек конфигурации основан на работе Рагнара Ранёйена Хомба из Norvegian Creation. * / # Define LIN_OUT 1 // Величина линейного выхода FHT # define FHT_N 128 // установить ОБРАЗЦЫ для FHT, Должна быть степень 2 # include  #define xres 32 // Общее количество столбцов на дисплее, должно быть <=SAMPLES / 2 # define yres 8 // Общее количество строк на дисплее #define ledPIN 6 // вывод пинты для управления светодиодами # define NUM_LEDS (xres * yres) // общее количество светодиодов в матрице # include  #define colorPIN 5 // пин для изменения цвета led # определить яркостьPIN 10 // пин для изменения яркости byte displaycolor =0; // значение цвета по умолчанию, байт яркость =1; // уровень яркости по умолчанию # include  #define CONFIG_START 32 // Начальное местоположение памяти # define CONFIG_VERSION "VER01" // Config version configurationtypedef struct {char version [6]; байт displaycolor; байт яркости;} тип_конфигурации; тип_конфигурации КОНФИГУРАЦИЯ ={КОНФИГУРАЦИЯ, цвет дисплея, яркость}; значение y в байтах; пики int [xres]; состояние байта =ВЫСОКОЕ; // текущее значение входного пинбайта previousState =LOW; // предыдущее чтение с входа pinunsigned long lastDebounceTime =0; // последний раз, когда выходной вывод был переключен unsigned long debounceDelay =100; // время дребезга; увеличивать, если на выходе flickersbyte data_avgs [xres]; // Массив для выборки // Параметр 1 =количество светодиодов в матрице // Параметр 2 =номер контакта // Параметр 3 =флаги типа пикселя, при необходимости сложите вместе:// NEO_KHZ800 800 кГц битовый поток (большинство продуктов NeoPixel со светодиодами WS2812 ) // NEO_KHZ400 400 кГц (классические пиксели FLORA v1 (не v2), драйверы WS2811) // NEO_GRB Пиксели подключены к потоку битов GRB (большинство продуктов NeoPixel) // Пиксели NEO_RGB подключены к потоку битов RGB (пиксели FLORA v1, не v2) Adafruit_NeoPixel pixel =Adafruit_NeoPixel (NUM_LEDS, ledPIN, NEO_GRB + NEO_KHZ800); // Байт фильтра эквалайзера eq [32] ={60, 65, 70, 75, 80, 85, 90, 95, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 115, 125, 140, 160, 185, 200, 200, 200}; bool EQ_ON =true; // установите значение false, чтобы отключить эквалайзер. // Определите 5 наборов цветов для светодиодов, 0 для отдельных пользовательских цветов colorbyte [] [8] ={{170, 160, 150, 140, 130, 120, 1, 1}, { 1, 5, 10, 15, 20, 25, 90, 90}, {90, 85, 80, 75, 70, 65, 1, 1}, {90, 90, 90, 30, 30, 30, 1, 1}, {170, 160, 150, 140, 130, 120, 110, 0}}; // Определить символы для настроек отображенияbyte charBitmap [] ={0x1C, 0x10, 0x10, 0x10, 0x10, 0x1C, 0x08, 0x18, 0x08, 0x08, 0x08, 0x1C, 0x0C, 0x12, 0x04, 0x08, 0x10, 0x1E, 0x0C, 0x12, 0x02, 0x06, 0x12, 0x0C, 0x10, 0x10, 0x10, 0x14, 0x1E, 0x1E, 0x04, 0x04, 0x1E 0x02, 0x12, 0x0C, 0x1E, 0x10, 0x10, 0x1E, 0x12, 0x1E, 0x1E, 0x02, 0x04, 0x08, 0x08, 0x08, 0x0C, 0x12, 0x0C, 0x12, 0x12, 0x0C, 0x12, 0x1C, 0x12, 0x1C, 0x12, 0x1C, 0x12, 0x1C}; установка void () {pixel.begin (); // инициализировать светодиодную матрицу // начать операции БПФ ADCSRA =0b11100101; // переводим АЦП в автономный режим и устанавливаем предварительный масштабатор на 32 (0xe5) ADMUX =0b00000000; // использовать вывод A0 и внешнее опорное напряжение // Считываем данные конфигурации из EEPROM if (loadConfig ()) {displaycolor =CONFIGURATION.displaycolor; яркость =КОНФИГУРАЦИЯ.яркость; } // Устанавливаем яркость, загружаемую из EEPROM pixel.setBrightness (яркость * 24 + 8); // Показывать текущую конфигурацию при запуске // измените true на false, если вы не хотите, чтобы это было showSettings (3, true);} void loop () {while (1) {// уменьшает дрожание Sampling (); // Библиотека FHT использует только один массив данных RearrangeFHT (); // переставляем результат FHT, чтобы он совпадал с номером. отображаемых столбцов SendToDisplay (); // отправляем на дисплей по измеренному значению colorChange (); // проверяем, нажата ли кнопка для изменения яркости цветаChange (); // проверяем, нажата ли кнопка, чтобы изменить задержку яркости (10); // задержка для уменьшения мерцания (FHT слишком быстрый:D)}} void Sampling () {for (int i =0; i  peaks [i]) peaks [i] =yvalue; // сохраняем пик, если> предыдущий пик yvalue =peaks [i]; // выбираем пик для отображения setColumn (i, yvalue); // рисуем столбцы} pixel.show (); // показать столбец} // Загораются светодиоды столбца x в соответствии со значением yvoid setColumn (byte x, byte y) {int led, i; для (я =0; я  i) {switch (displaycolor) {case 4:if (colors [displaycolor] [i] ==0) {// показать пользовательский цвет с нулевым значением в массиве pixel.setPixelColor (led, 255, 255, 255); // с} else {// стандартный цвет, определенный в массиве цветов pixel.setPixelColor (led, Wheel (colors [displaycolor] [i])); } ломать; case 5:// меняем цвет по столбцу pixel.setPixelColor (led, Wheel (x * 16)); ломать; case 6:// меняем цвет по строке pixel.setPixelColor (led, Wheel (i * y * 3)); ломать; case 7:// изменить цвет на ... country:D // флаг Италии // if (x <11) pixel.setPixelColor (led, 0, 255, 0); // если (x> 10 &&x <21) pixel.setPixelColor (led, 255, 255, 255); // если (x> 20) pixel.setPixelColor (led, 255, 0, 0); // звезды и полосы if (i  debounceDelay) {displaycolor ++; если (displaycolor> 7) displaycolor =0; showSettings (1, истина); // установите значение false, если это вам не нужно saveConfig (); lastDebounceTime =миллис (); } previousState =чтение;} void BrightnessChange () {int чтение =digitalRead (яркостьPIN); if (чтение ==HIGH &&previousState ==LOW &&millis () - lastDebounceTime> debounceDelay) {яркость ++; если (яркость> 7) яркость =0; pixel.setBrightness (яркость * 24 + 8); showSettings (2, истина); // установите значение false, если это вам не нужно saveConfig (); lastDebounceTime =миллис (); } previousState =reading;} // Утилита из демонстрационного скетча Adafruit Neopixel // Введите значение от 0 до 255, чтобы получить значение цвета. // Цвета представляют собой переход R - G - B - назад к R. unsigned long Wheel (byte WheelPos) {WheelPos =255 - WheelPos; if (WheelPos <85) {вернуть pixel.Color (255 - WheelPos * 3, 0, WheelPos * 3); } if (WheelPos <170) {WheelPos - =85; вернуть pixel.Color (0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos - =170; return pixel.Color (WheelPos * 3, 255 - WheelPos * 3, 0);} // загружаем содержимое EEPROM в локальную КОНФИГУРАЦИЮ, если это допустимый параметр int loadConfig () {if (EEPROM.read (CONFIG_START + 0) ==CONFIG_VERSION [0] &&EEPROM.read (CONFIG_START + 1) ==CONFIG_VERSION [1] &&EEPROM.read (CONFIG_START + 2) ==CONFIG_VERSION [2] &&EEPROM.read (CONFIG_START + 3) ==CONFIG 3_VERSION [1] ] &&EEPROM.read (CONFIG_START + 4) ==CONFIG_VERSION [4]) {// загружаем (перезаписываем) локальную структуру конфигурации для (unsigned int i =0; i  =0; x--) {for (int y =5; y> =0; y--) { если ((charBitmap [val * 6 + 5 - y]>> x) &0x01) {pixel.setPixelColor (GetLedFromMatrix (4 - x + pos, y + 1), Wheel ((pos> 10) * 170)); pixel.show (); }}}} // от Janux®, последняя версия от 28.06.2020. 

Схема


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

  1. Анализатор звукового спектра 32 (Linier) / 11 (псевдо-лог) диапазона
  2. Сигнал тревоги для растений, предупреждающий о жажде
  3. Итальянские часы со словами
  4. Счетчик кВтч Sigfox
  5. Монитор температуры Bluetooth
  6. Блокировка, управляемая жестами
  7. Компаньон IC
  8. USB-MIDI-адаптер
  9. Изолированный аналоговый вход для Arduino
  10. Измерьте время реакции