ver 1.0
Dependencies: FATFileSystem SDFileSystem mbed-rtos mbed wave_player
Fork of LED_effects_w_sound by
LED PWM lighting effects with sounds played from *.wav files using threads and the mbed RTOS. For more info see http://developer.mbed.org/users/4180_1/notebook/led-lighting-effects-for-modelers/.
main.cpp@11:50e44c84411c, 2018-02-20 (annotated)
- Committer:
- 4180_1
- Date:
- Tue Feb 20 17:54:41 2018 +0000
- Revision:
- 11:50e44c84411c
- Parent:
- 10:21943bd35341
ver 1.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
samux | 0:0d68fe822228 | 1 | #include "mbed.h" |
4180_1 | 11:50e44c84411c | 2 | #include "rtos.h" |
4180_1 | 11:50e44c84411c | 3 | #include "SDFileSystem.h" |
4180_1 | 9:f1aebfbe7e78 | 4 | #include "wave_player.h" |
4180_1 | 11:50e44c84411c | 5 | |
4180_1 | 11:50e44c84411c | 6 | |
4180_1 | 11:50e44c84411c | 7 | SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card |
4180_1 | 11:50e44c84411c | 8 | |
4180_1 | 10:21943bd35341 | 9 | //LED lighting effects with sound using the RTOS |
4180_1 | 9:f1aebfbe7e78 | 10 | //Plays the wave file "sample.wav" on the USB flash drive |
4180_1 | 10:21943bd35341 | 11 | //using waveplayer code library |
4180_1 | 10:21943bd35341 | 12 | //Class D style audio output on P26 or |
4180_1 | 10:21943bd35341 | 13 | //use the Audio Out jack for connection to a set of amplified PC speakers (at higher volume) |
4180_1 | 10:21943bd35341 | 14 | //Needs a USB flash drive inserted with the *.wav files on it to run with audio effects |
4180_1 | 10:21943bd35341 | 15 | //Pins are setup for mbed LPC1768 on mbed application board |
4180_1 | 10:21943bd35341 | 16 | //Analog Audio Out Jack for PC Speakers- Sparkfun also has a breakout |
4180_1 | 10:21943bd35341 | 17 | //For more info see: |
4180_1 | 10:21943bd35341 | 18 | //http://developer.mbed.org/users/4180_1/notebook/led-lighting-effects-for-modelers/ |
4180_1 | 10:21943bd35341 | 19 | AnalogOut DACout(p18); |
4180_1 | 10:21943bd35341 | 20 | //On Board Speaker on Application board but very low volume using PWM |
4180_1 | 10:21943bd35341 | 21 | PwmOut PWMout(p26); |
4180_1 | 10:21943bd35341 | 22 | //LEDs used in demo |
4180_1 | 10:21943bd35341 | 23 | PwmOut myled2(LED2); |
4180_1 | 10:21943bd35341 | 24 | PwmOut myled4(LED4); |
4180_1 | 10:21943bd35341 | 25 | //Use a PWM output to enable dimming |
4180_1 | 10:21943bd35341 | 26 | //1.0 is full on, 0.0 off, 0.5 50% on |
samux | 0:0d68fe822228 | 27 | |
4180_1 | 10:21943bd35341 | 28 | inline float random_number() |
4180_1 | 10:21943bd35341 | 29 | { |
4180_1 | 10:21943bd35341 | 30 | return (rand()/(float(RAND_MAX))); |
4180_1 | 10:21943bd35341 | 31 | } |
4180_1 | 10:21943bd35341 | 32 | void beacon(void const *args) |
4180_1 | 10:21943bd35341 | 33 | { |
4180_1 | 10:21943bd35341 | 34 | while(1) { |
4180_1 | 10:21943bd35341 | 35 | //LED warm up effect using PWM |
4180_1 | 10:21943bd35341 | 36 | for(int i=0; i<50; i++) { |
4180_1 | 10:21943bd35341 | 37 | myled2 = i/50.0; |
4180_1 | 10:21943bd35341 | 38 | Thread::wait(1000.0*0.02); |
4180_1 | 10:21943bd35341 | 39 | } |
4180_1 | 10:21943bd35341 | 40 | //LED at full brightness level |
4180_1 | 10:21943bd35341 | 41 | myled2 = 1.0; |
4180_1 | 10:21943bd35341 | 42 | Thread::wait(1000.0*0.25); |
4180_1 | 10:21943bd35341 | 43 | //LED cool down effect using PWM |
4180_1 | 10:21943bd35341 | 44 | for(int i=49; i>0; i--) { |
4180_1 | 10:21943bd35341 | 45 | myled2 = i/50.0; |
4180_1 | 10:21943bd35341 | 46 | Thread::wait(1000.0*0.02); |
4180_1 | 10:21943bd35341 | 47 | } |
4180_1 | 10:21943bd35341 | 48 | //LED off |
4180_1 | 10:21943bd35341 | 49 | myled2 = 0.0; |
4180_1 | 10:21943bd35341 | 50 | Thread::wait(1000.0*1.5); |
4180_1 | 10:21943bd35341 | 51 | } |
4180_1 | 10:21943bd35341 | 52 | } |
4180_1 | 10:21943bd35341 | 53 | void welding(void const *args) |
4180_1 | 10:21943bd35341 | 54 | { |
4180_1 | 10:21943bd35341 | 55 | float x = 0.0; |
4180_1 | 10:21943bd35341 | 56 | while(1) { |
4180_1 | 10:21943bd35341 | 57 | //get a new random number for PWM |
4180_1 | 10:21943bd35341 | 58 | x = random_number(); |
4180_1 | 10:21943bd35341 | 59 | //add some exponential brightness scaling |
4180_1 | 10:21943bd35341 | 60 | //for more of a fast flash effect |
4180_1 | 10:21943bd35341 | 61 | myled2 = x*x*x; |
4180_1 | 10:21943bd35341 | 62 | //fast update rate for welding flashes |
4180_1 | 10:21943bd35341 | 63 | Thread::wait(1000.0*0.02); |
4180_1 | 10:21943bd35341 | 64 | //add a random pause between welds |
4180_1 | 10:21943bd35341 | 65 | if (random_number()>0.995) { |
4180_1 | 10:21943bd35341 | 66 | myled2 = 0.0; |
4180_1 | 10:21943bd35341 | 67 | Thread::wait(1000.0*random_number()); |
4180_1 | 10:21943bd35341 | 68 | } |
4180_1 | 10:21943bd35341 | 69 | } |
4180_1 | 10:21943bd35341 | 70 | } |
4180_1 | 10:21943bd35341 | 71 | void fire(void const *args) |
4180_1 | 10:21943bd35341 | 72 | { |
4180_1 | 10:21943bd35341 | 73 | while(1) { |
4180_1 | 10:21943bd35341 | 74 | //get a new random number for PWM |
4180_1 | 10:21943bd35341 | 75 | myled2 = random_number(); |
4180_1 | 10:21943bd35341 | 76 | //a bit slower time delay can be used for fire |
4180_1 | 10:21943bd35341 | 77 | wait(0.04); |
4180_1 | 10:21943bd35341 | 78 | } |
4180_1 | 10:21943bd35341 | 79 | } |
4180_1 | 10:21943bd35341 | 80 | void police(void const *args) |
4180_1 | 10:21943bd35341 | 81 | { |
4180_1 | 10:21943bd35341 | 82 | while(1) { |
4180_1 | 10:21943bd35341 | 83 | //flash three times on LED1 |
4180_1 | 10:21943bd35341 | 84 | for(int i=0; i<3; i++) { |
4180_1 | 10:21943bd35341 | 85 | //ramp up brightness level |
4180_1 | 10:21943bd35341 | 86 | for(double x = 0.0; x <= 1.0; x = x+0.2) { |
4180_1 | 10:21943bd35341 | 87 | myled2 = x*x; |
4180_1 | 10:21943bd35341 | 88 | wait(.02); |
4180_1 | 10:21943bd35341 | 89 | } |
4180_1 | 10:21943bd35341 | 90 | } |
4180_1 | 10:21943bd35341 | 91 | myled2=0.0; //LED1 off |
4180_1 | 10:21943bd35341 | 92 | //flash three times on LED2 |
4180_1 | 10:21943bd35341 | 93 | for(int i=0; i<3; i++) { |
4180_1 | 10:21943bd35341 | 94 | //ramp up brightness level |
4180_1 | 10:21943bd35341 | 95 | for(double x = 0.0; x <= 1.0; x = x+0.2) { |
4180_1 | 10:21943bd35341 | 96 | myled4 = x*x; |
4180_1 | 10:21943bd35341 | 97 | wait(.02); |
4180_1 | 10:21943bd35341 | 98 | } |
4180_1 | 10:21943bd35341 | 99 | } |
4180_1 | 10:21943bd35341 | 100 | myled4=0.0; //LED2 off |
4180_1 | 10:21943bd35341 | 101 | } |
4180_1 | 10:21943bd35341 | 102 | } |
4180_1 | 10:21943bd35341 | 103 | void lighthouse(void const *args) |
4180_1 | 10:21943bd35341 | 104 | { |
4180_1 | 10:21943bd35341 | 105 | float y=0.0; |
4180_1 | 9:f1aebfbe7e78 | 106 | |
4180_1 | 10:21943bd35341 | 107 | while(1) { |
4180_1 | 10:21943bd35341 | 108 | for(double x=0.0; x <= 3.14159; x = x + 0.0314159) { |
4180_1 | 10:21943bd35341 | 109 | y = sin(x); //nice periodic function 0..1..0 |
4180_1 | 10:21943bd35341 | 110 | myled2 = y*y*y;//exponential effect - needs a sharp peak |
4180_1 | 10:21943bd35341 | 111 | Thread::wait(1000.0*.025); |
4180_1 | 10:21943bd35341 | 112 | } |
4180_1 | 10:21943bd35341 | 113 | myled2 = 0.0; |
4180_1 | 10:21943bd35341 | 114 | //most lighthouses have a 5 second delay - so add another 2.5 |
4180_1 | 10:21943bd35341 | 115 | Thread::wait(1000.0*2.5); |
4180_1 | 10:21943bd35341 | 116 | } |
4180_1 | 10:21943bd35341 | 117 | } |
4180_1 | 10:21943bd35341 | 118 | |
4180_1 | 10:21943bd35341 | 119 | |
4180_1 | 10:21943bd35341 | 120 | //function to simulate incandescent bulb warm up |
4180_1 | 10:21943bd35341 | 121 | //and cool down cycles |
4180_1 | 10:21943bd35341 | 122 | void incandescent_bulb(PwmOut led, float on_time = 0.1, |
4180_1 | 10:21943bd35341 | 123 | float warm_time = 0.2) |
4180_1 | 10:21943bd35341 | 124 | { |
4180_1 | 10:21943bd35341 | 125 | //LED warm up effect using PWM |
4180_1 | 10:21943bd35341 | 126 | for(int i=0; i<10; i++) { |
4180_1 | 10:21943bd35341 | 127 | led = i/10.0; |
4180_1 | 10:21943bd35341 | 128 | Thread::wait(1000.0*warm_time/10.0); |
4180_1 | 10:21943bd35341 | 129 | } |
4180_1 | 10:21943bd35341 | 130 | //LED at full brightness level |
4180_1 | 10:21943bd35341 | 131 | led = 1.0; |
4180_1 | 10:21943bd35341 | 132 | Thread::wait(1000.0*on_time); |
4180_1 | 10:21943bd35341 | 133 | //LED cool down effect using PWM |
4180_1 | 10:21943bd35341 | 134 | for(int i=9; i>0; i--) { |
4180_1 | 10:21943bd35341 | 135 | led = i/10.0; |
4180_1 | 10:21943bd35341 | 136 | Thread::wait(1000.0*warm_time/10.0); |
4180_1 | 10:21943bd35341 | 137 | } |
4180_1 | 10:21943bd35341 | 138 | //LED off |
4180_1 | 10:21943bd35341 | 139 | led = 0.0; |
4180_1 | 10:21943bd35341 | 140 | } |
4180_1 | 10:21943bd35341 | 141 | //LED Railroad Crossing Lighting Effect |
4180_1 | 10:21943bd35341 | 142 | void rrcrossing(void const *args) |
4180_1 | 10:21943bd35341 | 143 | { |
4180_1 | 10:21943bd35341 | 144 | while(1) { |
4180_1 | 10:21943bd35341 | 145 | incandescent_bulb(myled2); |
4180_1 | 10:21943bd35341 | 146 | incandescent_bulb(myled4); |
4180_1 | 10:21943bd35341 | 147 | } |
4180_1 | 10:21943bd35341 | 148 | } |
4180_1 | 10:21943bd35341 | 149 | |
4180_1 | 11:50e44c84411c | 150 | //wave player plays a *.wav file to D/A |
4180_1 | 11:50e44c84411c | 151 | wave_player waver(&DACout); |
4180_1 | 9:f1aebfbe7e78 | 152 | |
4180_1 | 9:f1aebfbe7e78 | 153 | int main() |
4180_1 | 9:f1aebfbe7e78 | 154 | { |
4180_1 | 11:50e44c84411c | 155 | |
4180_1 | 9:f1aebfbe7e78 | 156 | FILE *wave_file; |
4180_1 | 10:21943bd35341 | 157 | while(1) { |
4180_1 | 10:21943bd35341 | 158 | { |
4180_1 | 10:21943bd35341 | 159 | //Lighthouse demo with foghorn |
4180_1 | 10:21943bd35341 | 160 | Thread thread(lighthouse); //Start LED effect thread |
4180_1 | 10:21943bd35341 | 161 | for(int i=0; i<4; ++i) { |
4180_1 | 10:21943bd35341 | 162 | //open wav file and play it |
4180_1 | 11:50e44c84411c | 163 | wave_file=fopen("/sd/foghorn.wav","r"); |
4180_1 | 10:21943bd35341 | 164 | waver.play(wave_file); //Plays (*.wav file |
4180_1 | 10:21943bd35341 | 165 | fclose(wave_file); |
4180_1 | 10:21943bd35341 | 166 | Thread::wait(1925); |
4180_1 | 10:21943bd35341 | 167 | } |
4180_1 | 10:21943bd35341 | 168 | //end of lighthouse demo; |
4180_1 | 10:21943bd35341 | 169 | thread.terminate(); //kills LED effect thread whan audio stops |
4180_1 | 10:21943bd35341 | 170 | |
4180_1 | 10:21943bd35341 | 171 | } //code block forces thread out of scope reclaims mem-can recreate thread object |
4180_1 | 10:21943bd35341 | 172 | { |
4180_1 | 10:21943bd35341 | 173 | //Arc Welding with sound |
4180_1 | 10:21943bd35341 | 174 | Thread thread(welding); |
4180_1 | 10:21943bd35341 | 175 | //open wav file and play it |
4180_1 | 11:50e44c84411c | 176 | wave_file=fopen("/sd/welding.wav","r"); |
4180_1 | 10:21943bd35341 | 177 | waver.play(wave_file); |
4180_1 | 10:21943bd35341 | 178 | fclose(wave_file); |
4180_1 | 10:21943bd35341 | 179 | //end of welding demo; |
4180_1 | 10:21943bd35341 | 180 | thread.terminate(); |
4180_1 | 10:21943bd35341 | 181 | } |
4180_1 | 10:21943bd35341 | 182 | { |
4180_1 | 10:21943bd35341 | 183 | //Police Lights with siren |
4180_1 | 10:21943bd35341 | 184 | //code block forces thread out of scope |
4180_1 | 10:21943bd35341 | 185 | Thread thread(police); |
4180_1 | 10:21943bd35341 | 186 | //open wav file and play it |
4180_1 | 11:50e44c84411c | 187 | wave_file=fopen("/sd/emgsiren.wav","r"); |
4180_1 | 10:21943bd35341 | 188 | waver.play(wave_file); |
4180_1 | 10:21943bd35341 | 189 | fclose(wave_file); |
4180_1 | 10:21943bd35341 | 190 | //end of police light demo; |
4180_1 | 10:21943bd35341 | 191 | thread.terminate(); |
4180_1 | 10:21943bd35341 | 192 | } |
4180_1 | 10:21943bd35341 | 193 | { |
4180_1 | 10:21943bd35341 | 194 | //Fire with sound |
4180_1 | 10:21943bd35341 | 195 | Thread thread(fire); |
4180_1 | 10:21943bd35341 | 196 | //open wav file and play it |
4180_1 | 11:50e44c84411c | 197 | wave_file=fopen("/sd/fire.wav","r"); |
4180_1 | 10:21943bd35341 | 198 | waver.play(wave_file); |
4180_1 | 10:21943bd35341 | 199 | fclose(wave_file); |
4180_1 | 10:21943bd35341 | 200 | //end of fire demo; |
4180_1 | 10:21943bd35341 | 201 | thread.terminate(); |
4180_1 | 10:21943bd35341 | 202 | } |
4180_1 | 10:21943bd35341 | 203 | |
4180_1 | 10:21943bd35341 | 204 | { |
4180_1 | 10:21943bd35341 | 205 | //RR Crossing Lights with Signal Bells |
4180_1 | 10:21943bd35341 | 206 | Thread thread(rrcrossing); |
4180_1 | 10:21943bd35341 | 207 | //open wav file and play it |
4180_1 | 11:50e44c84411c | 208 | wave_file=fopen("/sd/SignalBell.wav","r"); |
4180_1 | 10:21943bd35341 | 209 | waver.play(wave_file); |
4180_1 | 10:21943bd35341 | 210 | fclose(wave_file); |
4180_1 | 10:21943bd35341 | 211 | //end of railroad crossing demo; |
4180_1 | 10:21943bd35341 | 212 | thread.terminate(); |
4180_1 | 10:21943bd35341 | 213 | } |
4180_1 | 10:21943bd35341 | 214 | } |
4180_1 | 10:21943bd35341 | 215 | } |