|
|
|
|
|
|
|
|
|
|
|
/* 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(" "); |
|
|
|
|
|
} |