Stap 2: Vastleggen geluidsgolven
Ik zal een electret microfoon zonder eventuele versterking gebruikte zaken eenvoudig te houden. En 1K Ohm weerstand tussen 3.3V en de positieve kant van de electret microfoon is geplaatst.
De Teensy heeft een 12 bit ADC, die gaf me genoeg ruimte om het mijn geluid vastleggen.
Om vast te leggen precies de lengte van één meter van de geluidsgolf, één zou moeten proeven voor 1 sec / 343 meter = 0.00291545189-sec of 2915 microseconden.
Met de Teensy ik erin geslaagd om ongeveer 112 monster binnen 2915 microseconden. Meer dan genoeg om te tonen op een meter. Ik ze opgeslagen in een array
unsigned int startCounting = micros() + 2915; unsigned int counter = 0; while(micros() < startCounting ) { soundSampleArray[counter] = analogRead(microphonePin); delayMicroseconds(15); // Needed for the ADC to settle counter++; }
Want ik ben niet met behulp van een versterking van het verschil tussen mijn min en max lezing is niet zo veel. Om maximaal gebruik te maken van de hoge weergave van 16 pixel, heb ik kalibreren mijn gegevens.
void readSoundWaveSample () { Serial.println("start reading"); int maxR = 0; int minR = 4096; long totalCal = 0; int calRead; unsigned int startCounting = micros() + 2915; unsigned int counter = 0; while(micros() < startCounting ){ calRead = analogRead(MICROPHONE_PIN); soundSampleArray[counter] = calRead; if (calRead > maxR) { maxR = calRead; } if (calRead < minR) { minR = calRead; } totalCal = totalCal + calRead; counter++; delayMicroseconds(15); } calDif = ((maxR - minR)/2); calMid = totalCal/counter; Serial.println("done reading"); amountOfSamples = counter; }
Ik gebruik calMid en calDif om mijn gegevens in kaart.
CalMid is het midden van mijn Golf. CalMid min calDif is dat de onderkant van de Golf, calMid plus calDif is de top van de Golf.
Ik gebruik amountOfSamples later mijn gegevens toewijzen aan de hoeveelheid stappen die ik heb per meter. In mijn geval die was het toevallig 340 stappen, met mijn 12 Klik op roterende encoder.