Simple Ranging Example, using Expansion Board Sensor, driven via Interrupts.
Dependencies: mbed X_NUCLEO_53L1A1_mbed
Diff: main.cpp
- Revision:
- 3:b3f70617a6b3
- Parent:
- 1:3483e701ec59
- Child:
- 4:c8932fb926d6
--- a/main.cpp Tue Nov 29 09:15:05 2016 +0000 +++ b/main.cpp Thu Dec 01 14:19:01 2016 +0000 @@ -22,95 +22,27 @@ #define VL53L0_I2C_SDA D14 #define VL53L0_I2C_SCL D15 -#define RANGE 0 - static X_NUCLEO_53L0A1 *board=NULL; -VL53L0X_RangingMeasurementData_t data_sensor_centre; -OperatingMode operating_mode; - -/* flags that handle interrupt request */ -bool int_sensor_centre=false, int_stop_measure=false; - -/* ISR callback function of the sensor_centre */ -void SensorTopIRQ(void) -{ - int_sensor_centre=true; - board->sensor_centre->DisableInterruptMeasureDetectionIRQ(); -} - -/* ISR callback function of the user blue button to stop program */ -void StopMeasureIRQ(void) -{ - int_stop_measure=true; -} -/* On board 4 digit local display refresh */ -void DisplayRefresh(OperatingMode op_mode) -{ - char str[5]; - - if (op_mode==range_single_shot_polling || op_mode==range_continuous_interrupt || op_mode==range_continuous_polling) - { - if (data_sensor_centre.RangeStatus == 0) // we have a valid range. - { - sprintf(str,"%d",data_sensor_centre.RangeMilliMeter); - } - else - { - sprintf(str,"%s","----"); - } - } - - board->display->DisplayString(str); -} - -void RangeMeasure(DevI2C *device_i2c) { - int status; - - /* creates the 53L0A1 expansion board singleton obj */ - board=X_NUCLEO_53L0A1::Instance(device_i2c, A2, D8, D2); - - board->display->DisplayString("53L0"); - /* init the 53L0A1 expansion board with default values */ - status=board->InitBoard(); - if(status) - printf("Failed to init board!\n\r"); -// operating_mode=range_continuous_polling; - operating_mode=range_single_shot_polling; - /* start the measure on sensor top */ - status=board->sensor_centre->StartMeasurement(operating_mode, SensorTopIRQ); - if(!status) - { - while(1) - { - status=board->sensor_centre->GetMeasurement(operating_mode, &data_sensor_centre); - DisplayRefresh(operating_mode); - if(int_stop_measure) // Blue Button isr was triggered - { - status=board->sensor_centre->StopMeasurement(operating_mode); // stop the measure and exit - int_stop_measure = false; - printf("\nProgram stopped!\n\n\r"); - break; - } - } - } - board->display->DisplayString("BYE"); - delete board; -} /*=================================== Main ================================== - Press the blue user button to stop the measurements in progress =============================================================================*/ int main() { -#if USER_BUTTON==PC_13 // we are cross compiling for Nucleo-f401 - InterruptIn stop_button (USER_BUTTON); - stop_button.rise (&StopMeasureIRQ); -#endif - DevI2C *device_i2c =new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL); - - RangeMeasure(device_i2c); // start continuous measures + int status; + uint32_t distance; + DevI2C *device_i2c =new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL); + + /* creates the 53L0A1 expansion board singleton obj */ + board=X_NUCLEO_53L0A1::Instance(device_i2c, A2, D8, D2); + + /* init the 53L0A1 expansion board with default values */ + status=board->InitBoard(); + if(status) { printf("Failed to init board!\n\r"); return 0; } + while(1) + { + board->sensor_centre->GetDistance(&distance); + printf("Distance : %ld\n", distance); + } } - -