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