MAX4466 with ability to take instananeous level of mic

Dependents:   4180_Tuner

Committer:
collinrusch
Date:
Sun Apr 28 20:45:26 2019 +0000
Revision:
2:0090c008b13e
Parent:
0:712373b300a2
Added ability to take instantaneous level of microphone at single point in time for speed intensive applications

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mgolino 0:712373b300a2 1 #include "mbed.h"
mgolino 0:712373b300a2 2 #include "MAX4466.h"
mgolino 0:712373b300a2 3
mgolino 0:712373b300a2 4 MAX4466::MAX4466(PinName pin): _pin(pin), _led1(LED1), _led2(LED2), _led3(LED3), _led4(LED4) {
mgolino 0:712373b300a2 5 calibration();
mgolino 0:712373b300a2 6 }
mgolino 0:712373b300a2 7
mgolino 0:712373b300a2 8 //CALIBRATION FUNCTION:
mgolino 0:712373b300a2 9 //Find average sound level at the intialization of the microphone
mgolino 0:712373b300a2 10 //Use this in the calculation of the LED indication array values
mgolino 0:712373b300a2 11 float MAX4466::calibration() {
mgolino 0:712373b300a2 12
mgolino 0:712373b300a2 13 _t.start();
mgolino 0:712373b300a2 14 _t1.start();
mgolino 0:712373b300a2 15 float peakToPeak=0, signalMax=0, signalMin=1024;
mgolino 0:712373b300a2 16
mgolino 0:712373b300a2 17 while (_t1.read()<1) {
mgolino 0:712373b300a2 18 while (_t.read_ms()<50) {
mgolino 0:712373b300a2 19 _sample=_pin.read();
mgolino 0:712373b300a2 20
mgolino 0:712373b300a2 21 if (_sample<1024) {
mgolino 0:712373b300a2 22 if (_sample>signalMax)
mgolino 0:712373b300a2 23 signalMax=_sample;
mgolino 0:712373b300a2 24
mgolino 0:712373b300a2 25 else if (_sample<signalMin)
mgolino 0:712373b300a2 26 signalMin=_sample;
mgolino 0:712373b300a2 27 }
mgolino 0:712373b300a2 28 }
mgolino 0:712373b300a2 29 _t.reset();
mgolino 0:712373b300a2 30 peakToPeak=signalMax-signalMin;
mgolino 0:712373b300a2 31 _value= (peakToPeak*3.3);
mgolino 0:712373b300a2 32 _value = floor(_value * 100) / 100;
mgolino 0:712373b300a2 33 _sum+=_value;
mgolino 0:712373b300a2 34 _count++;
mgolino 0:712373b300a2 35 }
mgolino 0:712373b300a2 36 _average=_sum/_count;
mgolino 0:712373b300a2 37 _t1.reset();
mgolino 0:712373b300a2 38
mgolino 0:712373b300a2 39 return _average;
mgolino 0:712373b300a2 40 }
mgolino 0:712373b300a2 41
mgolino 0:712373b300a2 42 //LED ARRAY FUNCTION:
mgolino 0:712373b300a2 43 //Setup array of 4 LEDs based on the current value read by the microphone
mgolino 0:712373b300a2 44 //And the average value found during calibration
mgolino 0:712373b300a2 45 void MAX4466::led_array(float x ) {
mgolino 0:712373b300a2 46
mgolino 0:712373b300a2 47 if (_value<x+0.05) {
mgolino 0:712373b300a2 48 _led1=0;
mgolino 0:712373b300a2 49 _led2=0;
mgolino 0:712373b300a2 50 _led3=0;
mgolino 0:712373b300a2 51 _led4=0;
mgolino 0:712373b300a2 52 }
mgolino 0:712373b300a2 53 if (_value>x+0.05&&_value<0.5+x) {
mgolino 0:712373b300a2 54 _led1=1;
mgolino 0:712373b300a2 55 _led2=0;
mgolino 0:712373b300a2 56 _led3=0;
mgolino 0:712373b300a2 57 _led4=0;
mgolino 0:712373b300a2 58 }
mgolino 0:712373b300a2 59 if (_value>0.5+x&&_value<1+x) {
mgolino 0:712373b300a2 60 _led1=1;
mgolino 0:712373b300a2 61 _led2=1;
mgolino 0:712373b300a2 62 _led3=0;
mgolino 0:712373b300a2 63 _led4=0;
mgolino 0:712373b300a2 64 }
mgolino 0:712373b300a2 65 if (_value>1+x&&_value<1.2+x) {
mgolino 0:712373b300a2 66 _led1=1;
mgolino 0:712373b300a2 67 _led2=1;
mgolino 0:712373b300a2 68 _led3=1;
mgolino 0:712373b300a2 69 _led4=0;
mgolino 0:712373b300a2 70 }
mgolino 0:712373b300a2 71 if (_value>1.2+x&&_value<2.8+x) {
mgolino 0:712373b300a2 72 _led1=1;
mgolino 0:712373b300a2 73 _led2=1;
mgolino 0:712373b300a2 74 _led3=1;
mgolino 0:712373b300a2 75 _led4=1;
mgolino 0:712373b300a2 76 }
mgolino 0:712373b300a2 77 }
mgolino 0:712373b300a2 78
mgolino 0:712373b300a2 79 //SOUND LEVEL FUNCTIOM:
mgolino 0:712373b300a2 80 //Read in current sound level
mgolino 0:712373b300a2 81 float MAX4466::sound_level() {
mgolino 0:712373b300a2 82
mgolino 0:712373b300a2 83 _t.start();
mgolino 0:712373b300a2 84 float peakToPeak=0, signalMax=0, signalMin=1024;
mgolino 0:712373b300a2 85
mgolino 0:712373b300a2 86 while (_t.read_ms()<50) {
mgolino 0:712373b300a2 87 _sample=_pin.read();
mgolino 0:712373b300a2 88
mgolino 0:712373b300a2 89 if (_sample<1024) {
mgolino 0:712373b300a2 90 if (_sample>signalMax)
mgolino 0:712373b300a2 91 signalMax=_sample;
mgolino 0:712373b300a2 92
mgolino 0:712373b300a2 93 else if (_sample<signalMin)
mgolino 0:712373b300a2 94 signalMin=_sample;
mgolino 0:712373b300a2 95 }
mgolino 0:712373b300a2 96 }
mgolino 0:712373b300a2 97 _t.reset();
mgolino 0:712373b300a2 98 peakToPeak=signalMax-signalMin;
mgolino 0:712373b300a2 99 _value= (peakToPeak*3.3);
mgolino 0:712373b300a2 100 _value = floor(_value * 100) / 100;
mgolino 0:712373b300a2 101 _sum+=_value;
mgolino 0:712373b300a2 102 _count++;
mgolino 0:712373b300a2 103
mgolino 0:712373b300a2 104 return _value;
mgolino 0:712373b300a2 105 }
mgolino 0:712373b300a2 106
collinrusch 2:0090c008b13e 107 float MAX4466::instantlevel(){
collinrusch 2:0090c008b13e 108 return _pin.read();
collinrusch 2:0090c008b13e 109 }
collinrusch 2:0090c008b13e 110
mgolino 0:712373b300a2 111 //VOLUME INDICATOR FUNCTION:
mgolino 0:712373b300a2 112 //To be called in main function
mgolino 0:712373b300a2 113 void MAX4466::volume_indicator() {
mgolino 0:712373b300a2 114 led_array(_average);
mgolino 0:712373b300a2 115 sound_level();
mgolino 0:712373b300a2 116 }