[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: