Room echo calculator

Dependencies:   Adafruit-GFX-MbedOS6 Adafruit_SSD1331_MbedOS6

Committer:
zernobilly
Date:
Mon May 03 16:25:02 2021 +0000
Revision:
1:2b95f921e7f2
Parent:
0:33edf726559b
MIC3 OLEDrgb L432KC - Hamk projekti

Who changed what in which revision?

UserRevisionLine numberNew contents of line
timo_k2 0:33edf726559b 1 /*
timo_k2 0:33edf726559b 2 *
timo_k2 0:33edf726559b 3 * Connections
timo_k2 0:33edf726559b 4 * L432KC D3 --- SS PmodMIC3
timo_k2 0:33edf726559b 5 * L432KC D12 --- MISO PmodMIC3
timo_k2 0:33edf726559b 6 * L432KC D13 --- SCK PmodMIC3
timo_k2 0:33edf726559b 7 * GND --- GND PmodMIC3
timo_k2 0:33edf726559b 8 * Vcc --- VCC PmodMIC3
timo_k2 0:33edf726559b 9 *
zernobilly 1:2b95f921e7f2 10 * L432KC A5 --- SS PmodOLEDrgb
zernobilly 1:2b95f921e7f2 11 * L432KC D11 --- MOSI PmodOLEDrgb
zernobilly 1:2b95f921e7f2 12 * L432KC D13 --- SCK PmodOLEDrgb
zernobilly 1:2b95f921e7f2 13 * GND --- GND PmodOLEDrgb
zernobilly 1:2b95f921e7f2 14 * VCC --- VCC PmodOLEDrgb
zernobilly 1:2b95f921e7f2 15 * L432KC D10 --- D/C PmodOLEDrgb
zernobilly 1:2b95f921e7f2 16 * L432KC D8 --- RES PmodOLEDrgb
zernobilly 1:2b95f921e7f2 17 * VCC --- VCCEN PmodOLEDrgb
zernobilly 1:2b95f921e7f2 18 * VCC --- PMODEN PmodOLEDrgb
zernobilly 1:2b95f921e7f2 19 *
zernobilly 1:2b95f921e7f2 20 * NUCLEO-L432KC
timo_k2 0:33edf726559b 21 * Pmod MIC3
zernobilly 1:2b95f921e7f2 22 * Pmod OLEDrgb
timo_k2 0:33edf726559b 23 *
zernobilly 1:2b95f921e7f2 24 * Reference - Timo Karppinen - Pmod_MIC3_Microphone_L432KC_OS6,
zernobilly 1:2b95f921e7f2 25 * McLab10_OLEDrgb_L432KC_OS60_tk2
zernobilly 1:2b95f921e7f2 26 *
timo_k2 0:33edf726559b 27 **************************************************/
timo_k2 0:33edf726559b 28 #include "mbed.h"
zernobilly 1:2b95f921e7f2 29 #include "Adafruit_SSD1331.h"
zernobilly 1:2b95f921e7f2 30 #include "Adafruit_GFX.h"
timo_k2 0:33edf726559b 31
timo_k2 0:33edf726559b 32 SPI spi(D11, D12, D13); // mosi, miso, sclk
zernobilly 1:2b95f921e7f2 33
zernobilly 1:2b95f921e7f2 34 Adafruit_SSD1331 OLED(A5, D8, D10, D11, NC, D13); // cs, res, dc, mosi, (nc), sck
zernobilly 1:2b95f921e7f2 35
timo_k2 0:33edf726559b 36 DigitalOut mic3cs(D3);
zernobilly 1:2b95f921e7f2 37 DigitalOut oledcs(A5);
zernobilly 1:2b95f921e7f2 38 DigitalOut LED(D9);
zernobilly 1:2b95f921e7f2 39
zernobilly 1:2b95f921e7f2 40
zernobilly 1:2b95f921e7f2 41
zernobilly 1:2b95f921e7f2 42 // Definition of colours on the OLED display
zernobilly 1:2b95f921e7f2 43 #define Black 0x0000
zernobilly 1:2b95f921e7f2 44 #define Blue 0x001F
zernobilly 1:2b95f921e7f2 45 #define Red 0xF800
zernobilly 1:2b95f921e7f2 46 #define Green 0x07E0
zernobilly 1:2b95f921e7f2 47 #define Cyan 0x07FF
zernobilly 1:2b95f921e7f2 48 #define Magenta 0xF81F
zernobilly 1:2b95f921e7f2 49 #define Yellow 0xFFE0
zernobilly 1:2b95f921e7f2 50 #define White 0xFFFF
timo_k2 0:33edf726559b 51
timo_k2 0:33edf726559b 52
timo_k2 0:33edf726559b 53 int raw = 0; // 16 bits from MIC3
timo_k2 0:33edf726559b 54 int sound32bit = 0;
timo_k2 0:33edf726559b 55 int sound = 0;
zernobilly 1:2b95f921e7f2 56 int delayCount = 0;
zernobilly 1:2b95f921e7f2 57 int resetCount = 0;
zernobilly 1:2b95f921e7f2 58
zernobilly 1:2b95f921e7f2 59 //Function declaration
zernobilly 1:2b95f921e7f2 60 void delayCalc();
timo_k2 0:33edf726559b 61
timo_k2 0:33edf726559b 62
timo_k2 0:33edf726559b 63 int main()
timo_k2 0:33edf726559b 64 {
zernobilly 1:2b95f921e7f2 65 oledcs.write(0);
zernobilly 1:2b95f921e7f2 66
zernobilly 1:2b95f921e7f2 67 OLED.begin(); // initialization of display object
zernobilly 1:2b95f921e7f2 68 OLED.clearScreen();
zernobilly 1:2b95f921e7f2 69 OLED.fillScreen(Black); // background screen in black
zernobilly 1:2b95f921e7f2 70 OLED.setTextColor(Cyan); // colour of text in cyan
zernobilly 1:2b95f921e7f2 71 OLED.setTextSize(2);
zernobilly 1:2b95f921e7f2 72
zernobilly 1:2b95f921e7f2 73 ThisThread::sleep_for(1000ms);
zernobilly 1:2b95f921e7f2 74
zernobilly 1:2b95f921e7f2 75
timo_k2 0:33edf726559b 76 // Chip must be deselected
timo_k2 0:33edf726559b 77 mic3cs.write(1);
zernobilly 1:2b95f921e7f2 78 oledcs.write(1);
timo_k2 0:33edf726559b 79
timo_k2 0:33edf726559b 80 // Setup the spi for 16 bit data, low steady state clock,
timo_k2 0:33edf726559b 81 // rising edge capture, with a 1MHz clock rate
timo_k2 0:33edf726559b 82 spi.format(16, 0);
timo_k2 0:33edf726559b 83 spi.frequency(1000000);
timo_k2 0:33edf726559b 84 ThisThread::sleep_for(100ms);
timo_k2 0:33edf726559b 85
timo_k2 0:33edf726559b 86 while(1){
zernobilly 1:2b95f921e7f2 87 // Select the device by setting chip select low
timo_k2 0:33edf726559b 88 mic3cs.write(0);
timo_k2 0:33edf726559b 89 ThisThread::sleep_for(1ms); // > 100 ns for the MAX31855
timo_k2 0:33edf726559b 90
timo_k2 0:33edf726559b 91 // Send 0x0000 to nowhere to read the 16 bits
timo_k2 0:33edf726559b 92 raw = spi.write(0x0000);
timo_k2 0:33edf726559b 93
timo_k2 0:33edf726559b 94 ThisThread::sleep_for(1ms);
timo_k2 0:33edf726559b 95
timo_k2 0:33edf726559b 96 // Deselect the device
timo_k2 0:33edf726559b 97 mic3cs.write(1);
zernobilly 1:2b95f921e7f2 98
timo_k2 0:33edf726559b 99
zernobilly 1:2b95f921e7f2 100 printf("16 bits MIC3 = 0x%X", raw);
timo_k2 0:33edf726559b 101
timo_k2 0:33edf726559b 102 sound32bit = raw << 22; // 22 bits to the left to create 32 bit two's complement
timo_k2 0:33edf726559b 103 sound = sound32bit / 16777216; // 2 exp24 = 16 7777 216 means shifting 24 bits left without shifting the sign!
zernobilly 1:2b95f921e7f2 104
zernobilly 1:2b95f921e7f2 105 if (sound < 0){ // Converts negative values to positive.
zernobilly 1:2b95f921e7f2 106 sound = sound = -sound;
timo_k2 0:33edf726559b 107 }
zernobilly 1:2b95f921e7f2 108
zernobilly 1:2b95f921e7f2 109 printf(" sound 12 bit = %d\n", sound);
zernobilly 1:2b95f921e7f2 110
zernobilly 1:2b95f921e7f2 111 delayCalc();
zernobilly 1:2b95f921e7f2 112
zernobilly 1:2b95f921e7f2 113 }
timo_k2 0:33edf726559b 114 }
timo_k2 0:33edf726559b 115
zernobilly 1:2b95f921e7f2 116 void delayCalc(){ // Calculates how many times sound exceeds sound level 5
zernobilly 1:2b95f921e7f2 117
zernobilly 1:2b95f921e7f2 118 if (sound => 5){
zernobilly 1:2b95f921e7f2 119 LED.write(1);
zernobilly 1:2b95f921e7f2 120 delayCount ++; // Add value to reset counter
zernobilly 1:2b95f921e7f2 121 resetCount = 0;
zernobilly 1:2b95f921e7f2 122 }
zernobilly 1:2b95f921e7f2 123 else {
zernobilly 1:2b95f921e7f2 124 resetCount ++; // Add value to reset counter
zernobilly 1:2b95f921e7f2 125 LED.write(0);
zernobilly 1:2b95f921e7f2 126
zernobilly 1:2b95f921e7f2 127 }
zernobilly 1:2b95f921e7f2 128 if (sound < 5 && delayCount > 0 && resetCount > 9){ // Delay reset activates and prints the delay value
zernobilly 1:2b95f921e7f2 129 oledcs.write(0);
zernobilly 1:2b95f921e7f2 130 ThisThread::sleep_for(2ms); // > minimum clock cycle time of 150ns for SSD1331
zernobilly 1:2b95f921e7f2 131
zernobilly 1:2b95f921e7f2 132 OLED.clearScreen();
zernobilly 1:2b95f921e7f2 133 OLED.setCursor(0,0);
zernobilly 1:2b95f921e7f2 134 OLED.printf("Delay: %d\n", delayCount);
zernobilly 1:2b95f921e7f2 135 ThisThread::sleep_for(1000ms);
zernobilly 1:2b95f921e7f2 136 oledcs.write(1);
zernobilly 1:2b95f921e7f2 137
zernobilly 1:2b95f921e7f2 138 delayCount = 0; // Resetting the variables
zernobilly 1:2b95f921e7f2 139 sound = 0;
zernobilly 1:2b95f921e7f2 140 raw = 0;
zernobilly 1:2b95f921e7f2 141 resetCount = 0;
zernobilly 1:2b95f921e7f2 142 }
zernobilly 1:2b95f921e7f2 143
zernobilly 1:2b95f921e7f2 144
zernobilly 1:2b95f921e7f2 145 }