Dependencies: PCA9955A_library_prototype mbed
main.cpp
- Committer:
- okano
- Date:
- 2014-07-17
- Revision:
- 7:40f2b0db16a6
- Parent:
- 6:4da1c7f560b8
- Child:
- 8:4400ee176f03
File content as of revision 7:40f2b0db16a6:
#include "mbed.h" #include "PCA9955A.h" BusOut leds( LED4, LED3, LED2, LED1 ); DigitalOut pin( p21 ); AnalogIn ain( p20 ); AnalogOut aout( p18 ); PCA9955A led_driver( p28, p27, 0x02 ); // SDA, SCL, I2C_slave_sddress Ticker led_maintenance; Ticker sample_timing; int led_change = 0; int sampling = 0; void set_color( int v ); void led_cntl(); void ad_cntl(); int peak_detect( float in ); void init_setting( void ); int main() { init_setting(); #if 0 led_driver.group_selector( 0x1111, 0x2222, 0x4444, 0x8888 ); // channel assignment for groups led_driver.gradation_setting( 0 ,0xC0 ,0x7 ,0xC4 ,0xFD ); led_driver.gradation_setting( 1 ,0xC0 ,0x7 ,0xC4 ,0xFD ); led_driver.gradation_setting( 2 ,0xC0 ,0x7 ,0xC4 ,0xFD ); led_driver.gradation_setting( 3 ,0xC0 ,0x7 ,0xC4 ,0xFD ); led_driver.gradation_start( 0, CONTINUOUS ); //wait_ms( 1000 ); led_driver.gradation_start( 1, CONTINUOUS ); //wait_ms( 1000 ); led_driver.gradation_start( 2, CONTINUOUS ); //wait_ms( 1000 ); led_driver.gradation_start( 3, CONTINUOUS ); wait_ms( 10000 ); led_driver.gradation_stop(); led_driver.group_selector( 0x0000, 0x0000, 0x0000, 0x0000 ); // all channels are in normal control led_driver.set_all_intensity( 0xFF, true ); #endif set_color( 1 ); led_maintenance.attach( &led_cntl, 0.02 ); sample_timing.attach( &ad_cntl, 0.01 ); while(1) { if ( sampling ) { sampling = 0; led_change = peak_detect( (float)ain ); } } } int peak_detect( float in ) { static float coef = 26.4; static float peak = 0; static float thresold = 0.05; static int shift; static int count = 0; int rtn = 0; pin =0; in = (float)ain; if ( 0.06 < in ) { if ( 200 <= count ) { led_maintenance.attach( &led_cntl, 0.02 ); init_setting(); } count = 0; if ( peak < in ) { if ( thresold < (in - peak) ) { thresold = in - peak; rtn = 1; } peak = in; } } else { if ( 200 == count ) { led_maintenance.attach( NULL, 0.02 ); init_setting(); led_driver.group_selector( 0x1111, 0x2222, 0x4444, 0x8888 ); // channel assignment for groups led_driver.gradation_setting( 0 ,0xC0 ,0x7 ,0xC4 ,0xFD ); led_driver.gradation_setting( 1 ,0xC0 ,0x7 ,0xC4 ,0xFD ); led_driver.gradation_setting( 2 ,0xC0 ,0x7 ,0xC4 ,0xFD ); led_driver.gradation_setting( 3 ,0xC0 ,0x7 ,0xC4 ,0xFD ); led_driver.gradation_start( 0, CONTINUOUS ); } else if ( 300 == count ) { led_driver.gradation_start( 1, CONTINUOUS ); } else if ( 400 == count ) { led_driver.gradation_start( 2, CONTINUOUS ); } else if ( 500 == count ) { led_driver.gradation_start( 3, CONTINUOUS ); } count++; } shift = (int)(coef * peak); leds = 0x1 << shift; peak *= 0.97; thresold*= (thresold < 0.07) ? 0.07 : thresold * 0.9; pin =1; aout = peak; return ( rtn ); } void ad_cntl() { sampling = 1; } void led_cntl() { static int count = 0; static float intensity = 1.0; if ( led_change ) { set_color( count++ & 0x3 ); led_change = 0; intensity = 1.0; } led_driver.set_all_intensity( (char)(intensity * (float)0xFF) ); intensity *= 0.90; } void set_color( int v ) { v = 0x1 << v; led_driver = (v << 12) | (v << 8) | (v << 4) | v; } void init_setting( void ) { led_driver = 0xFFFF; led_driver.set_all_intensity( 0xFF ); led_driver.set_all_intensity( 0x40, true ); led_driver.group_selector( 0x0000, 0x0000, 0x0000, 0x0000 ); // all channels are in normal control }