Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

FHT Audio Spectrum Visualizer

Komponenten und Verbrauchsmaterialien

Arduino Nano R3
× 1
WS2812B 8X32 RGB LED MATRIX
× 1
Widerstand 4,75 kOhm
× 3
Widerstand 100k Ohm
× 2
Widerstand 10k Ohm
× 2
Durchgangslochwiderstand, 390 Ohm
× 1
1N4007 – Hochspannungs-, Hochstrom-Nenndiode
Auch ein 1N4004 reicht aus
× 1
Kondensator 100 nF
× 2
Kondensator 1000 µF
× 1
SparkFun Drucktastenschalter 12 mm
Oder zwei Bedienfeldtasten, wenn Sie die Schaltung in eine Box einfügen möchten
× 2
4x6 cm generisches Prototypenboard
× 1
PCB-Stereo-Cinch-Buchse
× 1

Notwendige Werkzeuge und Maschinen

Lötkolben (generisch)
3,5-mm-Audioklinkenkabel auf Stereo-Cinch-Anschluss

Über dieses Projekt

Die Arduino FHT-Bibliothek

FHT macht genau die gleiche Arbeit wie die bekanntere FFT, verwendet jedoch im Gegensatz zu dieser nur echte Daten, während FFT mit komplexen Daten arbeitet, daher verwendet FHT die Hälfte der Rechenleistung und die Hälfte des Systemspeichers.

Diese Bibliothek verwendet ein einzelnes Array für die Datenabtastung anstelle von zwei, eines für reelle Werte und eines für imaginäre Werte, das von der FFT-Bibliothek verwendet wird .

Der Nachteil ist, dass immer die Hälfte der Werte der Größe des Arrays zurückgegeben wird, mit dem das Sampling durchgeführt wird, was zu einem gewissen Verlust an Auflösung und Präzision an den beiden Enden des Audiobereichs führt. Im konkreten Fall müssen wir jedoch kein Messgerät entwickeln, sondern ein einfaches Gadget, wir brauchen keine extreme Präzision, wir müssen nur eine Handvoll LEDs im musikalischen Rhythmus einschalten.

Natürlich ist dies nicht der richtige Ort, um die Modalitäten der FHT-Bibliothek zu diskutieren. Wer mehr erfahren möchte, kann sich auf die Website des Open Music Labs beziehen, wo er alle notwendigen Unterlagen zum Verständnis der verwendeten Tricks, die detaillierte Erklärung der verschiedene Funktionen und einige allgemeine Beispiele, die bereits für Arduino geschrieben wurden.

Die FFT-Bibliothek ist schnell, so schnell, dass eine Verzögerung in den Code eingefügt werden musste, um das Flimmern zu reduzieren. Sie werden sofort das Endergebnis bemerken, die Anzeige ist viel schneller und reaktionsschneller als die Version, die die FFT-Bibliothek verwendet, die oft der Musik hinterherhinkt. Durch die geringere Nutzung der Systemressourcen konnten wir einige Codezeilen hinzufügen, um zusätzliche Funktionen zu verwalten.

Die neue Version

Das Projekt ist identisch mit der vorherigen Version, sodass diejenigen, die die vorherige bereits erstellt haben, nur eine Schaltfläche und einen 10K-Widerstand hinzufügen und den Code aktualisieren müssen.

Neben der Implementierung der FHT-Bibliothek bietet diese Version folgende zusätzliche Funktionen:

  • hat eine zusätzliche Taste zur Helligkeitseinstellung;
  • ermöglicht das Speichern von Farb- und Helligkeitseinstellungen im EEPROM, um sie beim nächsten Einschalten neu zu laden;
  • zeigt die Farb- und Helligkeitseinstellungen an, wenn Tasten gedrückt und eingeschaltet werden (kann deaktiviert werden).

Code

  • FHT-Code-Version
FHT-Code-VersionArduino
/* Copyright (c) 2020 Janux Die Erlaubnis wird hiermit kostenlos jeder Person erteilt, die eine Kopie dieser Software und der zugehörigen Dokumentationsdateien (die "Software") erhält, um mit der Software ohne Einschränkung, einschließlich ohne die Rechte zur Nutzung, zum Kopieren, Modifizieren, Zusammenführen, Veröffentlichen, Verteilen, Unterlizenzieren und/oder Verkaufen von Kopien der Software einzuschränken und Personen, denen die Software zur Verfügung gestellt wird, dies zu gestatten, vorbehaltlich der folgenden Bedingungen:Das oben genannte Urheberrecht Hinweis und dieser Erlaubnishinweis muss in alle Kopien oder wesentlichen Teile der Software aufgenommen werden. DIE SOFTWARE WIRD "WIE BESEHEN" BEREITGESTELLT, OHNE JEGLICHE AUSDRÜCKLICHE ODER STILLSCHWEIGENDE GEWÄHRLEISTUNG, EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT AUF DIE GEWÄHRLEISTUNGEN DER MARKTFÄHIGKEIT, EIGNUNG FÜR EINEN BESTIMMTEN ZWECK UND NICHTVERLETZUNGSVERLETZUNG. IN KEINEM FALL HAFTEN DIE AUTOREN ODER URHEBERRECHTSINHABER FÜR ANSPRÜCHE, SCHÄDEN ODER SONSTIGE HAFTUNG, OB AUS VERTRAGLICHEM, SCHLECHTER ODER ANDERWEITIGEM, DIE SICH AUS, AUS ODER IN VERBINDUNG MIT DER SOFTWARE ODER DER NUTZUNG ODER ANDEREN HANDELN IN DER SOFTWARE. Basierend auf einem Originalprojekt für die MAX72xx LED-Matrix und FFT-Lib von Shajeeb. Abschnitt mit den Konfigurationseinstellungen basierend auf der Arbeit von Ragnar Ranøyen Homb von Norvegian Creation.*/#define LIN_OUT 1 //FHT lineare Ausgangsgröße#define FHT_N 128 //set SAMPLES for FHT, Muss eine Potenz von 2 sein#include  #define xres 32 //Gesamtanzahl der Spalten im Display, muss <=SAMPLES/2#define yres 8 //Gesamtanzahl der Zeilen im Display#define ledPIN 6 //out pint to control Leds#define NUM_LEDS (xres * Jahre) // Gesamt-LEDs in Matrix#include #define colorPIN 5 //Pin zum Ändern der LED-Farbe#Define BrightnessPIN 10 //Pin zum Ändern der Helligkeitbyte displaycolor =0; // Standardfarbwertbyte Helligkeit =1; //Standardhelligkeitsstufe#include #define CONFIG_START 32 //Speicherstartposition#define CONFIG_VERSION "VER01" //Konfigurationsversion configurationtypedef struct { char version[6]; Byte-Anzeigefarbe; Byte-Helligkeit;} Konfigurationstyp;Konfigurationstyp CONFIGURATION ={ CONFIG_VERSION, Displayfarbe, Helligkeit};Byte yvalue;int peaks[xres];Byte state =HIGH; // der aktuelle Messwert vom Eingang Pinbyte previousState =LOW; // der vorherige Messwert vom Eingang Pinunsigned long lastDebounceTime =0; // das letzte Mal, als der Ausgangspin toggledunsigned war long debounceDelay =100; // die Entprellzeit; erhöhen, wenn die Ausgabe flickersbyte data_avgs[xres]; //Array für Abtastung// Parameter 1 =Anzahl der LEDs in der Matrix// Parameter 2 =Pin-Nummer// Parameter 3 =Pixeltyp-Flags, addieren Sie nach Bedarf:// NEO_KHZ800 800 KHz Bitstream (die meisten NeoPixel Produkte mit WS2812 LEDs )// NEO_KHZ400 400 KHz (klassisch 'v1' (nicht v2) FLORA Pixel, WS2811 Treiber)// NEO_GRB Pixel sind für GRB Bitstream verdrahtet (die meisten NeoPixel Produkte)// NEO_RGB Pixel sind verdrahtet für RGB Bitstream (v1 FLORA Pixel, nicht 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; // auf false setzen, um eq zu deaktivieren // 5 Farbsätze für LEDs definieren, 0 für einzelne benutzerdefinierte Colorbyte-Farben [][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}}; // Zeichen für Anzeigeeinstellungen definierenbyte 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, 0x04, 0x 0x02, 0x12, 0x0C, 0x1E, 0x10, 0x10, 0x1E, 0x12, 0x1E, 0x1E, 0x02, 0x04, 0x08, 0x08, 0x08, 0x0C, 0x12, 0x0C, 0x12, 0x12, 0x0 0x, 0x1x, 0x12, 0x1C};void setup () { pixel.begin (); // Led-Matrix initialisieren // FFT-Operationen beginnen ADCSRA =0b11100101; // ADC in den Freilaufmodus setzen und Prescaler auf 32 (0xe5) setzen ADMUX =0b00000000; // Pin A0 und externe Spannungsreferenz verwenden // Konfigurationsdaten aus dem EEPROM lesen if (loadConfig()) {displaycolor =CONFIGURATION.displaycolor; Helligkeit =KONFIGURATION.Helligkeit; } //Helligkeit einstellen, die vom EEPROM geladen wird pixel.setBrightness (Helligkeit * 24 + 8); // Aktuelle Konfiguration beim Start anzeigen // true in false ändern, wenn dies nicht erwünscht ist showSettings(3, true);}void loop() { while (1) { // reduziert Jitter Sampling(); // FHT-Bibliothek verwendet nur ein Daten-Array RearrangeFHT(); // FHT-Ergebnis neu anordnen, damit es mit Nr. übereinstimmt. der Anzeigespalten SendToDisplay(); // senden zur Anzeige nach Messwert colorChange (); // Überprüfen Sie, ob die Taste gedrückt wurde, um die Farbhelligkeit zu ändernChange (); // Überprüfen Sie, ob die Taste gedrückt wurde, um die Helligkeitsverzögerung zu ändern (10); // Verzögerung um Flackern zu reduzieren (FHT ist zu schnell :D) }}void Sampling() { for (int i =0; i  peaks[i]) peaks[i] =yvalue; // Peak speichern if> previuos Peak yvalue =Peaks[i]; // Peak auswählen, um setColumn(i, yvalue) anzuzeigen; // Spalten zeichnen } pixel.show(); // Spalte anzeigen} // LEDs der x-Spalte gemäß y-Wert aufleuchtenvoid setColumn (Byte x, Byte y) { int led, i; für (i =0; i  i) { switch (displaycolor) { case 4:if (colors[displaycolor][i] ==0) { // benutzerdefinierte Farbe mit Nullwert anzeigen im Array pixel.setPixelColor (led, 255, 255, 255); //withe} else {// Standardfarbe im Farbarray definiert pixel.setPixelColor(led, Wheel(colors[displaycolor][i])); } brechen; Fall 5:// Farbe nach Spalte ändern pixel.setPixelColor (led, Wheel (x * 16)); brechen; Fall 6:// Farbe pro Zeile ändern pixel.setPixelColor (led, Wheel (i * y * 3)); brechen; Fall 7://Farbe ändern nach... country :D //Italien flagh //if (x <11) pixel.setPixelColor(led, 0, 255, 0); // wenn (x> 10 &&x <21) pixel.setPixelColor (led, 255, 255, 255); // wenn (x> 20) pixel.setPixelColor (led, 255, 0, 0); // Sterne und Streifen if (i  debounceDelay) { displaycolor++; if (displaycolor> 7) displaycolor =0; showSettings(1, wahr); // auf false setzen, wenn dies nicht gewünscht wird saveConfig(); lastDebounceTime =millis(); } previousState =Lesen;}void BrightnessChange () { Int Reading =digitalRead (brightnessPIN); if (lesen ==HIGH &&previousState ==LOW &&millis() - lastDebounceTime> debounceDelay) { Helligkeit ++; if (Helligkeit> 7) Helligkeit =0; pixel.setHelligkeit (Helligkeit * 24 + 8); showSettings(2, wahr); // auf false setzen, wenn dies nicht gewünscht wird saveConfig(); lastDebounceTime =millis(); } previousState =Reading;}// Dienstprogramm von Adafruit Neopixel-Demoskizze // Geben Sie einen Wert von 0 bis 255 ein, um einen Farbwert zu erhalten. // Die Farben sind ein Übergang R - G - B - zurück zu 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; Rückgabe Pixel.Color(0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -=170; return pixel.Color(WheelPos * 3, 255 - WheelPos * 3, 0);} // Lade was im EEPROM in die lokale KONFIGURATION ist wenn es eine gültige Einstellung istint 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]) { // Laden (Überschreiben) der lokalen Konfigurationsstruktur für (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(); } } }} //von Janux®, letzte Version am 28.06.2020.

Schaltpläne


Herstellungsprozess

  1. 32 (Linier) / 11 (Pseudolog)-Band-Audiospektrumanalysator
  2. Pflanzenalarm bei Durstalarm
  3. italienische Wordclock
  4. Sigfox-kWh-Zähler
  5. Bluetooth-Temperaturüberwachung
  6. Gestengesteuerte Sperre
  7. Der Companion-IC
  8. USB-MIDI-Adapter
  9. Ein isolierter Analogeingang für Arduino
  10. Messen Sie Ihre Reaktionszeit