Car stereo control using TDA7419 for input select, audio control. Adafruit 96x64 monochrome 0.96" display to show the audio selections four buttons to control selections. Next steps: take input from the car steering wheel controls!
Dependencies: Adafruit_GFX PinDetect_KL25Z PreampTDA7419 mbed
main.cpp@4:46da1eff72bf, 2014-10-26 (annotated)
- Committer:
- danielashercohen
- Date:
- Sun Oct 26 22:53:27 2014 +0000
- Revision:
- 4:46da1eff72bf
- Parent:
- 3:8d3cc3488cd8
- Child:
- 5:28533591b528
Basic audio functions (balance, fade, tone, mix, input select) all working. Display working.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
danielashercohen | 0:36eee45709c8 | 1 | #include "mbed.h" |
danielashercohen | 0:36eee45709c8 | 2 | #include "PinDetect.h" |
danielashercohen | 1:f5b8687f67b8 | 3 | #include "Adafruit_SSD1306.h" |
danielashercohen | 2:2b0cf4d80668 | 4 | #include "PreampTDA7419.h" |
danielashercohen | 0:36eee45709c8 | 5 | |
danielashercohen | 3:8d3cc3488cd8 | 6 | #define NUM_OPTIONS 12 // how many different options does the stereo have? |
danielashercohen | 3:8d3cc3488cd8 | 7 | char option; |
danielashercohen | 3:8d3cc3488cd8 | 8 | |
danielashercohen | 0:36eee45709c8 | 9 | PinDetect PinUp ( PTA1 ); |
danielashercohen | 0:36eee45709c8 | 10 | PinDetect PinLeft ( PTD4 ); |
danielashercohen | 0:36eee45709c8 | 11 | PinDetect PinRight ( PTA2 ); |
danielashercohen | 0:36eee45709c8 | 12 | PinDetect PinDown ( PTA12 ); |
danielashercohen | 0:36eee45709c8 | 13 | |
danielashercohen | 1:f5b8687f67b8 | 14 | class SPI2 : public SPI |
danielashercohen | 1:f5b8687f67b8 | 15 | { |
danielashercohen | 1:f5b8687f67b8 | 16 | public: |
danielashercohen | 1:f5b8687f67b8 | 17 | SPI2(PinName mosi, PinName miso, PinName clk) : SPI(mosi,miso,clk) |
danielashercohen | 1:f5b8687f67b8 | 18 | { |
danielashercohen | 1:f5b8687f67b8 | 19 | format(8,3); |
danielashercohen | 1:f5b8687f67b8 | 20 | frequency(2000000); |
danielashercohen | 1:f5b8687f67b8 | 21 | }; |
danielashercohen | 1:f5b8687f67b8 | 22 | }; |
danielashercohen | 0:36eee45709c8 | 23 | |
danielashercohen | 1:f5b8687f67b8 | 24 | SPI2 gSpi(PTD2,NC,PTD1); |
danielashercohen | 1:f5b8687f67b8 | 25 | Adafruit_SSD1306 display (gSpi, PTD0, PTD5, PTA13); // SPI obect, DC, RST, CS |
danielashercohen | 2:2b0cf4d80668 | 26 | PreampTDA7419 Preamp (PTE0, PTE1); |
danielashercohen | 1:f5b8687f67b8 | 27 | |
danielashercohen | 4:46da1eff72bf | 28 | ///////////////////////////////////////////// |
danielashercohen | 4:46da1eff72bf | 29 | // Helper functions for the serial display // |
danielashercohen | 4:46da1eff72bf | 30 | ///////////////////////////////////////////// |
danielashercohen | 1:f5b8687f67b8 | 31 | void testfillrect(void) { |
danielashercohen | 1:f5b8687f67b8 | 32 | uint8_t color = 1; |
danielashercohen | 1:f5b8687f67b8 | 33 | for (int16_t i=0; i<display.height()/2; i+=3) { |
danielashercohen | 1:f5b8687f67b8 | 34 | // alternate colors |
danielashercohen | 1:f5b8687f67b8 | 35 | wait(0.05); |
danielashercohen | 1:f5b8687f67b8 | 36 | display.fillRect(i, i, display.width()-i*2, display.height()-i*2, color%2); |
danielashercohen | 1:f5b8687f67b8 | 37 | display.display(); |
danielashercohen | 1:f5b8687f67b8 | 38 | color++; |
danielashercohen | 1:f5b8687f67b8 | 39 | } |
danielashercohen | 1:f5b8687f67b8 | 40 | } |
danielashercohen | 0:36eee45709c8 | 41 | |
danielashercohen | 0:36eee45709c8 | 42 | void displayWrite(char firstLine[], int value) |
danielashercohen | 0:36eee45709c8 | 43 | { |
danielashercohen | 1:f5b8687f67b8 | 44 | display.clearDisplay(); |
danielashercohen | 1:f5b8687f67b8 | 45 | display.setCursor(0,0); |
danielashercohen | 1:f5b8687f67b8 | 46 | display.setTextSize(2); |
danielashercohen | 1:f5b8687f67b8 | 47 | display.printf("%s\r\n", firstLine); |
danielashercohen | 1:f5b8687f67b8 | 48 | display.setCursor(0,30); |
danielashercohen | 1:f5b8687f67b8 | 49 | display.setTextSize(5); |
danielashercohen | 1:f5b8687f67b8 | 50 | display.printf(" %d\r\n", value); |
danielashercohen | 1:f5b8687f67b8 | 51 | display.display(); |
danielashercohen | 0:36eee45709c8 | 52 | } |
danielashercohen | 0:36eee45709c8 | 53 | |
danielashercohen | 4:46da1eff72bf | 54 | void displayWrite(char firstLine[], char secondLine[]) |
danielashercohen | 4:46da1eff72bf | 55 | { |
danielashercohen | 4:46da1eff72bf | 56 | display.clearDisplay(); |
danielashercohen | 4:46da1eff72bf | 57 | display.setCursor(0,0); |
danielashercohen | 4:46da1eff72bf | 58 | display.setTextSize(2); |
danielashercohen | 4:46da1eff72bf | 59 | display.printf("%s\r\n", firstLine); |
danielashercohen | 4:46da1eff72bf | 60 | display.printf("%s\r\n", secondLine); |
danielashercohen | 4:46da1eff72bf | 61 | display.display(); |
danielashercohen | 4:46da1eff72bf | 62 | } |
danielashercohen | 4:46da1eff72bf | 63 | |
danielashercohen | 0:36eee45709c8 | 64 | void processButtonPress (int button) { |
danielashercohen | 0:36eee45709c8 | 65 | |
danielashercohen | 0:36eee45709c8 | 66 | if (button == 0) { |
danielashercohen | 0:36eee45709c8 | 67 | if (option < (NUM_OPTIONS-1)) { |
danielashercohen | 0:36eee45709c8 | 68 | option++; |
danielashercohen | 0:36eee45709c8 | 69 | } else { |
danielashercohen | 0:36eee45709c8 | 70 | option = 0; |
danielashercohen | 0:36eee45709c8 | 71 | } |
danielashercohen | 0:36eee45709c8 | 72 | } |
danielashercohen | 0:36eee45709c8 | 73 | |
danielashercohen | 0:36eee45709c8 | 74 | if (button == 1) { |
danielashercohen | 0:36eee45709c8 | 75 | if (option > 0) { |
danielashercohen | 0:36eee45709c8 | 76 | option--; |
danielashercohen | 0:36eee45709c8 | 77 | } else { |
danielashercohen | 0:36eee45709c8 | 78 | option = (NUM_OPTIONS-1); |
danielashercohen | 0:36eee45709c8 | 79 | } |
danielashercohen | 0:36eee45709c8 | 80 | } |
danielashercohen | 0:36eee45709c8 | 81 | |
danielashercohen | 0:36eee45709c8 | 82 | switch (option) { |
danielashercohen | 0:36eee45709c8 | 83 | case (0): // if volume option is selected change volume when button 1 and 2 are pressed |
danielashercohen | 0:36eee45709c8 | 84 | if (button == 2) { |
danielashercohen | 3:8d3cc3488cd8 | 85 | Preamp.decreaseVolume(); |
danielashercohen | 0:36eee45709c8 | 86 | } |
danielashercohen | 0:36eee45709c8 | 87 | if (button == 3) { |
danielashercohen | 3:8d3cc3488cd8 | 88 | Preamp.increaseVolume(); |
danielashercohen | 0:36eee45709c8 | 89 | } |
danielashercohen | 3:8d3cc3488cd8 | 90 | displayWrite("Volume", Preamp.readVolume() ); |
danielashercohen | 0:36eee45709c8 | 91 | break; |
danielashercohen | 0:36eee45709c8 | 92 | case (1): // manage the input - 1,2,3 are the standard single ended inputs |
danielashercohen | 3:8d3cc3488cd8 | 93 | int input = Preamp.readInput(); |
danielashercohen | 0:36eee45709c8 | 94 | if (button == 2) { |
danielashercohen | 3:8d3cc3488cd8 | 95 | input--; |
danielashercohen | 0:36eee45709c8 | 96 | } |
danielashercohen | 0:36eee45709c8 | 97 | if (button == 3) { |
danielashercohen | 3:8d3cc3488cd8 | 98 | input++; |
danielashercohen | 0:36eee45709c8 | 99 | } |
danielashercohen | 3:8d3cc3488cd8 | 100 | Preamp.setInput(input); |
danielashercohen | 3:8d3cc3488cd8 | 101 | displayWrite("Input", Preamp.readInput() ); |
danielashercohen | 0:36eee45709c8 | 102 | break; |
danielashercohen | 0:36eee45709c8 | 103 | case (2): // manage the treble value |
danielashercohen | 0:36eee45709c8 | 104 | if (button == 2) { |
danielashercohen | 3:8d3cc3488cd8 | 105 | Preamp.decreaseTreble(); |
danielashercohen | 0:36eee45709c8 | 106 | } |
danielashercohen | 0:36eee45709c8 | 107 | if (button == 3) { |
danielashercohen | 3:8d3cc3488cd8 | 108 | Preamp.increaseTreble(); |
danielashercohen | 0:36eee45709c8 | 109 | } |
danielashercohen | 3:8d3cc3488cd8 | 110 | displayWrite("Treble", Preamp.readTreble()); |
danielashercohen | 0:36eee45709c8 | 111 | break; |
danielashercohen | 4:46da1eff72bf | 112 | case (3): // manage the treble value |
danielashercohen | 0:36eee45709c8 | 113 | if (button == 2) { |
danielashercohen | 4:46da1eff72bf | 114 | Preamp.decreaseMiddle(); |
danielashercohen | 0:36eee45709c8 | 115 | } |
danielashercohen | 0:36eee45709c8 | 116 | if (button == 3) { |
danielashercohen | 4:46da1eff72bf | 117 | Preamp.increaseMiddle(); |
danielashercohen | 0:36eee45709c8 | 118 | } |
danielashercohen | 4:46da1eff72bf | 119 | displayWrite("Middle", Preamp.readMiddle()); |
danielashercohen | 4:46da1eff72bf | 120 | break; |
danielashercohen | 4:46da1eff72bf | 121 | case (4): // manage the treble value |
danielashercohen | 0:36eee45709c8 | 122 | if (button == 2) { |
danielashercohen | 4:46da1eff72bf | 123 | Preamp.decreaseBass(); |
danielashercohen | 0:36eee45709c8 | 124 | } |
danielashercohen | 0:36eee45709c8 | 125 | if (button == 3) { |
danielashercohen | 4:46da1eff72bf | 126 | Preamp.increaseBass(); |
danielashercohen | 0:36eee45709c8 | 127 | } |
danielashercohen | 4:46da1eff72bf | 128 | displayWrite("Bass", Preamp.readBass()); |
danielashercohen | 0:36eee45709c8 | 129 | break; |
danielashercohen | 0:36eee45709c8 | 130 | |
danielashercohen | 0:36eee45709c8 | 131 | // Manage the attenuators |
danielashercohen | 0:36eee45709c8 | 132 | case (5): // manage the atten_lf value |
danielashercohen | 0:36eee45709c8 | 133 | if (button == 2) { |
danielashercohen | 4:46da1eff72bf | 134 | displayWrite("LF", Preamp.decreaseSpeaker(1) ); |
danielashercohen | 4:46da1eff72bf | 135 | } |
danielashercohen | 4:46da1eff72bf | 136 | else if (button == 3) { |
danielashercohen | 4:46da1eff72bf | 137 | displayWrite("LF", Preamp.increaseSpeaker(1) ); |
danielashercohen | 4:46da1eff72bf | 138 | } |
danielashercohen | 4:46da1eff72bf | 139 | else { |
danielashercohen | 4:46da1eff72bf | 140 | displayWrite("LF", Preamp.readSpeaker(1) ); |
danielashercohen | 0:36eee45709c8 | 141 | } |
danielashercohen | 0:36eee45709c8 | 142 | break; |
danielashercohen | 0:36eee45709c8 | 143 | case (6): // manage the atten_rf value |
danielashercohen | 0:36eee45709c8 | 144 | if (button == 2) { |
danielashercohen | 4:46da1eff72bf | 145 | displayWrite("RF", Preamp.decreaseSpeaker(2) ); |
danielashercohen | 4:46da1eff72bf | 146 | } |
danielashercohen | 4:46da1eff72bf | 147 | else if (button == 3) { |
danielashercohen | 4:46da1eff72bf | 148 | displayWrite("RF", Preamp.increaseSpeaker(2) ); |
danielashercohen | 0:36eee45709c8 | 149 | } |
danielashercohen | 4:46da1eff72bf | 150 | else { |
danielashercohen | 4:46da1eff72bf | 151 | displayWrite("RF", Preamp.readSpeaker(2) ); |
danielashercohen | 4:46da1eff72bf | 152 | } |
danielashercohen | 0:36eee45709c8 | 153 | break; |
danielashercohen | 0:36eee45709c8 | 154 | case (7): // manage the atten_lr value |
danielashercohen | 0:36eee45709c8 | 155 | if (button == 2) { |
danielashercohen | 4:46da1eff72bf | 156 | displayWrite("LR", Preamp.decreaseSpeaker(3) ); |
danielashercohen | 0:36eee45709c8 | 157 | } |
danielashercohen | 4:46da1eff72bf | 158 | else if (button == 3) { |
danielashercohen | 4:46da1eff72bf | 159 | displayWrite("LR", Preamp.increaseSpeaker(3) ); |
danielashercohen | 4:46da1eff72bf | 160 | } |
danielashercohen | 4:46da1eff72bf | 161 | else { |
danielashercohen | 4:46da1eff72bf | 162 | displayWrite("LR", Preamp.readSpeaker(3) ); |
danielashercohen | 4:46da1eff72bf | 163 | } |
danielashercohen | 0:36eee45709c8 | 164 | break; |
danielashercohen | 0:36eee45709c8 | 165 | case (8): // manage the atten_rr value |
danielashercohen | 0:36eee45709c8 | 166 | if (button == 2) { |
danielashercohen | 4:46da1eff72bf | 167 | displayWrite("RR", Preamp.decreaseSpeaker(4) ); |
danielashercohen | 4:46da1eff72bf | 168 | } |
danielashercohen | 4:46da1eff72bf | 169 | else if (button == 3) { |
danielashercohen | 4:46da1eff72bf | 170 | displayWrite("RR", Preamp.increaseSpeaker(4) ); |
danielashercohen | 0:36eee45709c8 | 171 | } |
danielashercohen | 4:46da1eff72bf | 172 | else { |
danielashercohen | 4:46da1eff72bf | 173 | displayWrite("RR", Preamp.readSpeaker(4) ); |
danielashercohen | 4:46da1eff72bf | 174 | } |
danielashercohen | 0:36eee45709c8 | 175 | break; |
danielashercohen | 4:46da1eff72bf | 176 | case (9): // manage the atten_sub value |
danielashercohen | 0:36eee45709c8 | 177 | if (button == 2) { |
danielashercohen | 4:46da1eff72bf | 178 | displayWrite("SUB", Preamp.decreaseSpeaker(5) ); |
danielashercohen | 0:36eee45709c8 | 179 | } |
danielashercohen | 4:46da1eff72bf | 180 | else if (button == 3) { |
danielashercohen | 4:46da1eff72bf | 181 | displayWrite("SUB", Preamp.increaseSpeaker(5) ); |
danielashercohen | 0:36eee45709c8 | 182 | } |
danielashercohen | 4:46da1eff72bf | 183 | else { |
danielashercohen | 4:46da1eff72bf | 184 | displayWrite("SUB", Preamp.readSpeaker(5) ); |
danielashercohen | 4:46da1eff72bf | 185 | } |
danielashercohen | 0:36eee45709c8 | 186 | break; |
danielashercohen | 4:46da1eff72bf | 187 | case (10): // manage the atten_mix value |
danielashercohen | 0:36eee45709c8 | 188 | if (button == 2) { |
danielashercohen | 4:46da1eff72bf | 189 | displayWrite("Mix Level", Preamp.decreaseSpeaker(6) ); |
danielashercohen | 0:36eee45709c8 | 190 | } |
danielashercohen | 4:46da1eff72bf | 191 | else if (button == 3) { |
danielashercohen | 4:46da1eff72bf | 192 | displayWrite("Mix Level", Preamp.increaseSpeaker(6) ); |
danielashercohen | 0:36eee45709c8 | 193 | } |
danielashercohen | 4:46da1eff72bf | 194 | else { |
danielashercohen | 4:46da1eff72bf | 195 | displayWrite("Mix Level", Preamp.readSpeaker(6) ); |
danielashercohen | 4:46da1eff72bf | 196 | } |
danielashercohen | 0:36eee45709c8 | 197 | break; |
danielashercohen | 0:36eee45709c8 | 198 | case (11): // manage the atten_sub value |
danielashercohen | 4:46da1eff72bf | 199 | if ( (button == 2) || (button == 3) ) { |
danielashercohen | 4:46da1eff72bf | 200 | Preamp.toggleMix(); |
danielashercohen | 4:46da1eff72bf | 201 | } |
danielashercohen | 4:46da1eff72bf | 202 | if (Preamp.readMix()) { |
danielashercohen | 4:46da1eff72bf | 203 | displayWrite("Mix", "Enabled"); |
danielashercohen | 0:36eee45709c8 | 204 | } |
danielashercohen | 4:46da1eff72bf | 205 | else { |
danielashercohen | 4:46da1eff72bf | 206 | displayWrite("Mix", "Disabled"); |
danielashercohen | 0:36eee45709c8 | 207 | } |
danielashercohen | 4:46da1eff72bf | 208 | break; |
danielashercohen | 4:46da1eff72bf | 209 | |
danielashercohen | 0:36eee45709c8 | 210 | } |
danielashercohen | 0:36eee45709c8 | 211 | } |
danielashercohen | 0:36eee45709c8 | 212 | |
danielashercohen | 0:36eee45709c8 | 213 | void UpPressed( void ) |
danielashercohen | 0:36eee45709c8 | 214 | { |
danielashercohen | 0:36eee45709c8 | 215 | processButtonPress(0); |
danielashercohen | 0:36eee45709c8 | 216 | } |
danielashercohen | 0:36eee45709c8 | 217 | |
danielashercohen | 0:36eee45709c8 | 218 | void LeftPressed( void ) |
danielashercohen | 0:36eee45709c8 | 219 | { |
danielashercohen | 0:36eee45709c8 | 220 | processButtonPress(2); |
danielashercohen | 0:36eee45709c8 | 221 | } |
danielashercohen | 0:36eee45709c8 | 222 | |
danielashercohen | 0:36eee45709c8 | 223 | void RightPressed( void ) |
danielashercohen | 0:36eee45709c8 | 224 | { |
danielashercohen | 0:36eee45709c8 | 225 | processButtonPress(3); |
danielashercohen | 0:36eee45709c8 | 226 | } |
danielashercohen | 0:36eee45709c8 | 227 | |
danielashercohen | 0:36eee45709c8 | 228 | void DownPressed( void ) |
danielashercohen | 0:36eee45709c8 | 229 | { |
danielashercohen | 0:36eee45709c8 | 230 | processButtonPress(1); |
danielashercohen | 0:36eee45709c8 | 231 | } |
danielashercohen | 0:36eee45709c8 | 232 | |
danielashercohen | 0:36eee45709c8 | 233 | int main() |
danielashercohen | 0:36eee45709c8 | 234 | { |
danielashercohen | 0:36eee45709c8 | 235 | PinUp .mode( PullUp ); |
danielashercohen | 0:36eee45709c8 | 236 | PinLeft .mode( PullUp ); |
danielashercohen | 0:36eee45709c8 | 237 | PinRight.mode( PullUp ); |
danielashercohen | 0:36eee45709c8 | 238 | PinDown .mode( PullUp ); |
danielashercohen | 0:36eee45709c8 | 239 | |
danielashercohen | 0:36eee45709c8 | 240 | PinUp .attach_asserted( &UpPressed ); |
danielashercohen | 0:36eee45709c8 | 241 | PinLeft .attach_asserted( &LeftPressed ); |
danielashercohen | 0:36eee45709c8 | 242 | PinRight.attach_asserted( &RightPressed ); |
danielashercohen | 0:36eee45709c8 | 243 | PinDown .attach_asserted( &DownPressed ); |
danielashercohen | 0:36eee45709c8 | 244 | |
danielashercohen | 1:f5b8687f67b8 | 245 | display.clearDisplay(); |
danielashercohen | 1:f5b8687f67b8 | 246 | // draw multiple rectangles |
danielashercohen | 1:f5b8687f67b8 | 247 | testfillrect(); |
danielashercohen | 4:46da1eff72bf | 248 | wait(0.3); |
danielashercohen | 1:f5b8687f67b8 | 249 | display.display(); |
danielashercohen | 1:f5b8687f67b8 | 250 | display.clearDisplay(); |
danielashercohen | 1:f5b8687f67b8 | 251 | display.display(); |
danielashercohen | 1:f5b8687f67b8 | 252 | |
danielashercohen | 0:36eee45709c8 | 253 | |
danielashercohen | 0:36eee45709c8 | 254 | // Sampling does not begin until you set a frequency. |
danielashercohen | 0:36eee45709c8 | 255 | // The default is 20ms. If you want a different frequency |
danielashercohen | 0:36eee45709c8 | 256 | // then pass the period in microseconds for example, for 10ms :- |
danielashercohen | 0:36eee45709c8 | 257 | // pin.setSampleFrequency( 10000 ); |
danielashercohen | 0:36eee45709c8 | 258 | // |
danielashercohen | 3:8d3cc3488cd8 | 259 | PinUp .setSampleFrequency(10000); // Defaults to 20ms. |
danielashercohen | 3:8d3cc3488cd8 | 260 | PinLeft .setSampleFrequency(10000); // Defaults to 20ms. |
danielashercohen | 3:8d3cc3488cd8 | 261 | PinRight.setSampleFrequency(10000); // Defaults to 20ms. |
danielashercohen | 3:8d3cc3488cd8 | 262 | PinDown .setSampleFrequency(10000); // Defaults to 20ms. |
danielashercohen | 0:36eee45709c8 | 263 | |
danielashercohen | 3:8d3cc3488cd8 | 264 | // option = NUM_OPTIONS; |
danielashercohen | 1:f5b8687f67b8 | 265 | processButtonPress(0); |
danielashercohen | 1:f5b8687f67b8 | 266 | |
danielashercohen | 0:36eee45709c8 | 267 | while (1) { |
danielashercohen | 3:8d3cc3488cd8 | 268 | wait(0.2); |
danielashercohen | 0:36eee45709c8 | 269 | } |
danielashercohen | 0:36eee45709c8 | 270 | |
danielashercohen | 0:36eee45709c8 | 271 | } |
danielashercohen | 0:36eee45709c8 | 272 | |
danielashercohen | 0:36eee45709c8 | 273 | // EOF |