Program to control Electret Microphone Amplifier - MAX9814 from adafruit. Allows: To sample analogue voltage to transform into rough sound level. Transfer sound level to visual indicator, volume bar such as 4 LEDs on LPC11U24.

Dependencies:   MAX9814_Electret_Microphone_LED_Volume_Indicator mbed

Committer:
andcor02
Date:
Sun Nov 02 17:00:16 2014 +0000
Revision:
0:d096ca2ffef0
Child:
1:380e6ab41172
Made into class system, not into seperate h or c though.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andcor02 0:d096ca2ffef0 1 #include "mbed.h"
andcor02 0:d096ca2ffef0 2 //#include "Hammer_MicrophoneSensor.h"
andcor02 0:d096ca2ffef0 3 Serial pc (USBTX, USBRX);
andcor02 0:d096ca2ffef0 4
andcor02 0:d096ca2ffef0 5
andcor02 0:d096ca2ffef0 6
andcor02 0:d096ca2ffef0 7
andcor02 0:d096ca2ffef0 8 class MAX9814 {
andcor02 0:d096ca2ffef0 9
andcor02 0:d096ca2ffef0 10 public:
andcor02 0:d096ca2ffef0 11
andcor02 0:d096ca2ffef0 12 MAX9814(PinName pin): _pin(pin), _led1(LED1), _led2(LED2), _led3(LED3), _led4(LED4) {
andcor02 0:d096ca2ffef0 13 }
andcor02 0:d096ca2ffef0 14
andcor02 0:d096ca2ffef0 15
andcor02 0:d096ca2ffef0 16 void led_array(float x ) {
andcor02 0:d096ca2ffef0 17
andcor02 0:d096ca2ffef0 18 if (_value<x+0.05) {
andcor02 0:d096ca2ffef0 19 _led1=0;
andcor02 0:d096ca2ffef0 20 _led2=0;
andcor02 0:d096ca2ffef0 21 _led3=0;
andcor02 0:d096ca2ffef0 22 _led4=0;
andcor02 0:d096ca2ffef0 23 }
andcor02 0:d096ca2ffef0 24 if (_value>x+0.05&&_value<0.5+x) {
andcor02 0:d096ca2ffef0 25 _led1=1;
andcor02 0:d096ca2ffef0 26 _led2=0;
andcor02 0:d096ca2ffef0 27 _led3=0;
andcor02 0:d096ca2ffef0 28 _led4=0;
andcor02 0:d096ca2ffef0 29 }
andcor02 0:d096ca2ffef0 30 if (_value>0.5+x&&_value<1+x) {
andcor02 0:d096ca2ffef0 31 _led1=1;
andcor02 0:d096ca2ffef0 32 _led2=1;
andcor02 0:d096ca2ffef0 33 _led3=0;
andcor02 0:d096ca2ffef0 34 _led4=0;
andcor02 0:d096ca2ffef0 35 }
andcor02 0:d096ca2ffef0 36 if (_value>1+x&&_value<1.2+x) {
andcor02 0:d096ca2ffef0 37 _led1=1;
andcor02 0:d096ca2ffef0 38 _led2=1;
andcor02 0:d096ca2ffef0 39 _led3=1;
andcor02 0:d096ca2ffef0 40 _led4=0;
andcor02 0:d096ca2ffef0 41 }
andcor02 0:d096ca2ffef0 42 if (_value>1.2+x&&_value<2.8+x) {
andcor02 0:d096ca2ffef0 43 _led1=1;
andcor02 0:d096ca2ffef0 44 _led2=1;
andcor02 0:d096ca2ffef0 45 _led3=1;
andcor02 0:d096ca2ffef0 46 _led4=1;
andcor02 0:d096ca2ffef0 47 }
andcor02 0:d096ca2ffef0 48 }
andcor02 0:d096ca2ffef0 49
andcor02 0:d096ca2ffef0 50 float calibration() {
andcor02 0:d096ca2ffef0 51
andcor02 0:d096ca2ffef0 52 _t.start();
andcor02 0:d096ca2ffef0 53 _t1.start();
andcor02 0:d096ca2ffef0 54 float peakToPeak=0, signalMax=0, signalMin=1024;
andcor02 0:d096ca2ffef0 55
andcor02 0:d096ca2ffef0 56 while (_t1.read()<1) {
andcor02 0:d096ca2ffef0 57 while (_t.read_ms()<50) {
andcor02 0:d096ca2ffef0 58 _sample=_pin.read();
andcor02 0:d096ca2ffef0 59
andcor02 0:d096ca2ffef0 60 if (_sample<1024) {
andcor02 0:d096ca2ffef0 61 if (_sample>signalMax)
andcor02 0:d096ca2ffef0 62 signalMax=_sample;
andcor02 0:d096ca2ffef0 63
andcor02 0:d096ca2ffef0 64 else if (_sample<signalMin)
andcor02 0:d096ca2ffef0 65 signalMin=_sample;
andcor02 0:d096ca2ffef0 66 }
andcor02 0:d096ca2ffef0 67 }
andcor02 0:d096ca2ffef0 68 _t.reset();
andcor02 0:d096ca2ffef0 69 peakToPeak=signalMax-signalMin;
andcor02 0:d096ca2ffef0 70 _value= (peakToPeak*3.3);
andcor02 0:d096ca2ffef0 71 _value = floor(_value * 100) / 100;
andcor02 0:d096ca2ffef0 72 _sum+=_value;
andcor02 0:d096ca2ffef0 73 _count++;
andcor02 0:d096ca2ffef0 74 }
andcor02 0:d096ca2ffef0 75 _average=_sum/_count;
andcor02 0:d096ca2ffef0 76 _t1.reset();
andcor02 0:d096ca2ffef0 77
andcor02 0:d096ca2ffef0 78 return _average;
andcor02 0:d096ca2ffef0 79 }
andcor02 0:d096ca2ffef0 80
andcor02 0:d096ca2ffef0 81 float sound_level() {
andcor02 0:d096ca2ffef0 82
andcor02 0:d096ca2ffef0 83 _t.start();
andcor02 0:d096ca2ffef0 84 float peakToPeak=0, signalMax=0, signalMin=1024;
andcor02 0:d096ca2ffef0 85
andcor02 0:d096ca2ffef0 86 while (_t.read_ms()<50) {
andcor02 0:d096ca2ffef0 87 _sample=_pin.read();
andcor02 0:d096ca2ffef0 88
andcor02 0:d096ca2ffef0 89 if (_sample<1024) {
andcor02 0:d096ca2ffef0 90 if (_sample>signalMax)
andcor02 0:d096ca2ffef0 91 signalMax=_sample;
andcor02 0:d096ca2ffef0 92
andcor02 0:d096ca2ffef0 93 else if (_sample<signalMin)
andcor02 0:d096ca2ffef0 94 signalMin=_sample;
andcor02 0:d096ca2ffef0 95 }
andcor02 0:d096ca2ffef0 96 }
andcor02 0:d096ca2ffef0 97 _t.reset();
andcor02 0:d096ca2ffef0 98 peakToPeak=signalMax-signalMin;
andcor02 0:d096ca2ffef0 99 _value= (peakToPeak*3.3);
andcor02 0:d096ca2ffef0 100 _value = floor(_value * 100) / 100;
andcor02 0:d096ca2ffef0 101 _sum+=_value;
andcor02 0:d096ca2ffef0 102 _count++;
andcor02 0:d096ca2ffef0 103
andcor02 0:d096ca2ffef0 104 return _value;
andcor02 0:d096ca2ffef0 105 }
andcor02 0:d096ca2ffef0 106
andcor02 0:d096ca2ffef0 107
andcor02 0:d096ca2ffef0 108 void volume_indicator() {
andcor02 0:d096ca2ffef0 109 led_array(_average);
andcor02 0:d096ca2ffef0 110 sound_level();
andcor02 0:d096ca2ffef0 111 }
andcor02 0:d096ca2ffef0 112
andcor02 0:d096ca2ffef0 113 protected:
andcor02 0:d096ca2ffef0 114 AnalogIn _pin;
andcor02 0:d096ca2ffef0 115 BusOut _led1, _led2, _led3, _led4;
andcor02 0:d096ca2ffef0 116 float _value,_sum,_average;
andcor02 0:d096ca2ffef0 117 int _count;
andcor02 0:d096ca2ffef0 118 float _sample;
andcor02 0:d096ca2ffef0 119 Timer _t,_t1;
andcor02 0:d096ca2ffef0 120
andcor02 0:d096ca2ffef0 121 };
andcor02 0:d096ca2ffef0 122
andcor02 0:d096ca2ffef0 123
andcor02 0:d096ca2ffef0 124
andcor02 0:d096ca2ffef0 125
andcor02 0:d096ca2ffef0 126 MAX9814 mic(p20);
andcor02 0:d096ca2ffef0 127
andcor02 0:d096ca2ffef0 128 int main()
andcor02 0:d096ca2ffef0 129 {
andcor02 0:d096ca2ffef0 130 mic.calibration();
andcor02 0:d096ca2ffef0 131 while (1) {
andcor02 0:d096ca2ffef0 132 mic.volume_indicator();
andcor02 0:d096ca2ffef0 133 mic.sound_level();
andcor02 0:d096ca2ffef0 134 pc.printf("\n\r Level is %f", mic.sound_level());
andcor02 0:d096ca2ffef0 135 }
andcor02 0:d096ca2ffef0 136 }