代码
FHT 代码版本Arduino
/* 版权所有 (c) 2020 Janux 特此授予任何人免费获得本软件和相关文档文件(“软件”)副本的许可,以不受限制地处理本软件,包括没有限制使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许软件提供给的人这样做,但须符合以下条件: 上述版权通知,并且本许可通知应包含在软件的所有副本或重要部分中。该软件“按原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于适销性、特定用途的适用性和不侵权的保证。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任承担责任,无论是在合同诉讼、侵权行为或其他方面,由软件或软件的使用或使用或其他原因引起的或与之相关的软件。基于由 Shajeeb 制作的 MAX72xx LED 矩阵和 FFT 库的原始项目。配置设置部分基于来自 Norvegian Creation 的 Ragnar Ranøyen Homb 的工作。*/#define LIN_OUT 1 //FHT 线性输出幅度#define FHT_N 128 //为 FHT 设置 SAMPLES,必须是 2 的幂 #include #define xres 32 //显示总列数,必须<=SAMPLES/2#define yres 8 //显示总行数#define ledPIN 6 //out pint to control Leds#define NUM_LEDS (xres * yres) //矩阵中的总 LED#include #define colorPIN 5 //pin 改变 ledcolor#define 亮度PIN 10 //pin 改变亮度字节 displaycolor =0; //默认颜色值字节亮度=1; //默认亮度级别#include #define CONFIG_START 32 //内存起始位置#define CONFIG_VERSION "VER01" //配置版本 configurationtypedef struct { char version[6];字节显示颜色;字节亮度;} configuration_type;configuration_type CONFIGURATION ={ CONFIG_VERSION,displaycolor,brightness};byte yvalue;int peaks[xres];byte state =HIGH; // 从输入 pinbyte 中读取的当前读数 previousState =LOW; // 之前从输入引脚读取的数据unsigned long lastDebounceTime =0; // 最后一次切换输出引脚无符号长去抖动延迟 =100; // 去抖动时间;如果输出闪烁,则增加 data_avgs[xres]; // 采样阵列// 参数 1 =矩阵中的 LED 数量// 参数 2 =引脚编号// 参数 3 =像素类型标志,根据需要相加:// NEO_KHZ800 800 KHz 比特流(大多数 NeoPixel 产品带有 WS2812 LED )// NEO_KHZ400 400 KHz(经典的“v1”(不是 v2)FLORA 像素,WS2811 驱动程序)// NEO_GRB 像素连接到 GRB 比特流(大多数 NeoPixel 产品)// NEO_RGB 像素连接到 RGB 比特流(v1 FLORA 像素,不是v2)Adafruit_NeoPixel pixel =Adafruit_NeoPixel(NUM_LEDS, ledPIN, NEO_GRB + NEO_KHZ800);// EQ filterbyte eq[32] ={ 60, 65, 70, 75, 80, 85, 90, 95, 100,1001001 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 115, 125, 140, 160, 185, 200, 200}; 200 // 设置为 false 以禁用 eq//为 LED 定义 5 组颜色,0 为单个自定义颜色字节颜色[][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, 0x18,0x1C, 0 0x08时,0x08时,0x08时,为0x1C,0x0C,0×12,×04,0x08时,0×10,0X1E,0x0C,0×12,0×02,0×06,×12,0x0C,0x10的,为0x10,0x10的,0×14,0X1E,0x04的0X1E,0x10的,0X1E, 0×02,×12,0x0C,0X1E,为0x10,0x10的,0X1E,0×12,0X1E,0X1E,0×02,×04,0x08时,0x08时,0x08时,0x0C,0×12,0x0C,0×12,×12,0x0C,为0x1C,0×12,为0x1C,0×12, 0x12, 0x1C};void setup() { pixel.begin(); //初始化LED矩阵 //开始FFT运算 ADCSRA =0b11100101; // 将 ADC 设置为自由运行模式并将预分频器设置为 32 (0xe5) ADMUX =0b00000000; // 使用引脚 A0 和外部参考电压 // 从 EEPROM 读取配置数据 if (loadConfig()) { displaycolor =CONFIGURATION.displaycolor;亮度 =CONFIGURATION.brightness; } //设置从EEPROM加载的亮度 pixel.setBrightness(brightness * 24 + 8); //在开始时显示当前配置 //如果你不想要这个 showSettings(3, true);}void loop() { while (1) { // 减少抖动 Sampling(); // FHT 库只使用一个数据数组 RearrangeFHT(); // 重新排列 FHT 结果以匹配 no。显示列数 SendToDisplay(); // 根据测量值发送显示 colorChange(); // 检查按钮是否按下以更改颜色亮度更改(); // 检查按钮是否按下以改变亮度延迟(10); // 延迟减少闪烁(FHT 太快:D) }}void Sampling() { for (int i =0; i peaks[i]) peaks[i] =yvalue; // 保存峰值 if> previuos peak yvalue =peaks[i]; // 选取峰值以显示 setColumn(i, yvalue); // 绘制列 } pixel.show(); // 显示列}// 根据 y 值点亮 x 列的 LED void setColumn(byte x, byte y) { int led, i; for (i =0; i i) { switch (displaycolor) { case 4:if (colors[displaycolor][i] ==0) { // 显示自定义颜色为零值在数组中 pixel.setPixelColor(led, 255, 255, 255); //withe } 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 //Italy flagh //if (x <11) pixel.setPixelColor(led, 0, 255, 0); //if (x> 10 &&x <21) pixel.setPixelColor(led, 255, 255, 255); //if (x> 20) pixel.setPixelColor(led, 255, 0, 0); //星星和条纹 if (i debounceDelay) { displaycolor++; if (displaycolor> 7) displaycolor =0; showSettings(1, true); //如果你不想要这个saveConfig(),设置为false; lastDebounceTime =毫秒(); } previousState =reading;}void BrightnessChange() { int reading =digitalRead(brightnessPIN); if (reading ==HIGH &&previousState ==LOW &&millis() - lastDebounceTime> debounceDelay) { 亮度++;如果(亮度> 7)亮度=0; pixel.setBrightness(brightness * 24 + 8); showSettings(2, true); //如果你不想要这个saveConfig(),设置为false; lastDebounceTime =毫秒(); } previousState =reading;}// 来自 Adafruit Neopixel 演示草图的实用程序// 输入一个 0 到 255 的值以获得颜色值。// 颜色是一个过渡 R - G - B - 回到 R.unsigned long Wheel(byte WheelPos) { WheelPos =255 - WheelPos; if (WheelPos <85) { return pixel.Color(255 - WheelPos * 3, 0, WheelPos * 3); } if (WheelPos <170) { WheelPos -=85;返回 pixel.Color(0, WheelPos * 3, 255 - WheelPos * 3);轮位置-=170; return pixel.Color(WheelPos * 3, 255 - WheelPos * 3, 0);}// 如果是有效设置,则将 EEPROM 中的内容加载到本地 CONFIGURATION 中 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_VERSION[3] ] &&EEPROM.read(CONFIG_START + 4) ==CONFIG_VERSION[4]) { // 加载(覆盖)本地配置结构 for (unsigned int i =0; i =0; x--) { for (int y =5; y>=0; y--) { if ((charBitmap[val * 6 + 5 - y]>> x) &0x01) { pixel.setPixelColor(GetLedFromMatrix(4 - x + pos, y + 1), Wheel((pos> 10) * 170));像素显示(); } } }}//作者:Janux®,2020 年 6 月 28 日最新版本。