Library 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.

Dependents:   MAX9814_LED_Sound_Indicator

Committer:
andcor02
Date:
Sun Nov 02 21:58:31 2014 +0000
Revision:
3:1a773fb0d7e7
Parent:
1:cf181e6a2ead
REV 1.01

Who changed what in which revision?

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