LinkedIn YouTube Facebook
Szukaj

Wstecz
SoM / SBC

[PROJEKT] Analizator dźwięku – DFRobot Gravity Audio Analyzer i KAmduino UNO

Po połączeniu wszystkich elementów projektu można przejść do omówienia oprogramowania na platformę Arduino (pełny kod znajduje się poniżej, w sekcji Do pobrania).

Na początku należy dodać biblioteki sterujące modułami. Dla Analizatora audio użyłem biblioteki dostępnej na stronie DFRobot, a dla wyświetlacza OLED – biblioteki firmy Adafruit oraz biblioteki Adafruit GFX. Dodawanie bibliotek do środowiska odbywa się w standardowy sposób: Szkic > Dołącz bibliotekę > Dodaj bibliotekę .ZIP.

Na początku należy dołączyć biblioteki konieczne w dalszej części programu. W tym przypadku, oprócz wyżej wymienionych jest to biblioteka Wire, konieczna do obsługi magistrali I2C.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH1106.h>
#include <AudioAnalyzer.h>

Następnie należy zainicjować obiekty odpowiedzialne za obsługę peryferiów oraz tabelę, w której będą przechowywane aktualne wartości szczytowe sygnału w pasmach częstotliwości.

#define OLED_RESET 0
Analyzer Audio = Analyzer(4,5,0);
Adafruit_SH1106 display(OLED_RESET);

int FreqVal[7]; 

W funkcji setup następuje początkowa konfiguracja peryferiów. Wyświetlacz konfigurowany jest do sterowania za pomocą magistrali I2C

void setup() {
  display.begin(SH1106_SWITCHCAPVCC, 0x3C); 
  Audio.Init();
}

W pętli głównej programu odczytywane są wartości z analizatora audio. Następnie generowane są prostokąty o stałej szerokości, a wysokości zależnej od mocy sygnału w danym paśmie. Maksymalna wysokość prostokąta wynosi 64 piksele, a wartość mocy w paśmie wysyłana jest jako sygnał analogowy. Na platformie Arduino zawiera się więc w przedziale 0…1023. Aby wyskalować tą wartość wystarczy podzielić ją przez 16. Wygenerowana grafika następnie jest wyświetlana na ekranie OLED.

void loop() {
  Audio.ReadFreq (FreqVal); //odczyt wartości z analizatora
  display.clearDisplay();
  display.fillRect(1, floor (64-FreqVal[0]/16), 18, ceil (FreqVal[0]/16), 1);
  display.fillRect(19, floor (64-FreqVal[1]/16), 18, ceil (FreqVal[1]/16), 1);
  display.fillRect(37, floor (64-FreqVal[2]/16), 18, ceil (FreqVal[2]/16), 1);
  display.fillRect(55, floor(64-FreqVal[3]/16), 18, ceil(FreqVal[3]/16), 1);
  display.fillRect(73, floor(64-FreqVal[4]/16), 18, ceil (FreqVal[4]/16), 1);
  display.fillRect(91, floor (64-FreqVal[5]/16), 18, ceil (FreqVal[5]/16), 1);
  display.fillRect(109, floor (64-FreqVal[6]/16), 18, ceil (FreqVal[6]/16), 1);
  display.display(); //wyświetlenie prostokątów na ekranie
  delay(10);
}

Działanie projektu zaprezentowano na poniższym materiale wideo: