ece 4180 project 2019
Dependencies: mbed wave_player mbed-rtos 4DGL-uLCD-SE SDFileSystem FATFileSystem
main.cpp@1:549f56cb4740, 2019-04-15 (annotated)
- Committer:
- rhuang77
- Date:
- Mon Apr 15 20:17:08 2019 +0000
- Revision:
- 1:549f56cb4740
- Parent:
- 0:567492543056
- Child:
- 2:270569d33ef1
new and improved
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rhuang77 | 0:567492543056 | 1 | #include <mbed.h> |
rhuang77 | 0:567492543056 | 2 | #include <mpr121.h> |
rhuang77 | 0:567492543056 | 3 | #include "mbed.h" |
rhuang77 | 0:567492543056 | 4 | #include "uLCD_4DGL.h" |
rhuang77 | 0:567492543056 | 5 | #include "SDFileSystem.h" |
rhuang77 | 0:567492543056 | 6 | #include "FATFileSystem.h" |
rhuang77 | 0:567492543056 | 7 | #include "wave_player.h" |
rhuang77 | 0:567492543056 | 8 | #include <stdio.h> |
rhuang77 | 0:567492543056 | 9 | #include "Speaker.h" |
rhuang77 | 1:549f56cb4740 | 10 | #include "rtos.h" |
rhuang77 | 1:549f56cb4740 | 11 | |
rhuang77 | 1:549f56cb4740 | 12 | //Class to control an RGB LED using three PWM pins |
rhuang77 | 1:549f56cb4740 | 13 | class RGBLed |
rhuang77 | 1:549f56cb4740 | 14 | { |
rhuang77 | 1:549f56cb4740 | 15 | public: |
rhuang77 | 1:549f56cb4740 | 16 | RGBLed(PinName redpin, PinName greenpin, PinName bluepin); |
rhuang77 | 1:549f56cb4740 | 17 | void write(float red,float green, float blue); |
rhuang77 | 1:549f56cb4740 | 18 | private: |
rhuang77 | 1:549f56cb4740 | 19 | PwmOut _redpin; |
rhuang77 | 1:549f56cb4740 | 20 | PwmOut _greenpin; |
rhuang77 | 1:549f56cb4740 | 21 | PwmOut _bluepin; |
rhuang77 | 1:549f56cb4740 | 22 | }; |
rhuang77 | 1:549f56cb4740 | 23 | |
rhuang77 | 1:549f56cb4740 | 24 | RGBLed::RGBLed (PinName redpin, PinName greenpin, PinName bluepin) |
rhuang77 | 1:549f56cb4740 | 25 | : _redpin(redpin), _greenpin(greenpin), _bluepin(bluepin) |
rhuang77 | 1:549f56cb4740 | 26 | { |
rhuang77 | 1:549f56cb4740 | 27 | //50Hz PWM clock default a bit too low, go to 2000Hz (less flicker) |
rhuang77 | 1:549f56cb4740 | 28 | _redpin.period(0.0005); |
rhuang77 | 1:549f56cb4740 | 29 | } |
rhuang77 | 1:549f56cb4740 | 30 | |
rhuang77 | 1:549f56cb4740 | 31 | void RGBLed::write(float red,float green, float blue) |
rhuang77 | 1:549f56cb4740 | 32 | { |
rhuang77 | 1:549f56cb4740 | 33 | _redpin = red; |
rhuang77 | 1:549f56cb4740 | 34 | _greenpin = green; |
rhuang77 | 1:549f56cb4740 | 35 | _bluepin = blue; |
rhuang77 | 1:549f56cb4740 | 36 | } |
rhuang77 | 1:549f56cb4740 | 37 | |
rhuang77 | 1:549f56cb4740 | 38 | //Setup RGB led using PWM pins and class |
rhuang77 | 1:549f56cb4740 | 39 | RGBLed myRGBled(p21,p22,p23); //RGB PWM pins |
rhuang77 | 1:549f56cb4740 | 40 | |
rhuang77 | 0:567492543056 | 41 | DigitalOut led1(LED1); |
rhuang77 | 0:567492543056 | 42 | DigitalOut led2(LED2); |
rhuang77 | 0:567492543056 | 43 | DigitalOut led3(LED3); |
rhuang77 | 0:567492543056 | 44 | DigitalOut led4(LED4); |
rhuang77 | 0:567492543056 | 45 | // Create the interrupt receiver object on pin 26 |
rhuang77 | 0:567492543056 | 46 | InterruptIn interrupt(p26); |
rhuang77 | 0:567492543056 | 47 | // Setup the i2c bus on pins 9 and 10 |
rhuang77 | 0:567492543056 | 48 | I2C i2c(p9, p10); |
rhuang77 | 0:567492543056 | 49 | // Setup the Mpr121: |
rhuang77 | 0:567492543056 | 50 | // constructor(i2c object, i2c address of the mpr121) |
rhuang77 | 0:567492543056 | 51 | Mpr121 mpr121(&i2c, Mpr121::ADD_VSS); |
rhuang77 | 0:567492543056 | 52 | |
rhuang77 | 1:549f56cb4740 | 53 | //SDFileSystem sd(p5, p6, p7, p8, "sd"); |
rhuang77 | 1:549f56cb4740 | 54 | uLCD_4DGL uLCD(p13,p14,p11); |
rhuang77 | 0:567492543056 | 55 | |
rhuang77 | 1:549f56cb4740 | 56 | //AnalogOut DACout(p18); |
rhuang77 | 1:549f56cb4740 | 57 | //wave_player waver(&DACout); |
rhuang77 | 1:549f56cb4740 | 58 | //FILE *wave_file; |
rhuang77 | 0:567492543056 | 59 | |
rhuang77 | 1:549f56cb4740 | 60 | int key_code; |
rhuang77 | 1:549f56cb4740 | 61 | // Key hit/release interrupt routine |
rhuang77 | 0:567492543056 | 62 | void fallInterrupt() { |
rhuang77 | 1:549f56cb4740 | 63 | key_code=0; |
rhuang77 | 0:567492543056 | 64 | int i=0; |
rhuang77 | 0:567492543056 | 65 | int value=mpr121.read(0x00); |
rhuang77 | 0:567492543056 | 66 | value +=mpr121.read(0x01)<<8; |
rhuang77 | 0:567492543056 | 67 | // LED demo mod |
rhuang77 | 0:567492543056 | 68 | i=0; |
rhuang77 | 0:567492543056 | 69 | // puts key number out to LEDs for demo |
rhuang77 | 0:567492543056 | 70 | for (i=0; i<12; i++) { |
rhuang77 | 1:549f56cb4740 | 71 | if (((value>>i)&0x01)==1) key_code=i+1; |
rhuang77 | 0:567492543056 | 72 | } |
rhuang77 | 0:567492543056 | 73 | led4=key_code & 0x01; |
rhuang77 | 0:567492543056 | 74 | led3=(key_code>>1) & 0x01; |
rhuang77 | 0:567492543056 | 75 | led2=(key_code>>2) & 0x01; |
rhuang77 | 0:567492543056 | 76 | led1=(key_code>>3) & 0x01; |
rhuang77 | 0:567492543056 | 77 | } |
rhuang77 | 1:549f56cb4740 | 78 | |
rhuang77 | 1:549f56cb4740 | 79 | void song1(void const *args) { |
rhuang77 | 1:549f56cb4740 | 80 | |
rhuang77 | 1:549f56cb4740 | 81 | } |
rhuang77 | 1:549f56cb4740 | 82 | |
rhuang77 | 0:567492543056 | 83 | int main() { |
rhuang77 | 1:549f56cb4740 | 84 | // SongPlayer mySpeaker(p25); |
rhuang77 | 1:549f56cb4740 | 85 | Speaker mySpeaker(p25); |
rhuang77 | 0:567492543056 | 86 | interrupt.fall(&fallInterrupt); |
rhuang77 | 0:567492543056 | 87 | interrupt.mode(PullUp); |
rhuang77 | 1:549f56cb4740 | 88 | |
rhuang77 | 1:549f56cb4740 | 89 | uLCD.printf("welcome :)"); |
rhuang77 | 1:549f56cb4740 | 90 | wait(2.0); |
rhuang77 | 1:549f56cb4740 | 91 | //uLCD.locate(3,3); |
rhuang77 | 1:549f56cb4740 | 92 | //uLCD.text_width(4); |
rhuang77 | 1:549f56cb4740 | 93 | //uLCD.text_height(4); |
rhuang77 | 1:549f56cb4740 | 94 | int song[14] = {1, 1,8,8,10,10,8,6,6,5,5,3,3,1}; |
rhuang77 | 1:549f56cb4740 | 95 | char note[14] = {'C','C','G','G','A','A','G','F','F','E','E','D','D','C'}; |
rhuang77 | 1:549f56cb4740 | 96 | int i= 0; |
rhuang77 | 1:549f56cb4740 | 97 | while (1) { |
rhuang77 | 1:549f56cb4740 | 98 | |
rhuang77 | 1:549f56cb4740 | 99 | if(true) { |
rhuang77 | 1:549f56cb4740 | 100 | //uLCD.printf("starting song"); |
rhuang77 | 1:549f56cb4740 | 101 | wait(1.0); |
rhuang77 | 1:549f56cb4740 | 102 | while(i <14) { |
rhuang77 | 1:549f56cb4740 | 103 | // uLCD.cls(); |
rhuang77 | 1:549f56cb4740 | 104 | uLCD.locate(3,3); |
rhuang77 | 1:549f56cb4740 | 105 | uLCD.text_width(4); |
rhuang77 | 1:549f56cb4740 | 106 | uLCD.text_height(4); |
rhuang77 | 1:549f56cb4740 | 107 | uLCD.printf("%s",note[i]); |
rhuang77 | 1:549f56cb4740 | 108 | |
rhuang77 | 1:549f56cb4740 | 109 | switch(key_code) //uses a case statement for each individual touch sensor |
rhuang77 | 1:549f56cb4740 | 110 | { |
rhuang77 | 1:549f56cb4740 | 111 | case 1: |
rhuang77 | 1:549f56cb4740 | 112 | mySpeaker.PlayNote(261.6256, 0.5, 0.5); |
rhuang77 | 1:549f56cb4740 | 113 | break; |
rhuang77 | 1:549f56cb4740 | 114 | case 2: |
rhuang77 | 1:549f56cb4740 | 115 | mySpeaker.PlayNote(277.1826, 0.5, 0.5); |
rhuang77 | 1:549f56cb4740 | 116 | break; |
rhuang77 | 1:549f56cb4740 | 117 | case 3: |
rhuang77 | 1:549f56cb4740 | 118 | mySpeaker.PlayNote(293.6648, 0.5, 0.5); |
rhuang77 | 1:549f56cb4740 | 119 | break; |
rhuang77 | 1:549f56cb4740 | 120 | case 4: |
rhuang77 | 1:549f56cb4740 | 121 | mySpeaker.PlayNote(311.1270, 0.5, 0.5); |
rhuang77 | 1:549f56cb4740 | 122 | break; |
rhuang77 | 1:549f56cb4740 | 123 | case 5: |
rhuang77 | 1:549f56cb4740 | 124 | mySpeaker.PlayNote(329.6276, 0.5, 0.5); |
rhuang77 | 1:549f56cb4740 | 125 | break; |
rhuang77 | 1:549f56cb4740 | 126 | case 6: |
rhuang77 | 1:549f56cb4740 | 127 | mySpeaker.PlayNote(349.2282, 0.5, 0.5); |
rhuang77 | 1:549f56cb4740 | 128 | break; |
rhuang77 | 1:549f56cb4740 | 129 | case 7: |
rhuang77 | 1:549f56cb4740 | 130 | mySpeaker.PlayNote(369.9944, 0.5, 0.5); |
rhuang77 | 1:549f56cb4740 | 131 | break; |
rhuang77 | 1:549f56cb4740 | 132 | case 8: |
rhuang77 | 1:549f56cb4740 | 133 | mySpeaker.PlayNote(391.9954, 0.5, 0.5); |
rhuang77 | 1:549f56cb4740 | 134 | break; |
rhuang77 | 1:549f56cb4740 | 135 | case 9: |
rhuang77 | 1:549f56cb4740 | 136 | mySpeaker.PlayNote(415.3047, 0.5, 0.5); |
rhuang77 | 1:549f56cb4740 | 137 | break; |
rhuang77 | 1:549f56cb4740 | 138 | case 10: |
rhuang77 | 1:549f56cb4740 | 139 | mySpeaker.PlayNote(440.0, 0.5, 0.5); |
rhuang77 | 1:549f56cb4740 | 140 | break; |
rhuang77 | 1:549f56cb4740 | 141 | case 11: |
rhuang77 | 1:549f56cb4740 | 142 | mySpeaker.PlayNote(466.1638, 0.5, 0.5); |
rhuang77 | 1:549f56cb4740 | 143 | break; |
rhuang77 | 1:549f56cb4740 | 144 | case 12: |
rhuang77 | 1:549f56cb4740 | 145 | mySpeaker.PlayNote(493.8833, 0.5, 0.5); |
rhuang77 | 1:549f56cb4740 | 146 | break; |
rhuang77 | 1:549f56cb4740 | 147 | } |
rhuang77 | 1:549f56cb4740 | 148 | |
rhuang77 | 1:549f56cb4740 | 149 | if(song[i]==key_code){ |
rhuang77 | 1:549f56cb4740 | 150 | myRGBled.write(0.0,1.0,0.0 ); |
rhuang77 | 1:549f56cb4740 | 151 | i++; |
rhuang77 | 1:549f56cb4740 | 152 | } else if (song[i] != key_code) { |
rhuang77 | 1:549f56cb4740 | 153 | myRGBled.write(1.0,0.0,0.0 ); |
rhuang77 | 1:549f56cb4740 | 154 | } else if (key_code == 0) { |
rhuang77 | 1:549f56cb4740 | 155 | myRGBled.write(0.0,1.0,0.0 ); |
rhuang77 | 1:549f56cb4740 | 156 | } |
rhuang77 | 0:567492543056 | 157 | |
rhuang77 | 1:549f56cb4740 | 158 | } |
rhuang77 | 1:549f56cb4740 | 159 | i = 0; |
rhuang77 | 1:549f56cb4740 | 160 | |
rhuang77 | 1:549f56cb4740 | 161 | } else { |
rhuang77 | 1:549f56cb4740 | 162 | switch(key_code) //uses a case statement for each individual touch sensor |
rhuang77 | 1:549f56cb4740 | 163 | { |
rhuang77 | 1:549f56cb4740 | 164 | case 1: |
rhuang77 | 1:549f56cb4740 | 165 | uLCD.cls(); |
rhuang77 | 1:549f56cb4740 | 166 | uLCD.locate(6,6); |
rhuang77 | 1:549f56cb4740 | 167 | uLCD.text_width(5); |
rhuang77 | 1:549f56cb4740 | 168 | uLCD.text_height(5); |
rhuang77 | 1:549f56cb4740 | 169 | uLCD.printf("C"); |
rhuang77 | 1:549f56cb4740 | 170 | //printf("%d", key_code); |
rhuang77 | 1:549f56cb4740 | 171 | myRGBled.write(0.0,0.0,1.0 ); |
rhuang77 | 1:549f56cb4740 | 172 | // wave_file=fopen("/sd/wavfiles/imperial_march.wav","r"); |
rhuang77 | 1:549f56cb4740 | 173 | // waver.play(wave_file); |
rhuang77 | 1:549f56cb4740 | 174 | // fclose(wave_file); |
rhuang77 | 1:549f56cb4740 | 175 | mySpeaker.PlayNote(261.6256, 0.5, 0.5); |
rhuang77 | 1:549f56cb4740 | 176 | break; |
rhuang77 | 1:549f56cb4740 | 177 | case 2: |
rhuang77 | 1:549f56cb4740 | 178 | uLCD.cls(); |
rhuang77 | 1:549f56cb4740 | 179 | uLCD.locate(6,6); |
rhuang77 | 1:549f56cb4740 | 180 | uLCD.text_width(5); |
rhuang77 | 1:549f56cb4740 | 181 | uLCD.text_height(5); |
rhuang77 | 1:549f56cb4740 | 182 | uLCD.printf("CS"); |
rhuang77 | 1:549f56cb4740 | 183 | myRGBled.write(1.0,0.0,0.0 ); |
rhuang77 | 1:549f56cb4740 | 184 | mySpeaker.PlayNote(277.1826, 0.5, 0.5); |
rhuang77 | 1:549f56cb4740 | 185 | break; |
rhuang77 | 1:549f56cb4740 | 186 | case 3: |
rhuang77 | 1:549f56cb4740 | 187 | uLCD.cls(); |
rhuang77 | 1:549f56cb4740 | 188 | uLCD.locate(6,6); |
rhuang77 | 1:549f56cb4740 | 189 | uLCD.text_width(5); |
rhuang77 | 1:549f56cb4740 | 190 | uLCD.text_height(5); |
rhuang77 | 1:549f56cb4740 | 191 | uLCD.printf("D"); |
rhuang77 | 1:549f56cb4740 | 192 | myRGBled.write(0.0,1.0,0.0 ); |
rhuang77 | 1:549f56cb4740 | 193 | mySpeaker.PlayNote(293.6648, 0.5, 0.5); |
rhuang77 | 1:549f56cb4740 | 194 | break; |
rhuang77 | 1:549f56cb4740 | 195 | case 4: |
rhuang77 | 1:549f56cb4740 | 196 | uLCD.cls(); |
rhuang77 | 1:549f56cb4740 | 197 | uLCD.locate(6,6); |
rhuang77 | 1:549f56cb4740 | 198 | uLCD.text_width(5); |
rhuang77 | 1:549f56cb4740 | 199 | uLCD.text_height(5); |
rhuang77 | 1:549f56cb4740 | 200 | uLCD.printf("DS"); |
rhuang77 | 1:549f56cb4740 | 201 | mySpeaker.PlayNote(311.1270, 0.5, 0.5); |
rhuang77 | 1:549f56cb4740 | 202 | break; |
rhuang77 | 1:549f56cb4740 | 203 | case 5: |
rhuang77 | 1:549f56cb4740 | 204 | uLCD.cls(); |
rhuang77 | 1:549f56cb4740 | 205 | uLCD.locate(6,6); |
rhuang77 | 1:549f56cb4740 | 206 | uLCD.text_width(5); |
rhuang77 | 1:549f56cb4740 | 207 | uLCD.text_height(5); |
rhuang77 | 1:549f56cb4740 | 208 | uLCD.printf("E"); |
rhuang77 | 1:549f56cb4740 | 209 | mySpeaker.PlayNote(329.6276, 0.5, 0.5); |
rhuang77 | 1:549f56cb4740 | 210 | break; |
rhuang77 | 1:549f56cb4740 | 211 | case 6: |
rhuang77 | 1:549f56cb4740 | 212 | uLCD.cls(); |
rhuang77 | 1:549f56cb4740 | 213 | uLCD.locate(6,6); |
rhuang77 | 1:549f56cb4740 | 214 | uLCD.text_width(5); |
rhuang77 | 1:549f56cb4740 | 215 | uLCD.text_height(5); |
rhuang77 | 1:549f56cb4740 | 216 | uLCD.printf("F"); |
rhuang77 | 1:549f56cb4740 | 217 | mySpeaker.PlayNote(349.2282, 0.5, 0.5); |
rhuang77 | 1:549f56cb4740 | 218 | break; |
rhuang77 | 1:549f56cb4740 | 219 | case 7: |
rhuang77 | 1:549f56cb4740 | 220 | uLCD.cls(); |
rhuang77 | 1:549f56cb4740 | 221 | uLCD.locate(6,6); |
rhuang77 | 1:549f56cb4740 | 222 | uLCD.text_width(5); |
rhuang77 | 1:549f56cb4740 | 223 | uLCD.text_height(5); |
rhuang77 | 1:549f56cb4740 | 224 | uLCD.printf("FS"); |
rhuang77 | 1:549f56cb4740 | 225 | mySpeaker.PlayNote(369.9944, 0.5, 0.5); |
rhuang77 | 1:549f56cb4740 | 226 | break; |
rhuang77 | 1:549f56cb4740 | 227 | case 8: |
rhuang77 | 1:549f56cb4740 | 228 | uLCD.cls(); |
rhuang77 | 1:549f56cb4740 | 229 | uLCD.locate(6,6); |
rhuang77 | 1:549f56cb4740 | 230 | uLCD.text_width(5); |
rhuang77 | 1:549f56cb4740 | 231 | uLCD.text_height(5); |
rhuang77 | 1:549f56cb4740 | 232 | uLCD.printf("G"); |
rhuang77 | 1:549f56cb4740 | 233 | mySpeaker.PlayNote(391.9954, 0.5, 0.5); |
rhuang77 | 1:549f56cb4740 | 234 | break; |
rhuang77 | 1:549f56cb4740 | 235 | case 9: |
rhuang77 | 1:549f56cb4740 | 236 | uLCD.cls(); |
rhuang77 | 1:549f56cb4740 | 237 | uLCD.locate(6,6); |
rhuang77 | 1:549f56cb4740 | 238 | uLCD.text_width(5); |
rhuang77 | 1:549f56cb4740 | 239 | uLCD.text_height(5); |
rhuang77 | 1:549f56cb4740 | 240 | uLCD.printf("GS"); |
rhuang77 | 1:549f56cb4740 | 241 | mySpeaker.PlayNote(415.3047, 0.5, 0.5); |
rhuang77 | 1:549f56cb4740 | 242 | break; |
rhuang77 | 1:549f56cb4740 | 243 | case 10: |
rhuang77 | 1:549f56cb4740 | 244 | uLCD.cls(); |
rhuang77 | 1:549f56cb4740 | 245 | uLCD.locate(6,6); |
rhuang77 | 1:549f56cb4740 | 246 | uLCD.text_width(5); |
rhuang77 | 1:549f56cb4740 | 247 | uLCD.text_height(5); |
rhuang77 | 1:549f56cb4740 | 248 | uLCD.printf("A"); |
rhuang77 | 1:549f56cb4740 | 249 | mySpeaker.PlayNote(440.0, 0.5, 0.5); |
rhuang77 | 1:549f56cb4740 | 250 | break; |
rhuang77 | 1:549f56cb4740 | 251 | case 11: |
rhuang77 | 1:549f56cb4740 | 252 | uLCD.cls(); |
rhuang77 | 1:549f56cb4740 | 253 | uLCD.locate(6,6); |
rhuang77 | 1:549f56cb4740 | 254 | uLCD.text_width(5); |
rhuang77 | 1:549f56cb4740 | 255 | uLCD.text_height(5); |
rhuang77 | 1:549f56cb4740 | 256 | uLCD.printf("AS"); |
rhuang77 | 1:549f56cb4740 | 257 | mySpeaker.PlayNote(466.1638, 0.5, 0.5); |
rhuang77 | 1:549f56cb4740 | 258 | break; |
rhuang77 | 1:549f56cb4740 | 259 | case 12: |
rhuang77 | 1:549f56cb4740 | 260 | uLCD.cls(); |
rhuang77 | 1:549f56cb4740 | 261 | uLCD.locate(6,6); |
rhuang77 | 1:549f56cb4740 | 262 | uLCD.text_width(5); |
rhuang77 | 1:549f56cb4740 | 263 | uLCD.text_height(5); |
rhuang77 | 1:549f56cb4740 | 264 | uLCD.printf("B"); |
rhuang77 | 1:549f56cb4740 | 265 | mySpeaker.PlayNote(493.8833, 0.5, 0.5); |
rhuang77 | 1:549f56cb4740 | 266 | break; |
rhuang77 | 1:549f56cb4740 | 267 | } |
rhuang77 | 1:549f56cb4740 | 268 | } |
rhuang77 | 1:549f56cb4740 | 269 | } |
rhuang77 | 1:549f56cb4740 | 270 | } |
rhuang77 | 0:567492543056 | 271 | |
rhuang77 | 0:567492543056 | 272 | |
rhuang77 | 0:567492543056 | 273 |