Código
Versão do código FHT Arduino
/ * Copyright (c) 2020 Janux A permissão é concedida, gratuitamente, a qualquer pessoa que obtenha uma cópia deste software e arquivos de documentação associados (o "Software"), para lidar com o Software sem restrições, incluindo sem limitar os direitos de usar, copiar, modificar, fundir, publicar, distribuir, sublicenciar e / ou vender cópias do Software e permitir que as pessoas a quem o Software é fornecido o façam, sujeito às seguintes condições:Os direitos autorais acima aviso e este aviso de permissão devem ser incluídos em todas as cópias ou partes substanciais do Software. O SOFTWARE É FORNECIDO "NO ESTADO EM QUE SE ENCONTRA", SEM QUALQUER TIPO DE GARANTIA, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UM DETERMINADO FIM E NÃO VIOLAÇÃO. EM NENHUMA HIPÓTESE OS AUTORES OU TITULARES DOS DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER RECLAMAÇÃO, DANOS OU OUTRA RESPONSABILIDADE, SEJA EM UMA AÇÃO DE CONTRATO, DELITO OU DE OUTRA FORMA, DECORRENTE DE, FORA DE OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NO PROGRAMAS. Baseado em um projeto original para a matriz de LED MAX72xx e FFT lib feito de Shajeeb. Seção de definições de configuração baseada no trabalho de Ragnar Ranøyen Homb da Norvegian Creation. * / # Define LIN_OUT 1 // magnitude de saída linear FHT # define FHT_N 128 // define AMOSTRAS para FHT, deve ser uma potência de 2 # incluir #define xres 32 // Número total de colunas no display, deve ser <=SAMPLES / 2 # define yres 8 // Número total de linhas no display # define ledPIN 6 // out pint para controlar Leds # define NUM_LEDS (xres * yres) // total de leds na matriz # inclui #define colorPIN 5 // pino para alterar ledcolor # define brilhoPIN 10 // pino para alterar brilhobyte displaycolor =0; // cor padrão valor por meio de brilho =1; // nível de brilho padrão # include #define CONFIG_START 32 // Local de início da memória # define CONFIG_VERSION "VER01" // Versão de configuração configurationtypedef struct {char version [6]; byte displaycolor; brilho do byte;} tipo_de_configuração; tipo_de_configuração CONFIGURAÇÃO ={CONFIG_VERSION, cor do display, brilho}; valor y do byte; picos internos [xres]; estado do byte =ALTO; // a leitura atual do pinbyte de entrada previousState =LOW; // a leitura anterior da entrada pinunsigned long lastDebounceTime =0; // a última vez que o pino de saída foi alternado para assinar long debounceDelay =100; // o tempo de debounce; aumentar se a saída piscar byte data_avgs [xres]; // Matriz para amostra // Parâmetro 1 =número de leds na matriz // Parâmetro 2 =número do pino // Parâmetro 3 =sinalizadores de tipo de pixel, some conforme necessário:// NEO_KHZ800 800 KHz bitstream (a maioria dos produtos NeoPixel com LEDs WS2812 ) // NEO_KHZ400 400 KHz (clássico 'v1' (não v2) pixels FLORA, drivers WS2811) // NEO_GRB Pixels são conectados para GRB bitstream (a maioria dos produtos NeoPixel) // NEO_RGB Pixels são conectados para RGB bitstream (v1 FLORA pixels, não 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, 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 =verdadeiro; // defina como falso para desativar o eq // Defina 5 conjuntos de cores para leds, 0 para cores de byte de cor único personalizado [] [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}}; // Definir caracteres para as configurações de exibição byte charBitmap [] ={0x1C, 0x10, 0x10, 0x10, 0x10, 0x1C, 0x08, 0x18, 0x08, 0x08, 0x08, 0x1C, 0x0C, 0x12, 0x04, 0x08, 0x10, 0x1E, 0x0C, 0x12, 0x02, 0x06, 0x06, 0x12, 0x0C, 0x10, 0x10, 0x10, 0x14, 0x1E, 0x04, 0x1E, 0x10, 0x1E, 0x02, 0x12, 0x0C, 0x1E, 0x10, 0x10, 0x1E, 0x12, 0x1E, 0x1E, 0x02, 0x04, 0x08, 0x08, 0x08, 0x08, 0x0C, 0x12, 0x0C, 0x12, 0x12, 0x0C, 0x1C, 0x12, 0x1C, 0x12, 0x12, 0x1C}; configuração vazia () {pixel.begin (); // inicializa o Led Matrix // Inicia as operações FFT ADCSRA =0b11100101; // define o ADC para o modo de execução livre e define o pré-escalonador para 32 (0xe5) ADMUX =0b00000000; // use o pino A0 e a referência de tensão externa // Lê os dados de configuração da EEPROM if (loadConfig ()) {displaycolor =CONFIGURATION.displaycolor; brilho =CONFIGURAÇÃO.brilho; } // Define o brilho carregado do EEPROM pixel.setBrightness (brilho * 24 + 8); // Mostra a configuração atual ao iniciar // altera verdadeiro para falso se você não quiser isso showSettings (3, true);} void loop () {while (1) {// reduz o jitter Sampling (); // Biblioteca FHT usa apenas um array de dados RearrangeFHT (); // reorganize o resultado FHT para corresponder ao nº de colunas de exibição SendToDisplay (); // enviar para exibir de acordo com o valor medido colorChange (); // verifique se o botão foi pressionado para alterar a cor BrightChange (); // verifique se o botão pressionado para alterar o retardo de brilho (10); // demora para reduzir a cintilação (FHT é muito rápido:D)}} void Sampling () {for (int i =0; i peaks [i]) peaks [i] =yvalue; // salvar o pico se> previuos pico yvalue =peaks [i]; // escolhe o pico para exibir setColumn (i, yvalue); // desenha colunas} pixel.show (); // mostrar coluna} // Acender leds da coluna x de acordo com o valor yevoid setColumn (byte x, byte y) {int led, i; para (i =0; i i) {switch (displaycolor) {case 4:if (colors [displaycolor] [i] ==0) {// mostra cor personalizada com valor zero na matriz pixel.setPixelColor (led, 255, 255, 255); // com} else {// cor padrão definida na matriz de cores pixel.setPixelColor (led, Wheel (colors [displaycolor] [i])); } pausa; caso 5:// muda a cor pela coluna pixel.setPixelColor (led, Wheel (x * 16)); pausa; caso 6:// muda a cor por linha pixel.setPixelColor (led, Wheel (i * y * 3)); pausa; caso 7:// mudar a cor por ... país:D // Bandeira da Itália // 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); // estrelas e listras if (i debounceDelay) {displaycolor ++; if (displaycolor> 7) displaycolor =0; showSettings (1, verdadeiro); // defina como falso se você não quiser saveConfig (); lastDebounceTime =millis (); } previousState =reading;} void brilhosChange () {int reading =digitalRead (brilhosPIN); if (lendo ==HIGH &&previousState ==LOW &&millis () - lastDebounceTime> debounceDelay) {brilho ++; se (brilho> 7) brilho =0; pixel.setBrightness (brilho * 24 + 8); showSettings (2, verdadeiro); // defina como falso se você não quiser saveConfig (); lastDebounceTime =millis (); } previousState =reading;} // Utilitário do esboço de demonstração Adafruit Neopixel // Insira um valor de 0 a 255 para obter um valor de cor.// As cores são uma transição R - G - B - de volta para R. não assinada long Wheel (byte WheelPos) {WheelPos =255 - WheelPos; if (WheelPos <85) {return pixel.Color (255 - WheelPos * 3, 0, WheelPos * 3); } if (WheelPos <170) {WheelPos - =85; retornar pixel.Color (0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos - =170; return pixel.Color (WheelPos * 3, 255 - WheelPos * 3, 0);} // carregue o que está em EEPROM na CONFIGURAÇÃO local se for uma configuração válidaint 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]) {// carregar (sobrescrever) a estrutura de configuração local para (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)); pixel.show (); }}}} // por Janux®, última versão em 28/06/2020.