| @@ -0,0 +1,149 @@ | |||
| /* 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(" "); | |||
| } | |||