ece 4180 project 2019
Dependencies: mbed wave_player mbed-rtos 4DGL-uLCD-SE SDFileSystem FATFileSystem
Diff: main.cpp
- Revision:
- 2:270569d33ef1
- Parent:
- 1:549f56cb4740
- Child:
- 3:221fb009c1ac
--- a/main.cpp Mon Apr 15 20:17:08 2019 +0000 +++ b/main.cpp Sat Apr 20 19:09:27 2019 +0000 @@ -20,24 +20,28 @@ PwmOut _greenpin; PwmOut _bluepin; }; - + RGBLed::RGBLed (PinName redpin, PinName greenpin, PinName bluepin) : _redpin(redpin), _greenpin(greenpin), _bluepin(bluepin) { //50Hz PWM clock default a bit too low, go to 2000Hz (less flicker) _redpin.period(0.0005); } - + void RGBLed::write(float red,float green, float blue) { _redpin = red; _greenpin = green; _bluepin = blue; } - + //Setup RGB led using PWM pins and class RGBLed myRGBled(p21,p22,p23); //RGB PWM pins +//Bluetooth +Serial blue(p28,p27); +Serial pc(USBTX, USBRX); + DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); @@ -50,222 +54,319 @@ // constructor(i2c object, i2c address of the mpr121) Mpr121 mpr121(&i2c, Mpr121::ADD_VSS); -//SDFileSystem sd(p5, p6, p7, p8, "sd"); +SDFileSystem sd(p5, p6, p7, p8, "sd"); uLCD_4DGL uLCD(p13,p14,p11); -//AnalogOut DACout(p18); -//wave_player waver(&DACout); -//FILE *wave_file; +AnalogOut DACout(p18); +wave_player waver(&DACout); +FILE *wave_file; - int key_code; +Mutex stdio_mutex; + +int key_code; // Key hit/release interrupt routine -void fallInterrupt() { - key_code=0; - int i=0; - int value=mpr121.read(0x00); - value +=mpr121.read(0x01)<<8; - // LED demo mod - i=0; - // puts key number out to LEDs for demo - for (i=0; i<12; i++) { - if (((value>>i)&0x01)==1) key_code=i+1; - } - led4=key_code & 0x01; - led3=(key_code>>1) & 0x01; - led2=(key_code>>2) & 0x01; - led1=(key_code>>3) & 0x01; +void fallInterrupt() +{ + key_code=0; + int i=0; + int value=mpr121.read(0x00); + value +=mpr121.read(0x01)<<8; + // LED demo mod + i=0; + // puts key number out to LEDs for demo + for (i=0; i<12; i++) { + if (((value>>i)&0x01)==1) key_code=i+1; + } + led4=key_code & 0x01; + led3=(key_code>>1) & 0x01; + led2=(key_code>>2) & 0x01; + led1=(key_code>>3) & 0x01; } -void song1(void const *args) { - + +int songcode = -1; +int isplay = 0; +int islearn = 0; +float volume = 0.25; +int octave = 3; + + +void readblue() +{ + while(1) { + + char bnum = 0; + if (blue.readable()) { + if (blue.getc()=='!') { + if (blue.getc() == 'I') { + bnum = blue.getc(); + //button mode + if (bnum == 'B') { + bnum = blue.getc(); + //play song + if (bnum == '0') { + islearn = 0; + isplay = 1; + songcode = blue.getc() - '0'; + } + //learn song + if (bnum == '1') { + islearn = 1; + isplay = 0; + songcode = blue.getc() - '0'; + } + } + //seekbar mode + if (bnum == 'S') { + islearn = 0; + isplay = 0; + bnum = blue.getc(); + //octave change + if (bnum == '0') { + octave = blue.getc() - '0'; + } + //volume change + if (bnum == '1') { + //get tens digit first + int actualVol = blue.getc() - '0'; + actualVol *= 10; + //then get ones digit + actualVol += blue.getc() - '0'; + volume = (float)actualVol/(float)100; + } + } + } + } + } + pc.printf("bye\n"); + Thread::wait(200); + } } -int main() { -// SongPlayer mySpeaker(p25); -Speaker mySpeaker(p25); - interrupt.fall(&fallInterrupt); - interrupt.mode(PullUp); - -uLCD.printf("welcome :)"); -wait(2.0); -//uLCD.locate(3,3); -//uLCD.text_width(4); -//uLCD.text_height(4); -int song[14] = {1, 1,8,8,10,10,8,6,6,5,5,3,3,1}; -char note[14] = {'C','C','G','G','A','A','G','F','F','E','E','D','D','C'}; -int i= 0; - while (1) { - - if(true) { - //uLCD.printf("starting song"); - wait(1.0); - while(i <14) { - // uLCD.cls(); - uLCD.locate(3,3); - uLCD.text_width(4); - uLCD.text_height(4); - uLCD.printf("%s",note[i]); - - switch(key_code) //uses a case statement for each individual touch sensor - { - case 1: - mySpeaker.PlayNote(261.6256, 0.5, 0.5); - break; - case 2: - mySpeaker.PlayNote(277.1826, 0.5, 0.5); - break; - case 3: - mySpeaker.PlayNote(293.6648, 0.5, 0.5); - break; - case 4: - mySpeaker.PlayNote(311.1270, 0.5, 0.5); - break; - case 5: - mySpeaker.PlayNote(329.6276, 0.5, 0.5); - break; - case 6: - mySpeaker.PlayNote(349.2282, 0.5, 0.5); - break; - case 7: - mySpeaker.PlayNote(369.9944, 0.5, 0.5); - break; - case 8: - mySpeaker.PlayNote(391.9954, 0.5, 0.5); - break; - case 9: - mySpeaker.PlayNote(415.3047, 0.5, 0.5); - break; - case 10: - mySpeaker.PlayNote(440.0, 0.5, 0.5); - break; - case 11: - mySpeaker.PlayNote(466.1638, 0.5, 0.5); - break; - case 12: - mySpeaker.PlayNote(493.8833, 0.5, 0.5); - break; - } - - if(song[i]==key_code){ - myRGBled.write(0.0,1.0,0.0 ); - i++; - } else if (song[i] != key_code) { - myRGBled.write(1.0,0.0,0.0 ); - } else if (key_code == 0) { - myRGBled.write(0.0,1.0,0.0 ); - } +int main() +{ + + Speaker mySpeaker(p25); + interrupt.fall(&fallInterrupt); + interrupt.mode(PullUp); + uLCD.printf("welcome :)\n"); + wait(1.0); + uLCD.printf("Initializing...\n"); + wait(1.0); + uLCD.cls(); + + + int song[14] = {1, 1,8,8,10,10,8,6,6,5,5,3,3,1}; + char note[14] = {'C','C','G','G','A','A','G','F','F','E','E','D','D','C'}; + int i= 0; + Thread thread; + //thread.start(callback(readblue, (void *)"foo")); + thread.start(readblue); + + while (1) { + // check blutooth input + //readblue(); + + //char bnum = 0; +// char bnum1 = 0; +// char bnum +// bnum = blue.getc(); + if(false) { + uLCD.printf("starting \nTwinkle Twinkle \nLittle Star"); + wait(4.0); + uLCD.cls(); + while(i <14) { + uLCD.text_width(3); + uLCD.text_height(3); + uLCD.locate(2,2); + + uLCD.printf("%c",note[i]); + + if(song[i]==key_code) { + myRGBled.write(0.0,1.0,0.0 ); + uLCD.cls(); + i++; + } else if (song[i] != key_code && key_code != 0) { + myRGBled.write(1.0,0.0,0.0 ); + } else if (key_code == 0) { + myRGBled.write(0.0,0.0,0.0 ); + } + + + + switch(key_code) { //uses a case statement for each individual touch sensor + + + case 1: + mySpeaker.PlayNote(261.6256, 0.5, volume); + break; + case 2: + mySpeaker.PlayNote(277.1826, 0.5, volume); + break; + case 3: + mySpeaker.PlayNote(293.6648, 0.5, volume); + break; + case 4: + mySpeaker.PlayNote(311.1270, 0.5, volume); + break; + case 5: + mySpeaker.PlayNote(329.6276, 0.5, volume); + break; + case 6: + mySpeaker.PlayNote(349.2282, 0.5, volume); + break; + case 7: + mySpeaker.PlayNote(369.9944, 0.5, volume); + break; + case 8: + mySpeaker.PlayNote(391.9954, 0.5, volume); + break; + case 9: + mySpeaker.PlayNote(415.3047, 0.5, volume); + break; + case 10: + mySpeaker.PlayNote(440.0, 0.5, volume); + break; + case 11: + mySpeaker.PlayNote(466.1638, 0.5, volume); + break; + case 12: + mySpeaker.PlayNote(493.8833, 0.5, volume); + break; + } + + + } + i = 0; + uLCD.printf("Congratulations! \nYou learned \nTwinkle Twinkle \nLittle Star"); + wait(4.0); + uLCD.cls(); + } else if(false) { + uLCD.printf("Playing song"); + wait(2.0); + wave_file=fopen("/sd/songs/mary.wav","r"); + waver.play(wave_file); + fclose(wave_file); +// wave_file=fopen("/sd/wavfiles/imperial_march.wav","r"); +// waver.play(wave_file); +// fclose(wave_file); } - i = 0; - - } else { - switch(key_code) //uses a case statement for each individual touch sensor - { - case 1: - uLCD.cls(); - uLCD.locate(6,6); - uLCD.text_width(5); - uLCD.text_height(5); - uLCD.printf("C"); - //printf("%d", key_code); - myRGBled.write(0.0,0.0,1.0 ); -// wave_file=fopen("/sd/wavfiles/imperial_march.wav","r"); -// waver.play(wave_file); -// fclose(wave_file); - mySpeaker.PlayNote(261.6256, 0.5, 0.5); - break; - case 2: - uLCD.cls(); - uLCD.locate(6,6); - uLCD.text_width(5); - uLCD.text_height(5); - uLCD.printf("CS"); - myRGBled.write(1.0,0.0,0.0 ); - mySpeaker.PlayNote(277.1826, 0.5, 0.5); - break; - case 3: - uLCD.cls(); - uLCD.locate(6,6); - uLCD.text_width(5); - uLCD.text_height(5); - uLCD.printf("D"); - myRGBled.write(0.0,1.0,0.0 ); - mySpeaker.PlayNote(293.6648, 0.5, 0.5); - break; - case 4: - uLCD.cls(); - uLCD.locate(6,6); - uLCD.text_width(5); - uLCD.text_height(5); - uLCD.printf("DS"); - mySpeaker.PlayNote(311.1270, 0.5, 0.5); - break; - case 5: - uLCD.cls(); - uLCD.locate(6,6); - uLCD.text_width(5); - uLCD.text_height(5); - uLCD.printf("E"); - mySpeaker.PlayNote(329.6276, 0.5, 0.5); - break; - case 6: - uLCD.cls(); - uLCD.locate(6,6); - uLCD.text_width(5); - uLCD.text_height(5); - uLCD.printf("F"); - mySpeaker.PlayNote(349.2282, 0.5, 0.5); - break; - case 7: - uLCD.cls(); - uLCD.locate(6,6); - uLCD.text_width(5); - uLCD.text_height(5); - uLCD.printf("FS"); - mySpeaker.PlayNote(369.9944, 0.5, 0.5); - break; - case 8: - uLCD.cls(); - uLCD.locate(6,6); - uLCD.text_width(5); - uLCD.text_height(5); - uLCD.printf("G"); - mySpeaker.PlayNote(391.9954, 0.5, 0.5); - break; - case 9: - uLCD.cls(); - uLCD.locate(6,6); - uLCD.text_width(5); - uLCD.text_height(5); - uLCD.printf("GS"); - mySpeaker.PlayNote(415.3047, 0.5, 0.5); - break; - case 10: - uLCD.cls(); - uLCD.locate(6,6); - uLCD.text_width(5); - uLCD.text_height(5); - uLCD.printf("A"); - mySpeaker.PlayNote(440.0, 0.5, 0.5); - break; - case 11: - uLCD.cls(); - uLCD.locate(6,6); - uLCD.text_width(5); - uLCD.text_height(5); - uLCD.printf("AS"); - mySpeaker.PlayNote(466.1638, 0.5, 0.5); - break; - case 12: - uLCD.cls(); - uLCD.locate(6,6); - uLCD.text_width(5); - uLCD.text_height(5); - uLCD.printf("B"); - mySpeaker.PlayNote(493.8833, 0.5, 0.5); - break; - } - } + + else { + + + switch(key_code) { //uses a case statement for each individual touch sensor + case 1: + uLCD.cls(); + uLCD.locate(6,6); + uLCD.text_width(5); + uLCD.text_height(5); + uLCD.printf("C"); + //printf("%d", key_code); + + myRGBled.write(0.0,0.0,1.0 ); +// wave_file=fopen("/sd/songs/mary.wav","r"); +// if(wave_file==NULL) printf("file open error!\n\n\r"); +// printf("test"); +// waver.play(wave_file); +// fclose(wave_file); + mySpeaker.PlayNote(261.6256, 0.5, volume); + pc.printf("hello\n"); + break; + case 2: + uLCD.cls(); + uLCD.locate(6,6); + uLCD.text_width(5); + uLCD.text_height(5); + uLCD.printf("CS"); + myRGBled.write(1.0,0.0,0.0 ); + mySpeaker.PlayNote(277.1826, 0.5, volume); + break; + case 3: + uLCD.cls(); + uLCD.locate(6,6); + uLCD.text_width(5); + uLCD.text_height(5); + uLCD.printf("D"); + myRGBled.write(0.0,1.0,0.0 ); + mySpeaker.PlayNote(293.6648, 0.5, volume); + break; + case 4: + uLCD.cls(); + uLCD.locate(6,6); + uLCD.text_width(5); + uLCD.text_height(5); + uLCD.printf("DS"); + mySpeaker.PlayNote(311.1270, 0.5, volume); + break; + case 5: + uLCD.cls(); + uLCD.locate(6,6); + uLCD.text_width(5); + uLCD.text_height(5); + uLCD.printf("E"); + mySpeaker.PlayNote(329.6276, 0.5, volume); + break; + case 6: + uLCD.cls(); + uLCD.locate(6,6); + uLCD.text_width(5); + uLCD.text_height(5); + uLCD.printf("F"); + mySpeaker.PlayNote(349.2282, 0.5, volume); + break; + case 7: + uLCD.cls(); + uLCD.locate(6,6); + uLCD.text_width(5); + uLCD.text_height(5); + uLCD.printf("FS"); + mySpeaker.PlayNote(369.9944, 0.5, volume); + break; + case 8: + uLCD.cls(); + uLCD.locate(6,6); + uLCD.text_width(5); + uLCD.text_height(5); + uLCD.printf("G"); + mySpeaker.PlayNote(391.9954, 0.5, volume); + break; + case 9: + uLCD.cls(); + uLCD.locate(6,6); + uLCD.text_width(5); + uLCD.text_height(5); + uLCD.printf("GS"); + mySpeaker.PlayNote(415.3047, 0.5, volume); + break; + case 10: + uLCD.cls(); + uLCD.locate(6,6); + uLCD.text_width(5); + uLCD.text_height(5); + uLCD.printf("A"); + mySpeaker.PlayNote(440.0, 0.5, volume); + break; + case 11: + uLCD.cls(); + uLCD.locate(6,6); + uLCD.text_width(5); + uLCD.text_height(5); + uLCD.printf("AS"); + mySpeaker.PlayNote(466.1638, 0.5, volume); + break; + case 12: + uLCD.cls(); + uLCD.locate(6,6); + uLCD.text_width(5); + uLCD.text_height(5); + uLCD.printf("B"); + mySpeaker.PlayNote(493.8833, 0.5, volume); + break; + } + } + Thread::wait(200); } }