I have a mono jack audio act as analog input for arduino UNO. The microphone outputs voltage that varies in terms of amplitude
(volume) and frequency
. In order to get the high sampling rate, I use prescaler 16 and set high baudrate for serial communication to print the value. I save the analog read from that jack audio to buffer
array with maximum value is 256 (8-bit). This is my code (I modify from the Nick Gammon's blog about ADC here) :
const byte adcPin = 0; // A0
const int MAX_RESULTS = 256;
volatile int results [MAX_RESULTS];
volatile int resultNumber;
void setup ()
{
Serial.begin (230400);
Serial.println ();
// reset Timer 1
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
TCCR1B = bit (CS11) | bit (WGM12); // CTC, prescaler of 8
TIMSK1 = bit (OCIE1B);
OCR1A = 39;
OCR1B = 39; // 20 uS - sampling frequency 50 kHz
ADCSRA = bit (ADEN) | bit (ADIE) | bit (ADIF); // turn ADC on, want interrupt on completion
ADCSRA |= bit (ADPS2); // Prescaler of 16
// ADCSRA |= (1 << ADPS1) | (1 << ADPS0); // 8 prescaler for 153.8 KHz
ADMUX = bit (REFS0) | (adcPin & 7);
ADCSRB = bit (ADTS0) | bit (ADTS2); // Timer/Counter1 Compare Match B
ADCSRA |= bit (ADATE); // turn on automatic triggering
}
// ADC complete ISR
ISR (ADC_vect)
{
results[resultNumber++] = ADC;
if(resultNumber == MAX_RESULTS)
{
ADCSRA = 0; // turn off ADC
}
}
EMPTY_INTERRUPT (TIMER1_COMPB_vect);
void loop () {
while (resultNumber < MAX_RESULTS)
{ }
for (int i = 0; i < MAX_RESULTS; i++)
{
Serial.println (results [i]);
}
}
With that code, I got a nice result of sinusoidal graph represented audio value up to 4000 Hz like this :
But one thing that didn't work is if I change the volume or frequency (while displaying data) of analog input (jack audio), the graph I print and display via serial plot audio won't change. So I had to close it and open again to see the change. The question is how can I achieve the continuous and real time reading of this ? Thank you very much.