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

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?

UserRevisionLine numberNew 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