Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

FHT Audio Spectrum Visualizer

Componenten en benodigdheden

Arduino Nano R3
× 1
WS2812B 8X32 RGB LED MATRIX
× 1
Weerstand 4.75k ohm
× 3
Weerstand 100k ohm
× 2
Weerstand 10k ohm
× 2
Through Hole Resistor, 390 ohm
× 1
1N4007 – Diode voor hoge spanning, hoge stroomsterkte
Zelfs een 1N4004 doet het prima
× 1
Condensator 100 nF
× 2
Condensator 1000 µF
× 1
SparkFun Drukknopschakelaar 12 mm
Of twee paneelknoppen als u van plan bent het circuit in een doos te plaatsen
× 2
Algemeen prototype bord van 4x6 cm
× 1
PCB stereo RCA vrouwelijke stekker
× 1

Benodigde gereedschappen en machines

Soldeerbout (algemeen)
3,5 mm audio-jackkabel naar stereo RCA-connector

Over dit project

De Arduino FHT-bibliotheek

FHT doet precies hetzelfde werk als de meer bekende FFT, maar in tegenstelling tot deze gebruikt het alleen echte gegevens, terwijl FFT werkt aan complexe gegevens, daarom gebruikt FHT de helft van de verwerkingskracht en de helft van het systeemgeheugen.

Deze bibliotheek gebruikt een enkele array voor gegevensbemonstering in plaats van twee, één voor echte waarden en één voor denkbeeldige waarden, gebruikt door FFT lib, het vereenvoudigt ook complexe wiskundige berekeningen en vermijdt lussen met complexe logaritmische berekeningen met drijvende komma en gebruikt in plaats daarvan enkele numerieke tabellen .

Het nadeel is dat het altijd de helft van de waarden retourneert van de grootte van de array die wordt gebruikt om de bemonstering uit te voeren, dit leidt tot een zeker verlies aan resolutie en precisie aan de twee uiteinden van het audiobereik. In het specifieke geval hoeven we echter geen meetinstrument te ontwikkelen maar een simpele gadget, we hebben geen extreme precisie nodig, we hoeven alleen maar een handvol LED's in muzikaal ritme aan te zetten.

Natuurlijk is dit niet de juiste plaats om de modaliteitswerking van de FHT-bibliotheek te bespreken, iedereen die meer wil weten, kan verwijzen naar de Open Music Lab-website waar ze alle benodigde documentatie zullen vinden om de gebruikte trucs te begrijpen, de gedetailleerde uitleg van de verschillende functies en enkele generieke voorbeelden die al voor Arduino zijn geschreven.

De FFT-bibliotheek is snel, zo snel dat het nodig was om een ​​vertraging in de code in te voegen om flikkering te verminderen. Je merkt meteen het eindresultaat, het display is veel sneller en responsiever dan de versie die gebruik maakt van de FFT-bibliotheek die vaak achter de muziek aan leek te lopen. Door minder systeembronnen te gebruiken, konden we enkele regels code toevoegen om extra functies te beheren.

De nieuwe versie

Het project is identiek aan de vorige versie, dus degenen die de vorige al hebben gemaakt, hoeven alleen een knop en een 10K-weerstand toe te voegen en de code bij te werken.

Naast de implementatie van de FHT-bibliotheek heeft deze versie de volgende extra functies:

  • heeft een extra knop voor het aanpassen van de helderheid;
  • laat het opslaan van kleur- en helderheidsinstellingen in de EEPROM toe om ze de volgende keer dat het wordt ingeschakeld opnieuw te laden;
  • toont kleur- en helderheidsinstellingen wanneer knoppen worden ingedrukt en ingeschakeld (kan worden uitgeschakeld).

Code

  • FHT-codeversie
FHT-codeversieArduino
/* Copyright (c) 2020 Janux Toestemming wordt hierbij gratis verleend aan eenieder die een kopie van deze software en bijbehorende documentatiebestanden (de "Software") verkrijgt, om zonder beperking in de Software te handelen, inclusief zonder beperking van de rechten voor het gebruiken, kopiëren, wijzigen, samenvoegen, publiceren, distribueren, in sublicentie geven en/of verkopen van kopieën van de Software, en om personen aan wie de Software wordt verstrekt toe te staan ​​dit te doen, met inachtneming van de volgende voorwaarden:Het bovenstaande copyright kennisgeving en deze toestemmingskennisgeving zal worden opgenomen in alle kopieën of substantiële delen van de Software. DE SOFTWARE WORDT GELEVERD "AS IS", ZONDER ENIGE GARANTIE, EXPLICIET OF IMPLICIET, INCLUSIEF MAAR NIET BEPERKT TOT DE GARANTIES VAN VERKOOPBAARHEID, GESCHIKTHEID VOOR EEN BEPAALD DOEL EN NIET-INBREUK. IN GEEN GEVAL ZULLEN DE AUTEURS OF HOUDERS VAN HET AUTEURSRECHT AANSPRAKELIJK ZIJN VOOR ENIGE CLAIM, SCHADE OF ANDERE AANSPRAKELIJKHEID, HETZIJ IN EEN OVEREENKOMST, ONRECHTMATIGE OF ANDERE, VOORTVLOEIENDE UIT, UIT OF IN VERBAND MET DE SOFTWARE OF HET GEBRUIK IN OF DE ANDERE HANDELINGEN SOFTWARE. Gebaseerd op een origineel project voor de MAX72xx LED-matrix en FFT-lib gemaakt van Shajeeb. Configuratie-instellingen sectie gebaseerd op het werk van Ragnar Ranøyen Homb van Norvegian Creation.*/#define LIN_OUT 1 //FHT linear output magnitude#define FHT_N 128 //set SAMPLES for FHT, must be a power of 2#include  #define xres 32 //Totaal aantal kolommen in het display, moet <=SAMPLES/2#define yres 8 //Totaal aantal rijen in het display#define ledPIN 6 //out pint om Leds te bedienen#define NUM_LEDS (xres * yres) //totaal leds in Matrix#include #define colorPIN 5 //pin om ledcolor te veranderen#define brightPIN 10 //pin om helderheid te veranderenbyte displaycolor =0; // standaard kleurwaardebyte helderheid =1; //standaard helderheidsniveau#include #define CONFIG_START 32 //Startlocatie geheugen#define CONFIG_VERSION "VER01" //Config version configurationtypedef struct { char version[6]; byte weergavekleur; byte helderheid;} configuration_type;configuration_type CONFIGURATION ={CONFIG_VERSION, displaycolor, helderheid};byte yvalue;int peaks[xres];byte state =HOOG; // de huidige lezing van de invoer pinbyte previousState =LAAG; // de vorige lezing van de invoer pinunsigned lange lastDebounceTime =0; // de laatste keer dat de uitvoerpin werd toggledunsigned lange debounceDelay =100; // de debouncetijd; verhogen als de uitvoer flikkert data_avgs[xres]; //Array voor samplig// Parameter 1 =aantal leds in matrix// Parameter 2 =pinnummer// Parameter 3 =pixeltype vlaggen, optellen indien nodig:// NEO_KHZ800 800 KHz bitstream (de meeste NeoPixel-producten met WS2812 LED's )// NEO_KHZ400 400 KHz (klassiek 'v1' (niet v2) FLORA-pixels, WS2811-stuurprogramma's)// NEO_GRB Pixels zijn bedraad voor GRB-bitstream (de meeste NeoPixel-producten)// NEO_RGB Pixels zijn bedraad voor RGB-bitstream (v1 FLORA-pixels, niet 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 =true; // ingesteld op false om eq uit te schakelen // Definieer 5 kleurensets voor leds, 0 voor enkele aangepaste colorbytekleuren [][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}};//Definieer tekens voor weergave-instellingenbyte 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, 0,1x, 0x, 0x02, 0x12, 0x0C, 0x1E, 0x10, 0x10, 0x1E, 0x12, 0x1E, 0x1E, 0x02, 0x04, 0x08, 0x08, 0x08, 0x0C, 0x12, 0x0C, 0x12, 0x12, 0x0C,x 0x1C,x 0x12, 0x1C};void setup() {pixel.begin(); // initialiseer Led Matrix // Begin FFT-bewerkingen ADCSRA =0b11100101; // stel ADC in op vrijloopmodus en stel pre-scaler in op 32 (0xe5) ADMUX =0b00000000; // gebruik pin A0 en externe spanningsreferentie // Lees configuratiegegevens van EEPROM if (loadConfig ()) {displaycolor =CONFIGURATION.displaycolor; helderheid =CONFIGURATIE.helderheid; } // Helderheid instellen geladen vanuit EEPROM pixel.setBrightness (helderheid * 24 + 8); //Toon huidige configuratie bij start // verander true in false als je dit niet wilt showSettings(3, true);}void loop() { while (1) { // reduceert jitter Sampling(); // FHT-bibliotheek gebruikt slechts één gegevensarray RerangeFHT(); // herschik het FHT-resultaat zodat het overeenkomt met nr. van weergavekolommen SendToDisplay(); // stuur naar display volgens gemeten waarde colorChange(); // controleer of de knop is ingedrukt om de kleurhelderheid te wijzigenChange (); // controleer of de knop is ingedrukt om de vertraging van de helderheid te wijzigen (10); // vertraging om flikkering te verminderen (FHT is te snel :D) }}void Sampling() { for (int i =0; i  pieken [i]) pieken [i] =y-waarde; // bewaar piek als> vorige piek ywaarde =pieken [i]; // kies piek om setColumn (i, yvalue) weer te geven; // teken kolommen } pixel.show(); // toon kolom}// Licht leds van x kolom op volgens y valuevoid setColumn (byte x, byte y) {int led, i; for (i =0; i  i) {switch (displaycolor) {case 4:if (colors[displaycolor][i] ==0) {// toon aangepaste kleur met nulwaarde in array pixel.setPixelColor (led, 255, 255, 255); // withe } else { // standaardkleur gedefinieerd in kleurenarray pixel.setPixelColor (led, Wheel (colors [displaycolor][i])); } pauze; geval 5:// verander de kleur per kolom pixel.setPixelColor (led, Wheel (x * 16)); pauze; geval 6:// verander de kleur per rij pixel.setPixelColor (led, Wheel (i * y * 3)); pauze; case 7://kleur wijzigen per... land:D //Italië vlag //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); // sterren en strepen if (i  debounceDelay) { displaycolor++; if (displaycolor> 7) displaycolor =0; showSettings(1, true); // stel in op false als u dit niet wilt saveConfig(); lastDebounceTime =millis(); } previousState =lezen;} ongeldige helderheidChange () { int reading =digitalRead (brightnessPIN); if (lezing ==HOOG &&previousState ==LAAG &&millis() - lastDebounceTime> debounceDelay) { helderheid++; als (helderheid> 7) helderheid =0; pixel.setHelderheid (helderheid * 24 + 8); showSettings(2, true); // stel in op false als u dit niet wilt saveConfig(); lastDebounceTime =millis(); } previousState =lezen;}// Utility van Adafruit Neopixel demo sketch// Voer een waarde 0 tot 255 in om een ​​kleurwaarde te krijgen.// De kleuren zijn een overgang R - G - B - terug naar 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; return pixel.Color (0, WheelPos * 3, 255 - WheelPos * 3); } WielPos -=170; return pixel.Color(WheelPos * 3, 255 - WheelPos * 3, 0);}// laad wat er in EEPROM staat in de lokale CONFIGURATIE als het een geldige instelling is in 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]) { // laad (overschrijf) de lokale configuratiestructuur voor (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(); } } }}//door Janux®, Laatste versie op 28/06/2020.

Schema's


Productieproces

  1. 32 (Linier)/11 (Pseudo Log) band Audio Spectrum Analyzer
  2. Dorstalarm plantalarm
  3. Italiaanse Word Clock
  4. Sigfox kWh-meter
  5. Bluetooth-temperatuurmeter
  6. Gebarengestuurd slot
  7. The Companion IC
  8. USB MIDI-adapter
  9. Een geïsoleerde analoge ingang voor Arduino
  10. RGB 32-bands audiospectrumvisualizer
  11. Meet je reactietijd