SoundWave skrivare (2 / 5 steg)
Steg 2: Fånga ljudvågor
En Elektret mikrofon utan någon förstärkning kommer jag brukade hålla det enkelt. Och 1K ohms motstånd placeras mellan 3.3V och den positiva sidan av electret mikrofon.
Teensy har en 12 bitars ADC, vilket gav mig tillräckligt med utrymme för att fånga mitt ljud.
För att fånga exakta längden på en meter i ljudvågen, skulle man behöva prova för 1 SEK / 343 meter = 0.00291545189 SEK eller 2915 mikrosekunder.
Jag lyckades med Teensy har cirka 112 prov inom 2915 mikrosekunder. Mer än nog för att visa på en meter. Jag lagrat dem i en matris
unsigned int startCounting = micros() + 2915;
unsigned int counter = 0;
While(Micros() < startCounting) {
soundSampleArray [counter] = analogRead(microphonePin);
delayMicroseconds(15); Behövs för att ADC sedimentera
räknaren ++;
}
Eftersom jag inte använder någon förstärkning skillnaden mellan min min och max behandlingen är inte så mycket. Maximally använda 16 pixlar hög, har jag att kalibrera min data.
void readSoundWaveSample () {
Serial.println ("börja läsa");
int maxR = 0;
int minR = 4096;
lång totalCal = 0;
int calRead;
unsigned int startCounting = micros() + 2915;
unsigned int counter = 0;
While(Micros() < startCounting) {
calRead = analogRead(MICROPHONE_PIN);
soundSampleArray [counter] = calRead;
om (calRead > maxR) {
maxR = calRead;
}
om (calRead < minR) {
minR = calRead;
}
totalCal = totalCal + calRead;
räknaren ++;
delayMicroseconds(15);
}
calDif = ((maxR-minR)/2);
calMid = totalCal/counter;
Serial.println ("gjort behandlingen");
amountOfSamples = counter;
}
Jag använder calMid och calDif till min kartdata.
CalMid är mitt i min våg. CalMid minus calDif är botten av den våg, calMid plus calDif är toppen av vågen.
Jag kommer senare att använda amountOfSamples för att mappa min data till mängden steg jag har per meter. I mitt fall det råkade vara på 340 steg, med min 12 roterande kodare.