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:
Mon Oct 20 05:55:05 2014 +0000
Revision:
3:8d3cc3488cd8
Parent:
2:2b0cf4d80668
Child:
4:46da1eff72bf
Volume, input and treble controls working.; Moving all the functionality into the library

Who changed what in which revision?

UserRevisionLine numberNew 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 1:f5b8687f67b8 28 void testfillrect(void) {
danielashercohen 1:f5b8687f67b8 29 uint8_t color = 1;
danielashercohen 1:f5b8687f67b8 30 for (int16_t i=0; i<display.height()/2; i+=3) {
danielashercohen 1:f5b8687f67b8 31 // alternate colors
danielashercohen 1:f5b8687f67b8 32 wait(0.05);
danielashercohen 1:f5b8687f67b8 33 display.fillRect(i, i, display.width()-i*2, display.height()-i*2, color%2);
danielashercohen 1:f5b8687f67b8 34 display.display();
danielashercohen 1:f5b8687f67b8 35 color++;
danielashercohen 1:f5b8687f67b8 36 }
danielashercohen 1:f5b8687f67b8 37 }
danielashercohen 0:36eee45709c8 38
danielashercohen 0:36eee45709c8 39 void displayWrite(char firstLine[], int value)
danielashercohen 0:36eee45709c8 40 {
danielashercohen 1:f5b8687f67b8 41 display.clearDisplay();
danielashercohen 1:f5b8687f67b8 42 display.setCursor(0,0);
danielashercohen 1:f5b8687f67b8 43 display.setTextSize(2);
danielashercohen 1:f5b8687f67b8 44 display.printf("%s\r\n", firstLine);
danielashercohen 1:f5b8687f67b8 45 display.setCursor(0,30);
danielashercohen 1:f5b8687f67b8 46 display.setTextSize(5);
danielashercohen 1:f5b8687f67b8 47 display.printf(" %d\r\n", value);
danielashercohen 1:f5b8687f67b8 48 display.display();
danielashercohen 0:36eee45709c8 49 }
danielashercohen 0:36eee45709c8 50
danielashercohen 0:36eee45709c8 51 /////////////////////////////////////////////
danielashercohen 0:36eee45709c8 52 // Helper functions for the serial display //
danielashercohen 0:36eee45709c8 53 /////////////////////////////////////////////
danielashercohen 0:36eee45709c8 54 void processButtonPress (int button) {
danielashercohen 0:36eee45709c8 55
danielashercohen 0:36eee45709c8 56 if (button == 0) {
danielashercohen 0:36eee45709c8 57 if (option < (NUM_OPTIONS-1)) {
danielashercohen 0:36eee45709c8 58 option++;
danielashercohen 0:36eee45709c8 59 } else {
danielashercohen 0:36eee45709c8 60 option = 0;
danielashercohen 0:36eee45709c8 61 }
danielashercohen 0:36eee45709c8 62 }
danielashercohen 0:36eee45709c8 63
danielashercohen 0:36eee45709c8 64 if (button == 1) {
danielashercohen 0:36eee45709c8 65 if (option > 0) {
danielashercohen 0:36eee45709c8 66 option--;
danielashercohen 0:36eee45709c8 67 } else {
danielashercohen 0:36eee45709c8 68 option = (NUM_OPTIONS-1);
danielashercohen 0:36eee45709c8 69 }
danielashercohen 0:36eee45709c8 70 }
danielashercohen 0:36eee45709c8 71
danielashercohen 0:36eee45709c8 72 switch (option) {
danielashercohen 0:36eee45709c8 73 case (0): // if volume option is selected change volume when button 1 and 2 are pressed
danielashercohen 0:36eee45709c8 74 if (button == 2) {
danielashercohen 3:8d3cc3488cd8 75 Preamp.decreaseVolume();
danielashercohen 0:36eee45709c8 76 }
danielashercohen 0:36eee45709c8 77 if (button == 3) {
danielashercohen 3:8d3cc3488cd8 78 Preamp.increaseVolume();
danielashercohen 0:36eee45709c8 79 }
danielashercohen 3:8d3cc3488cd8 80 displayWrite("Volume", Preamp.readVolume() );
danielashercohen 0:36eee45709c8 81 break;
danielashercohen 0:36eee45709c8 82 case (1): // manage the input - 1,2,3 are the standard single ended inputs
danielashercohen 3:8d3cc3488cd8 83 int input = Preamp.readInput();
danielashercohen 0:36eee45709c8 84 if (button == 2) {
danielashercohen 3:8d3cc3488cd8 85 input--;
danielashercohen 0:36eee45709c8 86 }
danielashercohen 0:36eee45709c8 87 if (button == 3) {
danielashercohen 3:8d3cc3488cd8 88 input++;
danielashercohen 0:36eee45709c8 89 }
danielashercohen 3:8d3cc3488cd8 90 Preamp.setInput(input);
danielashercohen 3:8d3cc3488cd8 91 displayWrite("Input", Preamp.readInput() );
danielashercohen 0:36eee45709c8 92 break;
danielashercohen 0:36eee45709c8 93 case (2): // manage the treble value
danielashercohen 0:36eee45709c8 94 if (button == 2) {
danielashercohen 3:8d3cc3488cd8 95 Preamp.decreaseTreble();
danielashercohen 0:36eee45709c8 96 }
danielashercohen 0:36eee45709c8 97 if (button == 3) {
danielashercohen 3:8d3cc3488cd8 98 Preamp.increaseTreble();
danielashercohen 0:36eee45709c8 99 }
danielashercohen 3:8d3cc3488cd8 100 displayWrite("Treble", Preamp.readTreble());
danielashercohen 0:36eee45709c8 101 break;
danielashercohen 0:36eee45709c8 102 case (3): // manage the middle value
danielashercohen 3:8d3cc3488cd8 103 displayWrite("Middle", 42);
danielashercohen 3:8d3cc3488cd8 104 break;
danielashercohen 3:8d3cc3488cd8 105 }
danielashercohen 3:8d3cc3488cd8 106 }
danielashercohen 3:8d3cc3488cd8 107 /*
danielashercohen 3:8d3cc3488cd8 108 case (3): // manage the middle value
danielashercohen 0:36eee45709c8 109 if (button == 2) {
danielashercohen 0:36eee45709c8 110 if (middle > -5) {
danielashercohen 0:36eee45709c8 111 middle--;
danielashercohen 0:36eee45709c8 112 }
danielashercohen 0:36eee45709c8 113 }
danielashercohen 0:36eee45709c8 114 if (button == 3) {
danielashercohen 0:36eee45709c8 115 if (middle < 5) {
danielashercohen 0:36eee45709c8 116 middle++;
danielashercohen 0:36eee45709c8 117 }
danielashercohen 0:36eee45709c8 118 }
danielashercohen 0:36eee45709c8 119 displayWrite("Middle", middle );
danielashercohen 0:36eee45709c8 120 break;
danielashercohen 0:36eee45709c8 121 case (4): // manage the bass value
danielashercohen 0:36eee45709c8 122 if (button == 2) {
danielashercohen 0:36eee45709c8 123 if (bass > -5) {
danielashercohen 0:36eee45709c8 124 bass--;
danielashercohen 0:36eee45709c8 125 }
danielashercohen 0:36eee45709c8 126 }
danielashercohen 0:36eee45709c8 127 if (button == 3) {
danielashercohen 0:36eee45709c8 128 if (bass < 5) {
danielashercohen 0:36eee45709c8 129 bass++;
danielashercohen 0:36eee45709c8 130 }
danielashercohen 0:36eee45709c8 131 }
danielashercohen 0:36eee45709c8 132 displayWrite("Bass", bass );
danielashercohen 0:36eee45709c8 133 break;
danielashercohen 0:36eee45709c8 134
danielashercohen 0:36eee45709c8 135 // Manage the attenuators
danielashercohen 0:36eee45709c8 136 case (5): // manage the atten_lf value
danielashercohen 0:36eee45709c8 137 if (button == 2) {
danielashercohen 0:36eee45709c8 138 if (atten_lf > 0) {
danielashercohen 0:36eee45709c8 139 atten_lf--;
danielashercohen 0:36eee45709c8 140 }
danielashercohen 0:36eee45709c8 141 }
danielashercohen 0:36eee45709c8 142 if (button == 3) {
danielashercohen 0:36eee45709c8 143 if (atten_lf < 11) {
danielashercohen 0:36eee45709c8 144 atten_lf++;
danielashercohen 0:36eee45709c8 145 }
danielashercohen 0:36eee45709c8 146 }
danielashercohen 0:36eee45709c8 147 displayWrite("LF", atten_lf );
danielashercohen 0:36eee45709c8 148 break;
danielashercohen 0:36eee45709c8 149 case (6): // manage the atten_rf value
danielashercohen 0:36eee45709c8 150 if (button == 2) {
danielashercohen 0:36eee45709c8 151 if (atten_rf > 0) {
danielashercohen 0:36eee45709c8 152 atten_rf--;
danielashercohen 0:36eee45709c8 153 }
danielashercohen 0:36eee45709c8 154 }
danielashercohen 0:36eee45709c8 155 if (button == 3) {
danielashercohen 0:36eee45709c8 156 if (atten_rf < 11) {
danielashercohen 0:36eee45709c8 157 atten_rf++;
danielashercohen 0:36eee45709c8 158 }
danielashercohen 0:36eee45709c8 159 }
danielashercohen 0:36eee45709c8 160 displayWrite("RF", atten_rf );
danielashercohen 0:36eee45709c8 161 break;
danielashercohen 0:36eee45709c8 162 case (7): // manage the atten_lr value
danielashercohen 0:36eee45709c8 163 if (button == 2) {
danielashercohen 0:36eee45709c8 164 if (atten_lr > 0) {
danielashercohen 0:36eee45709c8 165 atten_lr--;
danielashercohen 0:36eee45709c8 166 }
danielashercohen 0:36eee45709c8 167 }
danielashercohen 0:36eee45709c8 168 if (button == 3) {
danielashercohen 0:36eee45709c8 169 if (atten_lr < 11) {
danielashercohen 0:36eee45709c8 170 atten_lr++;
danielashercohen 0:36eee45709c8 171 }
danielashercohen 0:36eee45709c8 172 }
danielashercohen 0:36eee45709c8 173 displayWrite("LR", atten_lr );
danielashercohen 0:36eee45709c8 174 break;
danielashercohen 0:36eee45709c8 175 case (8): // manage the atten_rr value
danielashercohen 0:36eee45709c8 176 if (button == 2) {
danielashercohen 0:36eee45709c8 177 if (atten_rr > 0) {
danielashercohen 0:36eee45709c8 178 atten_rr--;
danielashercohen 0:36eee45709c8 179 }
danielashercohen 0:36eee45709c8 180 }
danielashercohen 0:36eee45709c8 181 if (button == 3) {
danielashercohen 0:36eee45709c8 182 if (atten_rr < 11) {
danielashercohen 0:36eee45709c8 183 atten_rr++;
danielashercohen 0:36eee45709c8 184 }
danielashercohen 0:36eee45709c8 185 }
danielashercohen 0:36eee45709c8 186 displayWrite("RR", atten_rr );
danielashercohen 0:36eee45709c8 187 break;
danielashercohen 0:36eee45709c8 188 case (9): // manage the atten_mix value
danielashercohen 0:36eee45709c8 189 if (button == 2) {
danielashercohen 0:36eee45709c8 190 if (atten_mix > 0) {
danielashercohen 0:36eee45709c8 191 atten_mix--;
danielashercohen 0:36eee45709c8 192 }
danielashercohen 0:36eee45709c8 193 }
danielashercohen 0:36eee45709c8 194 if (button == 3) {
danielashercohen 0:36eee45709c8 195 if (atten_mix < 11) {
danielashercohen 0:36eee45709c8 196 atten_mix++;
danielashercohen 0:36eee45709c8 197 }
danielashercohen 0:36eee45709c8 198 }
danielashercohen 0:36eee45709c8 199 displayWrite("Mix", atten_mix );
danielashercohen 0:36eee45709c8 200 break;
danielashercohen 0:36eee45709c8 201 case (10): // manage the atten_sub value
danielashercohen 0:36eee45709c8 202 if (button == 2) {
danielashercohen 0:36eee45709c8 203 if (atten_sub > 0) {
danielashercohen 0:36eee45709c8 204 atten_sub--;
danielashercohen 0:36eee45709c8 205 }
danielashercohen 0:36eee45709c8 206 }
danielashercohen 0:36eee45709c8 207 if (button == 3) {
danielashercohen 0:36eee45709c8 208 if (atten_sub < 11) {
danielashercohen 0:36eee45709c8 209 atten_sub++;
danielashercohen 0:36eee45709c8 210 }
danielashercohen 0:36eee45709c8 211 }
danielashercohen 0:36eee45709c8 212 displayWrite("SUB", atten_sub );
danielashercohen 0:36eee45709c8 213 break;
danielashercohen 0:36eee45709c8 214 case (11): // manage the atten_sub value
danielashercohen 0:36eee45709c8 215 if (button == 2) {
danielashercohen 0:36eee45709c8 216 mix = 0;
danielashercohen 0:36eee45709c8 217 }
danielashercohen 0:36eee45709c8 218 if (button == 3) {
danielashercohen 0:36eee45709c8 219 mix = 1;
danielashercohen 0:36eee45709c8 220 }
danielashercohen 0:36eee45709c8 221 displayWrite("Mix", mix );
danielashercohen 0:36eee45709c8 222 break;
danielashercohen 0:36eee45709c8 223
danielashercohen 0:36eee45709c8 224 }
danielashercohen 0:36eee45709c8 225 }
danielashercohen 3:8d3cc3488cd8 226 */
danielashercohen 0:36eee45709c8 227
danielashercohen 0:36eee45709c8 228 void UpPressed( void )
danielashercohen 0:36eee45709c8 229 {
danielashercohen 0:36eee45709c8 230 processButtonPress(0);
danielashercohen 0:36eee45709c8 231 }
danielashercohen 0:36eee45709c8 232
danielashercohen 0:36eee45709c8 233 void LeftPressed( void )
danielashercohen 0:36eee45709c8 234 {
danielashercohen 0:36eee45709c8 235 processButtonPress(2);
danielashercohen 0:36eee45709c8 236 }
danielashercohen 0:36eee45709c8 237
danielashercohen 0:36eee45709c8 238 void RightPressed( void )
danielashercohen 0:36eee45709c8 239 {
danielashercohen 0:36eee45709c8 240 processButtonPress(3);
danielashercohen 0:36eee45709c8 241 }
danielashercohen 0:36eee45709c8 242
danielashercohen 0:36eee45709c8 243 void DownPressed( void )
danielashercohen 0:36eee45709c8 244 {
danielashercohen 0:36eee45709c8 245 processButtonPress(1);
danielashercohen 0:36eee45709c8 246 }
danielashercohen 0:36eee45709c8 247
danielashercohen 0:36eee45709c8 248 int main()
danielashercohen 0:36eee45709c8 249 {
danielashercohen 0:36eee45709c8 250 PinUp .mode( PullUp );
danielashercohen 0:36eee45709c8 251 PinLeft .mode( PullUp );
danielashercohen 0:36eee45709c8 252 PinRight.mode( PullUp );
danielashercohen 0:36eee45709c8 253 PinDown .mode( PullUp );
danielashercohen 0:36eee45709c8 254
danielashercohen 0:36eee45709c8 255 PinUp .attach_asserted( &UpPressed );
danielashercohen 0:36eee45709c8 256 PinLeft .attach_asserted( &LeftPressed );
danielashercohen 0:36eee45709c8 257 PinRight.attach_asserted( &RightPressed );
danielashercohen 0:36eee45709c8 258 PinDown .attach_asserted( &DownPressed );
danielashercohen 0:36eee45709c8 259
danielashercohen 1:f5b8687f67b8 260 display.clearDisplay();
danielashercohen 1:f5b8687f67b8 261 // draw multiple rectangles
danielashercohen 1:f5b8687f67b8 262 testfillrect();
danielashercohen 1:f5b8687f67b8 263 wait(0.5);
danielashercohen 1:f5b8687f67b8 264 display.display();
danielashercohen 1:f5b8687f67b8 265 display.clearDisplay();
danielashercohen 1:f5b8687f67b8 266 display.display();
danielashercohen 1:f5b8687f67b8 267
danielashercohen 0:36eee45709c8 268
danielashercohen 0:36eee45709c8 269 // Sampling does not begin until you set a frequency.
danielashercohen 0:36eee45709c8 270 // The default is 20ms. If you want a different frequency
danielashercohen 0:36eee45709c8 271 // then pass the period in microseconds for example, for 10ms :-
danielashercohen 0:36eee45709c8 272 // pin.setSampleFrequency( 10000 );
danielashercohen 0:36eee45709c8 273 //
danielashercohen 3:8d3cc3488cd8 274 PinUp .setSampleFrequency(10000); // Defaults to 20ms.
danielashercohen 3:8d3cc3488cd8 275 PinLeft .setSampleFrequency(10000); // Defaults to 20ms.
danielashercohen 3:8d3cc3488cd8 276 PinRight.setSampleFrequency(10000); // Defaults to 20ms.
danielashercohen 3:8d3cc3488cd8 277 PinDown .setSampleFrequency(10000); // Defaults to 20ms.
danielashercohen 0:36eee45709c8 278
danielashercohen 3:8d3cc3488cd8 279 // option = NUM_OPTIONS;
danielashercohen 1:f5b8687f67b8 280 processButtonPress(0);
danielashercohen 1:f5b8687f67b8 281
danielashercohen 0:36eee45709c8 282 while (1) {
danielashercohen 3:8d3cc3488cd8 283 wait(0.2);
danielashercohen 0:36eee45709c8 284 }
danielashercohen 0:36eee45709c8 285
danielashercohen 0:36eee45709c8 286 }
danielashercohen 0:36eee45709c8 287
danielashercohen 0:36eee45709c8 288 // EOF