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:12:22 2014 +0000
Revision:
1:380e6ab41172
Intergrated Into h. cpp. files

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andcor02 1:380e6ab41172 1 #include "mbed.h"
andcor02 1:380e6ab41172 2 #include "Hammer_MicrophoneSensor.h"
andcor02 1:380e6ab41172 3
andcor02 1:380e6ab41172 4 MAX9814::MAX9814(PinName pin): _pin(pin), _led1(LED1), _led2(LED2), _led3(LED3), _led4(LED4) {
andcor02 1:380e6ab41172 5 calibration();
andcor02 1:380e6ab41172 6 }
andcor02 1:380e6ab41172 7
andcor02 1:380e6ab41172 8
andcor02 1:380e6ab41172 9 void MAX9814::led_array(float x ) {
andcor02 1:380e6ab41172 10
andcor02 1:380e6ab41172 11 if (_value<x+0.05) {
andcor02 1:380e6ab41172 12 _led1=0;
andcor02 1:380e6ab41172 13 _led2=0;
andcor02 1:380e6ab41172 14 _led3=0;
andcor02 1:380e6ab41172 15 _led4=0;
andcor02 1:380e6ab41172 16 }
andcor02 1:380e6ab41172 17 if (_value>x+0.05&&_value<0.5+x) {
andcor02 1:380e6ab41172 18 _led1=1;
andcor02 1:380e6ab41172 19 _led2=0;
andcor02 1:380e6ab41172 20 _led3=0;
andcor02 1:380e6ab41172 21 _led4=0;
andcor02 1:380e6ab41172 22 }
andcor02 1:380e6ab41172 23 if (_value>0.5+x&&_value<1+x) {
andcor02 1:380e6ab41172 24 _led1=1;
andcor02 1:380e6ab41172 25 _led2=1;
andcor02 1:380e6ab41172 26 _led3=0;
andcor02 1:380e6ab41172 27 _led4=0;
andcor02 1:380e6ab41172 28 }
andcor02 1:380e6ab41172 29 if (_value>1+x&&_value<1.2+x) {
andcor02 1:380e6ab41172 30 _led1=1;
andcor02 1:380e6ab41172 31 _led2=1;
andcor02 1:380e6ab41172 32 _led3=1;
andcor02 1:380e6ab41172 33 _led4=0;
andcor02 1:380e6ab41172 34 }
andcor02 1:380e6ab41172 35 if (_value>1.2+x&&_value<2.8+x) {
andcor02 1:380e6ab41172 36 _led1=1;
andcor02 1:380e6ab41172 37 _led2=1;
andcor02 1:380e6ab41172 38 _led3=1;
andcor02 1:380e6ab41172 39 _led4=1;
andcor02 1:380e6ab41172 40 }
andcor02 1:380e6ab41172 41 }
andcor02 1:380e6ab41172 42
andcor02 1:380e6ab41172 43 float MAX9814::calibration() {
andcor02 1:380e6ab41172 44
andcor02 1:380e6ab41172 45 _t.start();
andcor02 1:380e6ab41172 46 _t1.start();
andcor02 1:380e6ab41172 47 float peakToPeak=0, signalMax=0, signalMin=1024;
andcor02 1:380e6ab41172 48
andcor02 1:380e6ab41172 49 while (_t1.read()<1) {
andcor02 1:380e6ab41172 50 while (_t.read_ms()<50) {
andcor02 1:380e6ab41172 51 _sample=_pin.read();
andcor02 1:380e6ab41172 52
andcor02 1:380e6ab41172 53 if (_sample<1024) {
andcor02 1:380e6ab41172 54 if (_sample>signalMax)
andcor02 1:380e6ab41172 55 signalMax=_sample;
andcor02 1:380e6ab41172 56
andcor02 1:380e6ab41172 57 else if (_sample<signalMin)
andcor02 1:380e6ab41172 58 signalMin=_sample;
andcor02 1:380e6ab41172 59 }
andcor02 1:380e6ab41172 60 }
andcor02 1:380e6ab41172 61 _t.reset();
andcor02 1:380e6ab41172 62 peakToPeak=signalMax-signalMin;
andcor02 1:380e6ab41172 63 _value= (peakToPeak*3.3);
andcor02 1:380e6ab41172 64 _value = floor(_value * 100) / 100;
andcor02 1:380e6ab41172 65 _sum+=_value;
andcor02 1:380e6ab41172 66 _count++;
andcor02 1:380e6ab41172 67 }
andcor02 1:380e6ab41172 68 _average=_sum/_count;
andcor02 1:380e6ab41172 69 _t1.reset();
andcor02 1:380e6ab41172 70
andcor02 1:380e6ab41172 71 return _average;
andcor02 1:380e6ab41172 72 }
andcor02 1:380e6ab41172 73
andcor02 1:380e6ab41172 74 float MAX9814::sound_level() {
andcor02 1:380e6ab41172 75
andcor02 1:380e6ab41172 76 _t.start();
andcor02 1:380e6ab41172 77 float peakToPeak=0, signalMax=0, signalMin=1024;
andcor02 1:380e6ab41172 78
andcor02 1:380e6ab41172 79 while (_t.read_ms()<50) {
andcor02 1:380e6ab41172 80 _sample=_pin.read();
andcor02 1:380e6ab41172 81
andcor02 1:380e6ab41172 82 if (_sample<1024) {
andcor02 1:380e6ab41172 83 if (_sample>signalMax)
andcor02 1:380e6ab41172 84 signalMax=_sample;
andcor02 1:380e6ab41172 85
andcor02 1:380e6ab41172 86 else if (_sample<signalMin)
andcor02 1:380e6ab41172 87 signalMin=_sample;
andcor02 1:380e6ab41172 88 }
andcor02 1:380e6ab41172 89 }
andcor02 1:380e6ab41172 90 _t.reset();
andcor02 1:380e6ab41172 91 peakToPeak=signalMax-signalMin;
andcor02 1:380e6ab41172 92 _value= (peakToPeak*3.3);
andcor02 1:380e6ab41172 93 _value = floor(_value * 100) / 100;
andcor02 1:380e6ab41172 94 _sum+=_value;
andcor02 1:380e6ab41172 95 _count++;
andcor02 1:380e6ab41172 96
andcor02 1:380e6ab41172 97 return _value;
andcor02 1:380e6ab41172 98 }
andcor02 1:380e6ab41172 99
andcor02 1:380e6ab41172 100
andcor02 1:380e6ab41172 101 void MAX9814::volume_indicator() {
andcor02 1:380e6ab41172 102 led_array(_average);
andcor02 1:380e6ab41172 103 sound_level();
andcor02 1:380e6ab41172 104 }