Andy A
/
SoundEffects
Triggers Lightning LED and sounds effects
effects.cpp@0:a010acebe0ac, 2016-09-27 (annotated)
- Committer:
- AndyA
- Date:
- Tue Sep 27 11:06:11 2016 +0000
- Revision:
- 0:a010acebe0ac
Who changed what in which revision?
User | Revision | Line number | New 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 | } |