Room echo calculator
Dependencies: Adafruit-GFX-MbedOS6 Adafruit_SSD1331_MbedOS6
main.cpp@1:2b95f921e7f2, 2021-05-03 (annotated)
- 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?
User | Revision | Line number | New 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 | } |