Triggers Lightning LED and sounds effects

Dependencies:   mbed

Committer:
AndyA
Date:
Tue Sep 27 11:06:11 2016 +0000
Revision:
0:a010acebe0ac

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AndyA 0:a010acebe0ac 1 #include "mbed.h"
AndyA 0:a010acebe0ac 2
AndyA 0:a010acebe0ac 3 // LED on/off times.
AndyA 0:a010acebe0ac 4 // First time is time between toggling sound IO pin and starting lights
AndyA 0:a010acebe0ac 5 // Allows for audio playback start latency and lead in time.
AndyA 0:a010acebe0ac 6 const float thunder1Times[] = {0.1,0.3,0.1,0.3,0.1,0.2,0.2,0.3,0.1,0.3};
AndyA 0:a010acebe0ac 7 const int thunder1Len = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 ;
AndyA 0:a010acebe0ac 8
AndyA 0:a010acebe0ac 9 const float thunder2Times[] = {0.1,0.3,0.1,0.3,0.1,0.2, 0.6 ,0.3,0.1,0.3,0.2,0.1, 2 ,0.3,0.15,0.4,0.1,0.2};
AndyA 0:a010acebe0ac 10 const int thunder2Len = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 ;
AndyA 0:a010acebe0ac 11
AndyA 0:a010acebe0ac 12 // min time between starting a thunder playback and starting the next audio
AndyA 0:a010acebe0ac 13 const float thunder1AudioLen = 20;
AndyA 0:a010acebe0ac 14 const float thunder2AudioLen = 25;
AndyA 0:a010acebe0ac 15
AndyA 0:a010acebe0ac 16 // min time between starting a SFX playback and starting the next audio
AndyA 0:a010acebe0ac 17 const float effectAudioLen = 5;
AndyA 0:a010acebe0ac 18
AndyA 0:a010acebe0ac 19
AndyA 0:a010acebe0ac 20 // actual time between sound starts will be these numbers plus the thunder/effect length above.
AndyA 0:a010acebe0ac 21 const float minTimeBetweenSounds = 10;
AndyA 0:a010acebe0ac 22 const float maxTimeBetweenSounds = 20;
AndyA 0:a010acebe0ac 23
AndyA 0:a010acebe0ac 24 // percentage chance of lightnings
AndyA 0:a010acebe0ac 25 const int pLightning = 40;
AndyA 0:a010acebe0ac 26 const int pLightning2 = 15;
AndyA 0:a010acebe0ac 27
AndyA 0:a010acebe0ac 28
AndyA 0:a010acebe0ac 29 const int randomRange = 10*(maxTimeBetweenSounds - minTimeBetweenSounds); // range of time between sounds in units of 10ths of a second
AndyA 0:a010acebe0ac 30
AndyA 0:a010acebe0ac 31
AndyA 0:a010acebe0ac 32 DigitalOut soundEffectPin(P0_19);
AndyA 0:a010acebe0ac 33 DigitalOut thunder1Pin(P0_4);
AndyA 0:a010acebe0ac 34 DigitalOut thunder2Pin(P0_5);
AndyA 0:a010acebe0ac 35
AndyA 0:a010acebe0ac 36 DigitalOut LEDsPin(P0_18);
AndyA 0:a010acebe0ac 37
AndyA 0:a010acebe0ac 38 DigitalOut LED_1(LED1);
AndyA 0:a010acebe0ac 39 DigitalOut LED_2(LED2);
AndyA 0:a010acebe0ac 40 DigitalOut LED_3(LED3);
AndyA 0:a010acebe0ac 41 BusOut LED_47(LED4,LED5,LED6,LED7);
AndyA 0:a010acebe0ac 42
AndyA 0:a010acebe0ac 43
AndyA 0:a010acebe0ac 44
AndyA 0:a010acebe0ac 45
AndyA 0:a010acebe0ac 46 void LEDon()
AndyA 0:a010acebe0ac 47 {
AndyA 0:a010acebe0ac 48 LEDsPin = 1;
AndyA 0:a010acebe0ac 49 LED_1 = 1;
AndyA 0:a010acebe0ac 50 }
AndyA 0:a010acebe0ac 51
AndyA 0:a010acebe0ac 52 void LEDoff()
AndyA 0:a010acebe0ac 53 {
AndyA 0:a010acebe0ac 54 LEDsPin = 0;
AndyA 0:a010acebe0ac 55 LED_1 = 0;
AndyA 0:a010acebe0ac 56 }
AndyA 0:a010acebe0ac 57
AndyA 0:a010acebe0ac 58 void toggleLED()
AndyA 0:a010acebe0ac 59 {
AndyA 0:a010acebe0ac 60 LEDsPin = !LEDsPin;
AndyA 0:a010acebe0ac 61 LED_1 = LEDsPin;
AndyA 0:a010acebe0ac 62 }
AndyA 0:a010acebe0ac 63
AndyA 0:a010acebe0ac 64 void randomSoundEffect(void)
AndyA 0:a010acebe0ac 65 {
AndyA 0:a010acebe0ac 66 LED_2 = 1;
AndyA 0:a010acebe0ac 67 soundEffectPin = 0;
AndyA 0:a010acebe0ac 68 wait(1);
AndyA 0:a010acebe0ac 69 LED_2 = 0;
AndyA 0:a010acebe0ac 70 soundEffectPin = 1;
AndyA 0:a010acebe0ac 71 wait(effectAudioLen);
AndyA 0:a010acebe0ac 72 }
AndyA 0:a010acebe0ac 73
AndyA 0:a010acebe0ac 74 void thunderEffect1(void)
AndyA 0:a010acebe0ac 75 {
AndyA 0:a010acebe0ac 76 LEDoff();
AndyA 0:a010acebe0ac 77 thunder1Pin = 0;
AndyA 0:a010acebe0ac 78 int count = 0;
AndyA 0:a010acebe0ac 79 float totalTime = 0;
AndyA 0:a010acebe0ac 80 while (count < thunder1Len) {
AndyA 0:a010acebe0ac 81 wait (thunder1Times[count]);
AndyA 0:a010acebe0ac 82 totalTime += thunder1Times[count];
AndyA 0:a010acebe0ac 83 toggleLED();
AndyA 0:a010acebe0ac 84 count++;
AndyA 0:a010acebe0ac 85 }
AndyA 0:a010acebe0ac 86 LEDoff();
AndyA 0:a010acebe0ac 87 thunder1Pin = 1;
AndyA 0:a010acebe0ac 88 if (thunder1AudioLen > totalTime)
AndyA 0:a010acebe0ac 89 wait (thunder1AudioLen - totalTime);
AndyA 0:a010acebe0ac 90 }
AndyA 0:a010acebe0ac 91
AndyA 0:a010acebe0ac 92 void thunderEffect2(void)
AndyA 0:a010acebe0ac 93 {
AndyA 0:a010acebe0ac 94 LEDoff();
AndyA 0:a010acebe0ac 95 thunder2Pin = 0;
AndyA 0:a010acebe0ac 96 int count = 0;
AndyA 0:a010acebe0ac 97 float totalTime = 0;
AndyA 0:a010acebe0ac 98 while (count < thunder2Len) {
AndyA 0:a010acebe0ac 99 wait (thunder2Times[count]);
AndyA 0:a010acebe0ac 100 totalTime += thunder2Times[count];
AndyA 0:a010acebe0ac 101 toggleLED();
AndyA 0:a010acebe0ac 102 count++;
AndyA 0:a010acebe0ac 103 }
AndyA 0:a010acebe0ac 104 LEDoff();
AndyA 0:a010acebe0ac 105 thunder2Pin = 1;
AndyA 0:a010acebe0ac 106 if (thunder2AudioLen > totalTime)
AndyA 0:a010acebe0ac 107 wait (thunder2AudioLen - totalTime);
AndyA 0:a010acebe0ac 108 }
AndyA 0:a010acebe0ac 109
AndyA 0:a010acebe0ac 110
AndyA 0:a010acebe0ac 111 void playEffect(void)
AndyA 0:a010acebe0ac 112 {
AndyA 0:a010acebe0ac 113 int randomOrder = rand() % 100;
AndyA 0:a010acebe0ac 114 LED_47 = randomOrder;
AndyA 0:a010acebe0ac 115 LED_3 = 1;
AndyA 0:a010acebe0ac 116 if (randomOrder < pLightning) {
AndyA 0:a010acebe0ac 117 LED_47 = 1;
AndyA 0:a010acebe0ac 118 thunderEffect1();
AndyA 0:a010acebe0ac 119 } else if (randomOrder < (pLightning+pLightning2)) {
AndyA 0:a010acebe0ac 120 LED_47 = 2;
AndyA 0:a010acebe0ac 121 thunderEffect2();
AndyA 0:a010acebe0ac 122 } else {
AndyA 0:a010acebe0ac 123 LED_47 = 3;
AndyA 0:a010acebe0ac 124 randomSoundEffect();
AndyA 0:a010acebe0ac 125 }
AndyA 0:a010acebe0ac 126 LED_3 = 0;
AndyA 0:a010acebe0ac 127 }
AndyA 0:a010acebe0ac 128
AndyA 0:a010acebe0ac 129 void setupRandom(void)
AndyA 0:a010acebe0ac 130 {
AndyA 0:a010acebe0ac 131 AnalogIn RandomIn(P0_14);
AndyA 0:a010acebe0ac 132 // create a 32 bit number out of 32 LSBs from the ADC
AndyA 0:a010acebe0ac 133 uint32_t seedValue = 0;
AndyA 0:a010acebe0ac 134 uint16_t value;
AndyA 0:a010acebe0ac 135 uint8_t counter;
AndyA 0:a010acebe0ac 136
AndyA 0:a010acebe0ac 137 for (counter = 0; counter < 32; counter++) {
AndyA 0:a010acebe0ac 138 seedValue = seedValue<<1;
AndyA 0:a010acebe0ac 139 value = RandomIn.read_u16(); // reads a 10 bit ADC normalised to 16 bits.
AndyA 0:a010acebe0ac 140 if (value & 0x0040) // LSB of ADC output = 1
AndyA 0:a010acebe0ac 141 seedValue++;
AndyA 0:a010acebe0ac 142 }
AndyA 0:a010acebe0ac 143
AndyA 0:a010acebe0ac 144 srand(seedValue);
AndyA 0:a010acebe0ac 145 }
AndyA 0:a010acebe0ac 146
AndyA 0:a010acebe0ac 147 main()
AndyA 0:a010acebe0ac 148 {
AndyA 0:a010acebe0ac 149 LED_47 = 0;
AndyA 0:a010acebe0ac 150 LED_2 = 0;
AndyA 0:a010acebe0ac 151 LED_3 = 0;
AndyA 0:a010acebe0ac 152 LEDoff();
AndyA 0:a010acebe0ac 153 thunder1Pin = 1;
AndyA 0:a010acebe0ac 154 thunder2Pin = 1;
AndyA 0:a010acebe0ac 155 soundEffectPin = 1;
AndyA 0:a010acebe0ac 156
AndyA 0:a010acebe0ac 157 setupRandom();
AndyA 0:a010acebe0ac 158
AndyA 0:a010acebe0ac 159 float randomTime;
AndyA 0:a010acebe0ac 160 while (true) {
AndyA 0:a010acebe0ac 161 randomTime = minTimeBetweenSounds + (rand() % randomRange)/10.0;
AndyA 0:a010acebe0ac 162 wait(randomTime);
AndyA 0:a010acebe0ac 163 playEffect();
AndyA 0:a010acebe0ac 164 }
AndyA 0:a010acebe0ac 165 }