代码
- 32_Band_LED_Spectrum_Analyzer-009.ino
32_Band_LED_Spectrum_Analyzer-009.inoArduino
随意修改/定制以满足您的需要,在我的定制部分代码上(重新映射数据,用注释标记)。// Christian Suryanto 修改的代码,来自 (c) 2019 Shajeeb TM// HAZI TECH/ / 由 Christian Suryanto 更新// #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 它是 HEXADECIMAL.#define NEXT 0xFFC23D // 控制停止代码#define 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; // 按钮 pinint state =HIGH; // 从输入 pinint previousState =LOW 的当前读数; // 之前从输入 pinint 读取的显示模式; unsigned long lastDebounceTime =0; // 上次切换输出引脚无符号长 debounceDelay =50; // 去抖动时间;如果输出闪烁则增加 MY_ARRAY[]={0, 128, 192, 224, 240, 248, 252, 254, 255}; // default =标准模式//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}; // 顶部有一个间隙,第 3 盏灯向前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, 13 130, 130, 130, 130, 130, 130, 145, 155, 170, 180, 215, 220, 245, 255 };byte eq2[11] ={40, 70, 75, 10, 110, 15 220, 220, 230, 250};MD_MAX72XX mx =MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES); // 显示对象arduinoFFT FFT =arduinoFFT(); // FFT 对象 void setup() { EEPROM.update(1,1); //(内存地址,值),第一次运行 displaymode =EEPROM.read(1); //显示模式 =1; ADCSRA =0b11100101; // 将 ADC 设置为自由运行模式并将预标量设置为 32 (0xe5) ADMUX =0b00000000; // 使用引脚 A0 和外部电压参考 pinMode(buttonPin, INPUT); mx.begin(); // 初始化显示 mx.control(MD_MAX72XX::INTENSITY, 0); // 设置 LED 强度延迟 (50); // 等待参考电压稳定} void loop() { // ++ Sampling int numData;双 rSum; for(int i=0; i peaks[i]) peaks[i] =yvalue; yvalue =峰值[i]; displayvalue=MY_ARRAY[yvalue]; switch (displaymode) { case 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 =毫秒(); } previousState =阅读;}