32-Band Arduino Audio-Spektrumanalysator – Linear & Pseudo-Log Darstellung
Komponenten & Zubehör
| Arduino Nano R3 | × | 1 |
| Widerstand 10 kΩ | × | 1 |
| Widerstand 100 kΩ | × | 2 |
| Widerstand 4,75 kΩ | × | 3 |
| Jumper-Kabel (generisch) | × | 1 |
| Steckbrett (generisch) | × | 1 |
| USB-A auf Mini-USB Kabel | × | 1 |
| Taktile Schalter (Top-Aktuiert) | × | 1 |
| Male Header 36-polig 1-Reihe (0,1") | × | 1 |
Werkzeuge & Maschinen
- Lötkolben (generisch)
Software & Online-Dienste
- Arduino IDE
Über dieses Projekt
Dieses Projekt markiert meinen ersten Ausflug in Arduino-basierte Audio-Elektronik. Inspiriert von Shajeebs Audio-Visualisierer erweiterte ich die Anzeige um einen 32-Band-Linear-Modus und einen 11-Band-Pseudo-Log-Modus. Ich erstellte benutzerdefinierte logarithmische Mapping-Tabellen in Excel und integrierte sie in die Firmware für eine präzisere Frequenzantwort.
Ein taktiler Button schaltet zwischen den beiden Anzeigemodi um, was schnelles Umschalten während Performance oder Experimenten ermöglicht.
Fühlen Sie sich frei, Firmware oder Hardware an Ihre eigenen kreativen Projekte anzupassen.
Quellcode
- 32_Band_LED_Spectrum_Analyzer-009.ino
32_Band_LED_Spectrum_Analyzer-009.ino
// Modified code by Christian Suryanto, based on (c) 2019 Shajeeb TM
// HAZI TECH
// Updated by Christian Suryanto
#include <arduinoFFT.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
#include <EEPROM.h>
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define CLK_PIN 13
#define DATA_PIN 11
#define CS_PIN 10
#define SAMPLES 64
#define MAX_DEVICES 4
#define xres 32
#define yres 8
#define PREV 0xFF02FD
#define NEXT 0xFFC23D
#define PWR 0xFFA25D
int audio_response = 35;
double vReal[SAMPLES];
double vImag[SAMPLES];
char data_avgs[xres];
int yvalue;
int displaycolumn, displayvalue;
int peaks[xres];
const int buttonPin = 6;
int state = HIGH;
int previousState = LOW;
int displaymode;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
int MY_ARRAY[]={0, 128, 192, 224, 240, 248, 252, 254, 255};
bool EQ_ON = true;
byte eq1[32] = {40, 45, 50, 60, 65, 70, 75, 95, 110, 110, 110, 110, 110, 110, 110, 110, 130, 130, 130, 130, 130, 130, 130, 130, 145, 155, 170, 180, 215, 220, 245, 255};
byte eq2[11] = {40, 70, 75, 110, 110, 140, 145, 220, 220, 230, 250};
MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
arduinoFFT FFT = arduinoFFT();
void setup() {
EEPROM.update(1,1);
displaymode = EEPROM.read(1);
ADCSRA = 0b11100101;
ADMUX = 0b00000000;
pinMode(buttonPin, INPUT);
mx.begin();
mx.control(MD_MAX72XX::INTENSITY, 0);
delay(50);
}
void loop() {
int numData;
double rSum;
for(int i=0; i peaks[i]) peaks[i] = yvalue;
yvalue = peaks[i];
displayvalue = MY_ARRAY[yvalue];
if (displaymode==1) {
displaycolumn = 31-i;
mx.setColumn(displaycolumn, displayvalue);
} else {
displaycolumn = 31-(3*i);
mx.setColumn(displaycolumn-1, displayvalue);
mx.setColumn(displaycolumn, displayvalue);
}
}
displayModeChange();
}
void displayModeChange() {
int reading = digitalRead(buttonPin);
if (reading == HIGH && previousState == LOW && millis() - lastDebounceTime > debounceDelay) {
if (displaymode==1) {
displaymode = 2;
mx.clear();
delay(200);
EEPROM.update(1,2);
} else {
displaymode = 1;
mx.clear();
delay(200);
EEPROM.update(1,1);
}
lastDebounceTime = millis();
}
previousState = reading;
}
Schaltpläne
Herstellungsprozess
- Smart Thirst Alert: DIY Pflanzen-Alarm für optimale Bewässerung
- Italienische Word Clock mit Arduino Nano, NeoPixel, LCD & RTC
- Arduino-Pins sparen: 4x3 Tastenfeld mit nur 3 Anschlüssen verbinden
- Zuverlässiger Sigfox-kWh-Zähler mit Arduino MKR Fox 1200
- Bluetooth-Temperaturmonitor mit Arduino Nano
- DIY Auto-Ranging Kapazitätsmesser (10 pF – 10 µF) – Einfacher Arduino-Nano-Bau
- Berührungsloses Gesten-Schloss: Sicherer Zugang mit APDS-9960 & Arduino
- Arduino Nano Begleiter-Set – Essentielle Bauteile & Werkzeuge für DIY-Elektronik
- Isolierter Analogeingang für Arduino: Spannung/Strom galvanisch trennen
- Präziser Reaktionszeit-Test mit Arduino UNO