| /* Show levels (RMS & Peak) for 8 I2S microphone inputs | |||||
| * | |||||
| * Connect 8 INMP411 I2S microphones to Teensy 4.0 | |||||
| * Pin 8 SD on mics #1 and #2 | |||||
| * Pin 6 SD on mics #3 and #4 | |||||
| * Pin 9 SD on mics #5 and #6 | |||||
| * Pin 32 SD on mics #7 and #8 | |||||
| * Pin 20 WS on all mics | |||||
| * Pin 21 SCK on all mics | |||||
| * | |||||
| * Each mic needs GND to Teensy GND, VCC to Teensy 3.3V. | |||||
| * Connect L/R to GND on the odd numbered mics | |||||
| * and L/R to 3.3V on the even numbered mics. | |||||
| * | |||||
| * Optional - connect a Teensy Audio Shield or other I2S | |||||
| * output device, but do not connect it to pin 8, because | |||||
| * the INMP411 mics #1 & #2 send their signal to pin 8. | |||||
| * | |||||
| * This example code is in the public domain | |||||
| */ | |||||
| #include <Audio.h> | |||||
| #include <Wire.h> | |||||
| #include <SPI.h> | |||||
| #include <SD.h> | |||||
| #include <SerialFlash.h> | |||||
| // If INMP411 mics are not available, the audio shield mic can | |||||
| // be used, but it will send a single signal to inputs #1 & #2 | |||||
| // (if connected to pin 8). | |||||
| //const int myInput = AUDIO_INPUT_LINEIN; | |||||
| const int myInput = AUDIO_INPUT_MIC; | |||||
| AudioInputI2SOct audioInput; // audio shield: mic or line-in | |||||
| AudioAmplifier amp1; | |||||
| AudioAmplifier amp2; | |||||
| AudioAmplifier amp3; | |||||
| AudioAmplifier amp4; | |||||
| AudioAmplifier amp5; | |||||
| AudioAmplifier amp6; | |||||
| AudioAmplifier amp7; | |||||
| AudioAmplifier amp8; | |||||
| AudioAnalyzeRMS rms1; | |||||
| AudioAnalyzeRMS rms2; | |||||
| AudioAnalyzeRMS rms3; | |||||
| AudioAnalyzeRMS rms4; | |||||
| AudioAnalyzeRMS rms5; | |||||
| AudioAnalyzeRMS rms6; | |||||
| AudioAnalyzeRMS rms7; | |||||
| AudioAnalyzeRMS rms8; | |||||
| AudioAnalyzePeak peak1; | |||||
| AudioAnalyzePeak peak2; | |||||
| AudioAnalyzePeak peak3; | |||||
| AudioAnalyzePeak peak4; | |||||
| AudioAnalyzePeak peak5; | |||||
| AudioAnalyzePeak peak6; | |||||
| AudioAnalyzePeak peak7; | |||||
| AudioAnalyzePeak peak8; | |||||
| AudioOutputI2S audioOutput; // audio shield: headphones & line-out | |||||
| // Send all microphone signals to amps | |||||
| AudioConnection r1(audioInput, 0, amp1, 0); | |||||
| AudioConnection r2(audioInput, 1, amp2, 0); | |||||
| AudioConnection r3(audioInput, 2, amp3, 0); | |||||
| AudioConnection r4(audioInput, 3, amp4, 0); | |||||
| AudioConnection r5(audioInput, 4, amp5, 0); | |||||
| AudioConnection r6(audioInput, 5, amp6, 0); | |||||
| AudioConnection r7(audioInput, 6, amp7, 0); | |||||
| AudioConnection r8(audioInput, 7, amp8, 0); | |||||
| // Connect the amps to RMS and Peak analyzers | |||||
| AudioConnection a1(amp1, 0, rms1, 0); | |||||
| AudioConnection a2(amp2, 0, rms2, 0); | |||||
| AudioConnection a3(amp3, 0, rms3, 0); | |||||
| AudioConnection a4(amp4, 0, rms4, 0); | |||||
| AudioConnection a5(amp5, 0, rms5, 0); | |||||
| AudioConnection a6(amp6, 0, rms6, 0); | |||||
| AudioConnection a7(amp7, 0, rms7, 0); | |||||
| AudioConnection a8(amp8, 0, rms8, 0); | |||||
| AudioConnection p1(amp1, 0, peak1, 0); | |||||
| AudioConnection p2(amp2, 0, peak2, 0); | |||||
| AudioConnection p3(amp3, 0, peak3, 0); | |||||
| AudioConnection p4(amp4, 0, peak4, 0); | |||||
| AudioConnection p5(amp5, 0, peak5, 0); | |||||
| AudioConnection p6(amp6, 0, peak6, 0); | |||||
| AudioConnection p7(amp7, 0, peak7, 0); | |||||
| AudioConnection p8(amp8, 0, peak8, 0); | |||||
| // Also connect 2 of the amps to an I2S output (Pin 8) | |||||
| // to be able to listen to the sound. | |||||
| AudioConnection c10(amp1, 0, audioOutput, 0); | |||||
| AudioConnection c11(amp2, 0, audioOutput, 1); | |||||
| AudioControlSGTL5000 audioShield; | |||||
| void setup() { | |||||
| AudioMemory(26); | |||||
| audioShield.enable(); | |||||
| audioShield.inputSelect(myInput); | |||||
| audioShield.micGain(12); | |||||
| audioShield.volume(0.5); | |||||
| const float microphoneAmplification = 72.0; | |||||
| amp1.gain(microphoneAmplification); | |||||
| amp2.gain(microphoneAmplification); | |||||
| amp3.gain(microphoneAmplification); | |||||
| amp4.gain(microphoneAmplification); | |||||
| amp5.gain(microphoneAmplification); | |||||
| amp6.gain(microphoneAmplification); | |||||
| amp7.gain(microphoneAmplification); | |||||
| amp8.gain(microphoneAmplification); | |||||
| Serial.begin(9600); | |||||
| } | |||||
| elapsedMillis fps; | |||||
| void loop() { | |||||
| if (fps > 24) { | |||||
| fps = 0; | |||||
| const int digits = 8; | |||||
| print_bar(1, rms1.read(), peak1.readPeakToPeak()/2, digits); | |||||
| print_bar(2, rms2.read(), peak2.readPeakToPeak()/2, digits); | |||||
| print_bar(3, rms3.read(), peak3.readPeakToPeak()/2, digits); | |||||
| print_bar(4, rms4.read(), peak4.readPeakToPeak()/2, digits); | |||||
| print_bar(5, rms5.read(), peak5.readPeakToPeak()/2, digits); | |||||
| print_bar(6, rms6.read(), peak6.readPeakToPeak()/2, digits); | |||||
| print_bar(7, rms7.read(), peak7.readPeakToPeak()/2, digits); | |||||
| print_bar(8, rms8.read(), peak8.readPeakToPeak()/2, digits); | |||||
| Serial.println(); | |||||
| } | |||||
| } | |||||
| void print_bar(int in, float rms, float peak, int digits) { | |||||
| Serial.print(in); | |||||
| Serial.print(":"); | |||||
| int num_rms = roundf(rms * digits); | |||||
| int num_peak = roundf(peak * digits); | |||||
| for (int i=0; i < digits; i++) { | |||||
| if (i < num_rms) { | |||||
| Serial.print("*"); | |||||
| } else if (i < num_peak) { | |||||
| Serial.print(">"); | |||||
| } else { | |||||
| Serial.print(" "); | |||||
| } | |||||
| } | |||||
| Serial.print(" "); | |||||
| } |