Код
- 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 =чтение;}