ver 1.0

Dependencies:   FATFileSystem SDFileSystem mbed-rtos mbed wave_player

Fork of LED_effects_w_sound by jim hamblen

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/.

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?

UserRevisionLine numberNew 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 }