Dependencies: PCA9955A_library_prototype mbed
main.cpp@7:40f2b0db16a6, 2014-07-17 (annotated)
- Committer:
- okano
- Date:
- Thu Jul 17 10:23:22 2014 +0000
- Revision:
- 7:40f2b0db16a6
- Parent:
- 6:4da1c7f560b8
- Child:
- 8:4400ee176f03
gradation control when the audio is low level
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
okano | 5:78bfbf11bb2f | 1 | #include "mbed.h" |
okano | 2:8a31696f1da5 | 2 | #include "PCA9955A.h" |
okano | 0:71d7b5b100ab | 3 | |
okano | 1:8bcef4962076 | 4 | BusOut leds( LED4, LED3, LED2, LED1 ); |
okano | 4:75a2c3550bdc | 5 | DigitalOut pin( p21 ); |
okano | 0:71d7b5b100ab | 6 | AnalogIn ain( p20 ); |
okano | 5:78bfbf11bb2f | 7 | AnalogOut aout( p18 ); |
okano | 0:71d7b5b100ab | 8 | |
okano | 5:78bfbf11bb2f | 9 | PCA9955A led_driver( p28, p27, 0x02 ); // SDA, SCL, I2C_slave_sddress |
okano | 2:8a31696f1da5 | 10 | |
okano | 5:78bfbf11bb2f | 11 | Ticker led_maintenance; |
okano | 5:78bfbf11bb2f | 12 | Ticker sample_timing; |
okano | 2:8a31696f1da5 | 13 | |
okano | 2:8a31696f1da5 | 14 | int led_change = 0; |
okano | 5:78bfbf11bb2f | 15 | int sampling = 0; |
okano | 2:8a31696f1da5 | 16 | |
okano | 2:8a31696f1da5 | 17 | |
okano | 2:8a31696f1da5 | 18 | void set_color( int v ); |
okano | 2:8a31696f1da5 | 19 | void led_cntl(); |
okano | 5:78bfbf11bb2f | 20 | void ad_cntl(); |
okano | 7:40f2b0db16a6 | 21 | int peak_detect( float in ); |
okano | 7:40f2b0db16a6 | 22 | void init_setting( void ); |
okano | 2:8a31696f1da5 | 23 | |
okano | 2:8a31696f1da5 | 24 | |
okano | 1:8bcef4962076 | 25 | int main() |
okano | 0:71d7b5b100ab | 26 | { |
okano | 7:40f2b0db16a6 | 27 | init_setting(); |
okano | 7:40f2b0db16a6 | 28 | |
okano | 7:40f2b0db16a6 | 29 | #if 0 |
okano | 7:40f2b0db16a6 | 30 | led_driver.group_selector( 0x1111, 0x2222, 0x4444, 0x8888 ); // channel assignment for groups |
okano | 7:40f2b0db16a6 | 31 | led_driver.gradation_setting( 0 ,0xC0 ,0x7 ,0xC4 ,0xFD ); |
okano | 7:40f2b0db16a6 | 32 | led_driver.gradation_setting( 1 ,0xC0 ,0x7 ,0xC4 ,0xFD ); |
okano | 7:40f2b0db16a6 | 33 | led_driver.gradation_setting( 2 ,0xC0 ,0x7 ,0xC4 ,0xFD ); |
okano | 7:40f2b0db16a6 | 34 | led_driver.gradation_setting( 3 ,0xC0 ,0x7 ,0xC4 ,0xFD ); |
okano | 2:8a31696f1da5 | 35 | |
okano | 7:40f2b0db16a6 | 36 | led_driver.gradation_start( 0, CONTINUOUS ); |
okano | 7:40f2b0db16a6 | 37 | //wait_ms( 1000 ); |
okano | 7:40f2b0db16a6 | 38 | led_driver.gradation_start( 1, CONTINUOUS ); |
okano | 7:40f2b0db16a6 | 39 | //wait_ms( 1000 ); |
okano | 7:40f2b0db16a6 | 40 | led_driver.gradation_start( 2, CONTINUOUS ); |
okano | 7:40f2b0db16a6 | 41 | //wait_ms( 1000 ); |
okano | 7:40f2b0db16a6 | 42 | led_driver.gradation_start( 3, CONTINUOUS ); |
okano | 7:40f2b0db16a6 | 43 | wait_ms( 10000 ); |
okano | 7:40f2b0db16a6 | 44 | led_driver.gradation_stop(); |
okano | 7:40f2b0db16a6 | 45 | led_driver.group_selector( 0x0000, 0x0000, 0x0000, 0x0000 ); // all channels are in normal control |
okano | 7:40f2b0db16a6 | 46 | |
okano | 7:40f2b0db16a6 | 47 | led_driver.set_all_intensity( 0xFF, true ); |
okano | 7:40f2b0db16a6 | 48 | #endif |
okano | 2:8a31696f1da5 | 49 | |
okano | 2:8a31696f1da5 | 50 | set_color( 1 ); |
okano | 2:8a31696f1da5 | 51 | |
okano | 5:78bfbf11bb2f | 52 | led_maintenance.attach( &led_cntl, 0.02 ); |
okano | 5:78bfbf11bb2f | 53 | sample_timing.attach( &ad_cntl, 0.01 ); |
okano | 2:8a31696f1da5 | 54 | |
okano | 0:71d7b5b100ab | 55 | while(1) { |
okano | 5:78bfbf11bb2f | 56 | |
okano | 5:78bfbf11bb2f | 57 | if ( sampling ) { |
okano | 5:78bfbf11bb2f | 58 | sampling = 0; |
okano | 7:40f2b0db16a6 | 59 | led_change = peak_detect( (float)ain ); |
okano | 2:8a31696f1da5 | 60 | } |
okano | 0:71d7b5b100ab | 61 | } |
okano | 0:71d7b5b100ab | 62 | |
okano | 0:71d7b5b100ab | 63 | } |
okano | 2:8a31696f1da5 | 64 | |
okano | 6:4da1c7f560b8 | 65 | |
okano | 7:40f2b0db16a6 | 66 | int peak_detect( float in ) |
okano | 6:4da1c7f560b8 | 67 | { |
okano | 7:40f2b0db16a6 | 68 | static float coef = 26.4; |
okano | 7:40f2b0db16a6 | 69 | static float peak = 0; |
okano | 7:40f2b0db16a6 | 70 | static float thresold = 0.05; |
okano | 7:40f2b0db16a6 | 71 | static int shift; |
okano | 7:40f2b0db16a6 | 72 | static int count = 0; |
okano | 7:40f2b0db16a6 | 73 | int rtn = 0; |
okano | 7:40f2b0db16a6 | 74 | |
okano | 7:40f2b0db16a6 | 75 | pin =0; |
okano | 7:40f2b0db16a6 | 76 | in = (float)ain; |
okano | 7:40f2b0db16a6 | 77 | |
okano | 7:40f2b0db16a6 | 78 | if ( 0.06 < in ) { |
okano | 7:40f2b0db16a6 | 79 | if ( 200 <= count ) { |
okano | 7:40f2b0db16a6 | 80 | led_maintenance.attach( &led_cntl, 0.02 ); |
okano | 7:40f2b0db16a6 | 81 | init_setting(); |
okano | 7:40f2b0db16a6 | 82 | } |
okano | 7:40f2b0db16a6 | 83 | count = 0; |
okano | 7:40f2b0db16a6 | 84 | |
okano | 7:40f2b0db16a6 | 85 | if ( peak < in ) { |
okano | 7:40f2b0db16a6 | 86 | if ( thresold < (in - peak) ) { |
okano | 7:40f2b0db16a6 | 87 | thresold = in - peak; |
okano | 7:40f2b0db16a6 | 88 | rtn = 1; |
okano | 7:40f2b0db16a6 | 89 | } |
okano | 7:40f2b0db16a6 | 90 | peak = in; |
okano | 7:40f2b0db16a6 | 91 | } |
okano | 7:40f2b0db16a6 | 92 | } else { |
okano | 7:40f2b0db16a6 | 93 | if ( 200 == count ) { |
okano | 7:40f2b0db16a6 | 94 | led_maintenance.attach( NULL, 0.02 ); |
okano | 7:40f2b0db16a6 | 95 | |
okano | 7:40f2b0db16a6 | 96 | init_setting(); |
okano | 7:40f2b0db16a6 | 97 | led_driver.group_selector( 0x1111, 0x2222, 0x4444, 0x8888 ); // channel assignment for groups |
okano | 7:40f2b0db16a6 | 98 | led_driver.gradation_setting( 0 ,0xC0 ,0x7 ,0xC4 ,0xFD ); |
okano | 7:40f2b0db16a6 | 99 | led_driver.gradation_setting( 1 ,0xC0 ,0x7 ,0xC4 ,0xFD ); |
okano | 7:40f2b0db16a6 | 100 | led_driver.gradation_setting( 2 ,0xC0 ,0x7 ,0xC4 ,0xFD ); |
okano | 7:40f2b0db16a6 | 101 | led_driver.gradation_setting( 3 ,0xC0 ,0x7 ,0xC4 ,0xFD ); |
okano | 7:40f2b0db16a6 | 102 | |
okano | 7:40f2b0db16a6 | 103 | led_driver.gradation_start( 0, CONTINUOUS ); |
okano | 7:40f2b0db16a6 | 104 | |
okano | 7:40f2b0db16a6 | 105 | } else if ( 300 == count ) { |
okano | 7:40f2b0db16a6 | 106 | led_driver.gradation_start( 1, CONTINUOUS ); |
okano | 7:40f2b0db16a6 | 107 | } else if ( 400 == count ) { |
okano | 7:40f2b0db16a6 | 108 | led_driver.gradation_start( 2, CONTINUOUS ); |
okano | 7:40f2b0db16a6 | 109 | } else if ( 500 == count ) { |
okano | 7:40f2b0db16a6 | 110 | led_driver.gradation_start( 3, CONTINUOUS ); |
okano | 7:40f2b0db16a6 | 111 | } |
okano | 7:40f2b0db16a6 | 112 | count++; |
okano | 6:4da1c7f560b8 | 113 | } |
okano | 6:4da1c7f560b8 | 114 | |
okano | 7:40f2b0db16a6 | 115 | shift = (int)(coef * peak); |
okano | 7:40f2b0db16a6 | 116 | leds = 0x1 << shift; |
okano | 7:40f2b0db16a6 | 117 | peak *= 0.97; |
okano | 7:40f2b0db16a6 | 118 | thresold*= (thresold < 0.07) ? 0.07 : thresold * 0.9; |
okano | 7:40f2b0db16a6 | 119 | pin =1; |
okano | 7:40f2b0db16a6 | 120 | aout = peak; |
okano | 7:40f2b0db16a6 | 121 | return ( rtn ); |
okano | 7:40f2b0db16a6 | 122 | } |
okano | 7:40f2b0db16a6 | 123 | |
okano | 5:78bfbf11bb2f | 124 | void ad_cntl() |
okano | 5:78bfbf11bb2f | 125 | { |
okano | 5:78bfbf11bb2f | 126 | sampling = 1; |
okano | 5:78bfbf11bb2f | 127 | } |
okano | 5:78bfbf11bb2f | 128 | |
okano | 5:78bfbf11bb2f | 129 | |
okano | 5:78bfbf11bb2f | 130 | void led_cntl() |
okano | 2:8a31696f1da5 | 131 | { |
okano | 4:75a2c3550bdc | 132 | static int count = 0; |
okano | 2:8a31696f1da5 | 133 | static float intensity = 1.0; |
okano | 2:8a31696f1da5 | 134 | |
okano | 2:8a31696f1da5 | 135 | if ( led_change ) { |
okano | 4:75a2c3550bdc | 136 | set_color( count++ & 0x3 ); |
okano | 2:8a31696f1da5 | 137 | led_change = 0; |
okano | 2:8a31696f1da5 | 138 | intensity = 1.0; |
okano | 2:8a31696f1da5 | 139 | } |
okano | 5:78bfbf11bb2f | 140 | |
okano | 2:8a31696f1da5 | 141 | led_driver.set_all_intensity( (char)(intensity * (float)0xFF) ); |
okano | 5:78bfbf11bb2f | 142 | |
okano | 2:8a31696f1da5 | 143 | intensity *= 0.90; |
okano | 2:8a31696f1da5 | 144 | } |
okano | 2:8a31696f1da5 | 145 | |
okano | 2:8a31696f1da5 | 146 | void set_color( int v ) |
okano | 2:8a31696f1da5 | 147 | { |
okano | 4:75a2c3550bdc | 148 | v = 0x1 << v; |
okano | 2:8a31696f1da5 | 149 | led_driver = (v << 12) | (v << 8) | (v << 4) | v; |
okano | 2:8a31696f1da5 | 150 | } |
okano | 2:8a31696f1da5 | 151 | |
okano | 7:40f2b0db16a6 | 152 | |
okano | 7:40f2b0db16a6 | 153 | void init_setting( void ) |
okano | 7:40f2b0db16a6 | 154 | { |
okano | 7:40f2b0db16a6 | 155 | led_driver = 0xFFFF; |
okano | 7:40f2b0db16a6 | 156 | led_driver.set_all_intensity( 0xFF ); |
okano | 7:40f2b0db16a6 | 157 | led_driver.set_all_intensity( 0x40, true ); |
okano | 7:40f2b0db16a6 | 158 | led_driver.group_selector( 0x0000, 0x0000, 0x0000, 0x0000 ); // all channels are in normal control |
okano | 7:40f2b0db16a6 | 159 | } |
okano | 7:40f2b0db16a6 | 160 |