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@3:8d3cc3488cd8, 2014-10-20 (annotated)
- 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?
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 | 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 |