Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed mbed-rtos 4DGL-uLCD-SE HC_SR04_Ultrasonic_Library
main.cpp@12:bebfef8d229f, 2020-04-24 (annotated)
- Committer:
- rmalik8
- Date:
- Fri Apr 24 05:27:31 2020 +0000
- Revision:
- 12:bebfef8d229f
- Parent:
- 11:f5d0c8bf1849
- Child:
- 13:3ba367bc16bc
added SongPlayer and sound thread - disabled waveplayer
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| mmarine3 | 2:1ec843c95914 | 1 | #include "mbed.h" |
| rmalik8 | 4:7d02b3f3bee6 | 2 | #include "rtos.h" |
| rmalik8 | 12:bebfef8d229f | 3 | //#include "SDFileSystem.h" |
| mmarine3 | 2:1ec843c95914 | 4 | #include "uLCD_4DGL.h" |
| rmalik8 | 4:7d02b3f3bee6 | 5 | #include "ultrasonic.h" |
| rmalik8 | 12:bebfef8d229f | 6 | //#include "wave_player.h" |
| rmalik8 | 12:bebfef8d229f | 7 | #include "SongPlayer.h" |
| rmalik8 | 4:7d02b3f3bee6 | 8 | |
| rmalik8 | 3:b5cdd40e99e9 | 9 | //#include <stdio.h> |
| mmarine3 | 2:1ec843c95914 | 10 | #include <string> |
| mmarine3 | 2:1ec843c95914 | 11 | |
| rmalik8 | 4:7d02b3f3bee6 | 12 | |
| mmarine3 | 9:f4f03767acc0 | 13 | uLCD_4DGL uLCD(p13, p14, p12); // Initialize uLCD serial tx, serial rx, reset pin; |
| rmalik8 | 4:7d02b3f3bee6 | 14 | SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card |
| rmalik8 | 10:7a939a54515e | 15 | RawSerial blue(p9,p10); //Initialize Blutooth |
| rmalik8 | 12:bebfef8d229f | 16 | //Serial BT(p9,p10); |
| rmalik8 | 12:bebfef8d229f | 17 | |
| rmalik8 | 12:bebfef8d229f | 18 | //waiting to figure out if sd card works |
| rmalik8 | 12:bebfef8d229f | 19 | //AnalogOut speaker(p18); //Initialize speaker |
| rmalik8 | 12:bebfef8d229f | 20 | //wave_player waver(&speaker); //Initialize Waveplayer |
| rmalik8 | 12:bebfef8d229f | 21 | |
| rmalik8 | 10:7a939a54515e | 22 | Mutex serial_mutex; |
| mmarine3 | 8:c0a6a3363e43 | 23 | Mutex dist; |
| mmarine3 | 2:1ec843c95914 | 24 | DigitalOut MyLED(LED1); |
| mmarine3 | 2:1ec843c95914 | 25 | |
| rmalik8 | 10:7a939a54515e | 26 | volatile int musicChoice = 0; |
| rmalik8 | 10:7a939a54515e | 27 | //musicChoice can be values 0 to 3 |
| rmalik8 | 11:f5d0c8bf1849 | 28 | volatile int sdist = 0; |
| rmalik8 | 12:bebfef8d229f | 29 | volatile int counter = 0; |
| rmalik8 | 12:bebfef8d229f | 30 | |
| rmalik8 | 12:bebfef8d229f | 31 | float note1[2]= {1568.0, 0.0 |
| rmalik8 | 12:bebfef8d229f | 32 | }; |
| rmalik8 | 12:bebfef8d229f | 33 | float note2[2]= {1568.0, 0.0 |
| rmalik8 | 12:bebfef8d229f | 34 | }; |
| rmalik8 | 12:bebfef8d229f | 35 | float note3[2]= {1568.0, 0.0 |
| rmalik8 | 12:bebfef8d229f | 36 | }; |
| rmalik8 | 12:bebfef8d229f | 37 | float duration[2]= {1, 0.0 |
| rmalik8 | 12:bebfef8d229f | 38 | }; |
| rmalik8 | 12:bebfef8d229f | 39 | |
| rmalik8 | 12:bebfef8d229f | 40 | |
| mmarine3 | 9:f4f03767acc0 | 41 | void sonar(int distance) |
| rmalik8 | 4:7d02b3f3bee6 | 42 | { |
| rmalik8 | 4:7d02b3f3bee6 | 43 | //put code here to execute when the sonar distance has changed |
| mmarine3 | 9:f4f03767acc0 | 44 | dist.lock(); |
| mmarine3 | 9:f4f03767acc0 | 45 | sdist = distance; |
| mmarine3 | 9:f4f03767acc0 | 46 | dist.unlock(); |
| rmalik8 | 12:bebfef8d229f | 47 | //printf("Sonar Distance:\r\n %d", sdist); |
| mmarine3 | 9:f4f03767acc0 | 48 | } |
| rmalik8 | 4:7d02b3f3bee6 | 49 | |
| mmarine3 | 9:f4f03767acc0 | 50 | ultrasonic mu(p30, p29, .1, 1, &sonar); //Set the trigger pin to p30 and the echo pin to p29 |
| rmalik8 | 12:bebfef8d229f | 51 | //have updates every .1 seconds and a timeout after 1 |
| rmalik8 | 12:bebfef8d229f | 52 | //second, and call sonar when the distance changes |
| mmarine3 | 9:f4f03767acc0 | 53 | |
| mmarine3 | 9:f4f03767acc0 | 54 | void Sonar(void const* arguments) |
| mmarine3 | 9:f4f03767acc0 | 55 | { |
| mmarine3 | 9:f4f03767acc0 | 56 | mu.startUpdates();//start measuring the distance |
| rmalik8 | 12:bebfef8d229f | 57 | while(1) { |
| mmarine3 | 9:f4f03767acc0 | 58 | //Do something else here |
| mmarine3 | 9:f4f03767acc0 | 59 | mu.checkDistance(); //call checkDistance() as much as possible, as this is where |
| rmalik8 | 12:bebfef8d229f | 60 | //the class checks if dist needs to be called. |
| mmarine3 | 9:f4f03767acc0 | 61 | Thread::wait(10); |
| rmalik8 | 4:7d02b3f3bee6 | 62 | } |
| rmalik8 | 4:7d02b3f3bee6 | 63 | } |
| mmarine3 | 2:1ec843c95914 | 64 | |
| mmarine3 | 8:c0a6a3363e43 | 65 | //Thread to print the TOF and Sonar Values to the LCD |
| mmarine3 | 8:c0a6a3363e43 | 66 | void LCD(void const *arguments) |
| mmarine3 | 8:c0a6a3363e43 | 67 | { |
| mmarine3 | 8:c0a6a3363e43 | 68 | Thread::wait(1000); //Wait for lidar and sonar setup |
| rmalik8 | 12:bebfef8d229f | 69 | serial_mutex.lock(); |
| rmalik8 | 12:bebfef8d229f | 70 | uLCD.cls(); |
| rmalik8 | 12:bebfef8d229f | 71 | uLCD.baudrate(BAUD_3000000); |
| rmalik8 | 12:bebfef8d229f | 72 | serial_mutex.unlock(); |
| rmalik8 | 12:bebfef8d229f | 73 | while(1) { |
| rmalik8 | 10:7a939a54515e | 74 | serial_mutex.lock(); |
| mmarine3 | 8:c0a6a3363e43 | 75 | uLCD.cls(); |
| mmarine3 | 8:c0a6a3363e43 | 76 | dist.lock(); |
| rmalik8 | 12:bebfef8d229f | 77 | uLCD.printf("Sonar Distance:\n %d", sdist); |
| mmarine3 | 8:c0a6a3363e43 | 78 | dist.unlock(); |
| rmalik8 | 10:7a939a54515e | 79 | serial_mutex.unlock(); |
| mmarine3 | 8:c0a6a3363e43 | 80 | Thread::wait(1000); //Allow time to read value before reprint |
| rmalik8 | 12:bebfef8d229f | 81 | |
| rmalik8 | 12:bebfef8d229f | 82 | } |
| rmalik8 | 12:bebfef8d229f | 83 | } |
| rmalik8 | 12:bebfef8d229f | 84 | |
| rmalik8 | 12:bebfef8d229f | 85 | void sounds(void const *arguments) |
| rmalik8 | 12:bebfef8d229f | 86 | { |
| rmalik8 | 12:bebfef8d229f | 87 | int last_counter = 0; |
| rmalik8 | 12:bebfef8d229f | 88 | // setup instance of new SongPlayer class, mySpeaker using pin 26 |
| rmalik8 | 12:bebfef8d229f | 89 | // the pin must be a PWM output pin |
| rmalik8 | 12:bebfef8d229f | 90 | SongPlayer mySpeaker(p26); |
| rmalik8 | 12:bebfef8d229f | 91 | // Start song and return once playing starts |
| rmalik8 | 12:bebfef8d229f | 92 | //mySpeaker.PlaySong(note1,duration); |
| rmalik8 | 12:bebfef8d229f | 93 | while(1) { |
| rmalik8 | 12:bebfef8d229f | 94 | if (counter > last_counter) { |
| rmalik8 | 12:bebfef8d229f | 95 | switch (musicChoice) { |
| rmalik8 | 12:bebfef8d229f | 96 | case '0': |
| rmalik8 | 12:bebfef8d229f | 97 | //do nothing |
| rmalik8 | 12:bebfef8d229f | 98 | break; |
| rmalik8 | 12:bebfef8d229f | 99 | case '1': |
| rmalik8 | 12:bebfef8d229f | 100 | mySpeaker.PlaySong(note1,duration); |
| rmalik8 | 12:bebfef8d229f | 101 | break; |
| rmalik8 | 12:bebfef8d229f | 102 | case '2': |
| rmalik8 | 12:bebfef8d229f | 103 | mySpeaker.PlaySong(note2,duration); |
| rmalik8 | 12:bebfef8d229f | 104 | break; |
| rmalik8 | 12:bebfef8d229f | 105 | case '3': |
| rmalik8 | 12:bebfef8d229f | 106 | mySpeaker.PlaySong(note3,duration); |
| rmalik8 | 12:bebfef8d229f | 107 | break; |
| rmalik8 | 12:bebfef8d229f | 108 | default: |
| rmalik8 | 12:bebfef8d229f | 109 | break; |
| rmalik8 | 12:bebfef8d229f | 110 | } |
| rmalik8 | 12:bebfef8d229f | 111 | } |
| rmalik8 | 12:bebfef8d229f | 112 | last_counter = counter; |
| rmalik8 | 12:bebfef8d229f | 113 | Thread::wait(100); |
| mmarine3 | 8:c0a6a3363e43 | 114 | } |
| mmarine3 | 8:c0a6a3363e43 | 115 | } |
| mmarine3 | 8:c0a6a3363e43 | 116 | |
| rmalik8 | 10:7a939a54515e | 117 | void bluetooth(void const *arguments) |
| rmalik8 | 10:7a939a54515e | 118 | { |
| rmalik8 | 10:7a939a54515e | 119 | char bnum=0; |
| rmalik8 | 10:7a939a54515e | 120 | char bhit=0; |
| rmalik8 | 12:bebfef8d229f | 121 | while(1) { |
| rmalik8 | 10:7a939a54515e | 122 | serial_mutex.lock(); |
| rmalik8 | 12:bebfef8d229f | 123 | if(!blue.readable()) { |
| rmalik8 | 12:bebfef8d229f | 124 | Thread::yield(); |
| rmalik8 | 10:7a939a54515e | 125 | } else { |
| rmalik8 | 12:bebfef8d229f | 126 | if (blue.getc()=='!') { |
| rmalik8 | 12:bebfef8d229f | 127 | if (blue.getc()=='B') { //button data packet |
| rmalik8 | 12:bebfef8d229f | 128 | bnum = blue.getc(); //button number |
| rmalik8 | 12:bebfef8d229f | 129 | bhit = blue.getc(); //1=hit, 0=release |
| rmalik8 | 12:bebfef8d229f | 130 | if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK? |
| rmalik8 | 12:bebfef8d229f | 131 | |
| rmalik8 | 12:bebfef8d229f | 132 | switch (bnum) { |
| rmalik8 | 12:bebfef8d229f | 133 | case '1': //number button 1 |
| rmalik8 | 12:bebfef8d229f | 134 | if (bhit=='1') { |
| rmalik8 | 12:bebfef8d229f | 135 | musicChoice = 0; |
| rmalik8 | 12:bebfef8d229f | 136 | } else { |
| rmalik8 | 12:bebfef8d229f | 137 | //add release code here |
| rmalik8 | 12:bebfef8d229f | 138 | } |
| rmalik8 | 12:bebfef8d229f | 139 | break; |
| rmalik8 | 12:bebfef8d229f | 140 | case '2': //number button 2 |
| rmalik8 | 12:bebfef8d229f | 141 | if (bhit=='1') { |
| rmalik8 | 12:bebfef8d229f | 142 | musicChoice = 1; |
| rmalik8 | 12:bebfef8d229f | 143 | } else { |
| rmalik8 | 12:bebfef8d229f | 144 | //add release code here |
| rmalik8 | 12:bebfef8d229f | 145 | } |
| rmalik8 | 12:bebfef8d229f | 146 | break; |
| rmalik8 | 12:bebfef8d229f | 147 | case '3': //number button 3 |
| rmalik8 | 12:bebfef8d229f | 148 | if (bhit=='1') { |
| rmalik8 | 12:bebfef8d229f | 149 | musicChoice = 2; |
| rmalik8 | 12:bebfef8d229f | 150 | } else { |
| rmalik8 | 12:bebfef8d229f | 151 | //add release code here |
| rmalik8 | 12:bebfef8d229f | 152 | } |
| rmalik8 | 12:bebfef8d229f | 153 | break; |
| rmalik8 | 12:bebfef8d229f | 154 | case '4': //number button 4 |
| rmalik8 | 12:bebfef8d229f | 155 | if (bhit=='1') { |
| rmalik8 | 12:bebfef8d229f | 156 | //add hit code here |
| rmalik8 | 12:bebfef8d229f | 157 | } else { |
| rmalik8 | 12:bebfef8d229f | 158 | //add release code here |
| rmalik8 | 12:bebfef8d229f | 159 | } |
| rmalik8 | 12:bebfef8d229f | 160 | break; |
| rmalik8 | 12:bebfef8d229f | 161 | case '5': //button 5 up arrow |
| rmalik8 | 12:bebfef8d229f | 162 | if (bhit=='1') { |
| rmalik8 | 12:bebfef8d229f | 163 | musicChoice = 3; |
| rmalik8 | 12:bebfef8d229f | 164 | } else { |
| rmalik8 | 12:bebfef8d229f | 165 | //add release code here |
| rmalik8 | 12:bebfef8d229f | 166 | } |
| rmalik8 | 12:bebfef8d229f | 167 | break; |
| rmalik8 | 12:bebfef8d229f | 168 | case '6': //button 6 down arrow |
| rmalik8 | 12:bebfef8d229f | 169 | if (bhit=='1') { |
| rmalik8 | 12:bebfef8d229f | 170 | //add hit code here |
| rmalik8 | 12:bebfef8d229f | 171 | } else { |
| rmalik8 | 12:bebfef8d229f | 172 | //add release code here |
| rmalik8 | 12:bebfef8d229f | 173 | } |
| rmalik8 | 12:bebfef8d229f | 174 | break; |
| rmalik8 | 12:bebfef8d229f | 175 | case '7': //button 7 left arrow |
| rmalik8 | 12:bebfef8d229f | 176 | if (bhit=='1') { |
| rmalik8 | 12:bebfef8d229f | 177 | //add hit code here |
| rmalik8 | 12:bebfef8d229f | 178 | } else { |
| rmalik8 | 12:bebfef8d229f | 179 | //add release code here |
| rmalik8 | 12:bebfef8d229f | 180 | } |
| rmalik8 | 12:bebfef8d229f | 181 | break; |
| rmalik8 | 12:bebfef8d229f | 182 | case '8': //button 8 right arrow |
| rmalik8 | 12:bebfef8d229f | 183 | if (bhit=='1') { |
| rmalik8 | 12:bebfef8d229f | 184 | //add hit code here |
| rmalik8 | 12:bebfef8d229f | 185 | } else { |
| rmalik8 | 12:bebfef8d229f | 186 | //add release code here |
| rmalik8 | 12:bebfef8d229f | 187 | } |
| rmalik8 | 12:bebfef8d229f | 188 | break; |
| rmalik8 | 12:bebfef8d229f | 189 | default: |
| rmalik8 | 12:bebfef8d229f | 190 | break; |
| rmalik8 | 12:bebfef8d229f | 191 | } |
| rmalik8 | 10:7a939a54515e | 192 | } |
| rmalik8 | 10:7a939a54515e | 193 | } |
| rmalik8 | 10:7a939a54515e | 194 | } |
| rmalik8 | 10:7a939a54515e | 195 | } |
| rmalik8 | 10:7a939a54515e | 196 | serial_mutex.unlock(); |
| rmalik8 | 10:7a939a54515e | 197 | } |
| rmalik8 | 10:7a939a54515e | 198 | } |
| rmalik8 | 10:7a939a54515e | 199 | |
| mmarine3 | 2:1ec843c95914 | 200 | int main() |
| mmarine3 | 2:1ec843c95914 | 201 | { |
| rmalik8 | 12:bebfef8d229f | 202 | |
| mmarine3 | 7:85d42006e380 | 203 | //wait(1.0); |
| mmarine3 | 7:85d42006e380 | 204 | |
| mmarine3 | 7:85d42006e380 | 205 | //blu.attach(&parse_message,Serial::RxIrq); |
| rmalik8 | 12:bebfef8d229f | 206 | //Was used in lab 3 to interupt if reading in a blutooth command |
| mmarine3 | 7:85d42006e380 | 207 | //Thread t#(name_of_thread_function); |
| mmarine3 | 8:c0a6a3363e43 | 208 | Thread t1(LCD);//Initialize LCD thread |
| mmarine3 | 9:f4f03767acc0 | 209 | Thread t2(Sonar);//Initialize Sonar thread |
| rmalik8 | 12:bebfef8d229f | 210 | |
| rmalik8 | 12:bebfef8d229f | 211 | |
| mmarine3 | 8:c0a6a3363e43 | 212 | /* //Code to read and play a file |
| mmarine3 | 7:85d42006e380 | 213 | FILE *wave_file; |
| mmarine3 | 7:85d42006e380 | 214 | //printf("Hello World"); |
| mmarine3 | 7:85d42006e380 | 215 | Thread::wait(1000); |
| mmarine3 | 7:85d42006e380 | 216 | wave_file=fopen("/sd/test.wav","r"); |
| mmarine3 | 7:85d42006e380 | 217 | //serial_mutex.lock(); |
| mmarine3 | 7:85d42006e380 | 218 | if(wave_file==NULL) printf("file open error!\n\n\r"); |
| mmarine3 | 7:85d42006e380 | 219 | //serial_mutex.unlock(); |
| mmarine3 | 7:85d42006e380 | 220 | waver.play(wave_file); |
| mmarine3 | 7:85d42006e380 | 221 | fclose(wave_file); |
| mmarine3 | 8:c0a6a3363e43 | 222 | */ |
| rmalik8 | 12:bebfef8d229f | 223 | |
| mmarine3 | 8:c0a6a3363e43 | 224 | //Loop to validate the main loop is executing |
| rmalik8 | 12:bebfef8d229f | 225 | while(1) { |
| mmarine3 | 9:f4f03767acc0 | 226 | //MyLED = !MyLED; |
| mmarine3 | 9:f4f03767acc0 | 227 | //Thread::wait(100); |
| mmarine3 | 8:c0a6a3363e43 | 228 | } |
| mmarine3 | 2:1ec843c95914 | 229 | } |