32-полосный Arduino аудио-спектральный анализатор — линейный и псевдологарфмический дисплей
Компоненты и материалы
| Arduino Nano R3 | ×1 |
| Резистор 10 кОм | ×1 |
| Резистор 100 кОм | ×2 |
| Резистор 4.75 кОм | ×3 |
| Перемычки (набор) | ×1 |
| Бредборд | ×1 |
| USB-A — Mini-USB кабель | ×1 |
| Тактильная кнопка (верхнее нажатие) | ×1 |
| Pin header 36-позиций, 1 ряд (0.1") | ×1 |
Инструменты
- Паяльная станция
Программное обеспечение
- Arduino IDE
О проекте
Это мой первый проект в области Arduino-аудиоэлектроники. Вдохновлённый аудиовизализатором Shajeeb, я расширил дисплей до 32-полосного линейного режима и 11-полосного псевдологарфмического режима. Я построил кастомные таблицы логарифмического отображения в Excel и интегрировал их в прошивку для более точной частотной характеристики.
Тактильная кнопка переключает между двумя режимами отображения, позволяя быстро менять их во время исполнения или экспериментов.
Не стесняйтесь модифицировать прошивку или железо под свои творческие проекты.
Исходный код
- 32_Band_LED_Spectrum_Analyzer-009.ino
32_Band_LED_Spectrum_Analyzer-009.ino (Arduino)
// 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;
}
Схемы
Производственный процесс
- Умный датчик полива «Thirst Alert» на Arduino — DIY сигнализация засухи для растений
- Итальянские словесные часы на Arduino Nano, NeoPixel, LCD и RTC
- Экономия пинов Arduino: подключение 4×3 клавиатуры по трём аналоговым входам
- Надежный счетчик кВт·ч на Sigfox с Arduino MKR Fox 1200
- Bluetooth-монитор температуры на Arduino Nano с NTC-термистором
- DIY Автоматический измеритель емкости (10 пФ – 10 мкФ) на Arduino Nano
- Бесконтактный жестовый замок: APDS-9960 + Arduino для безопасного доступа
- Набор-компаньон для Arduino Nano — необходимые компоненты и инструменты для DIY-электроники
- Гальванически разделённый аналоговый вход для Arduino на LM331 и оптопаре 4N25
- Точный тест времени реакции на Arduino UNO