
Sample ranging example. Suporting up to 3 sensors. Sending result from X-NUCLEO-53L0A1 both on com port and on digit display. User button IRQ used for switching displayed sensor
Dependencies: mbed X_NUCLEO_53L0A1
Fork of Display_53L0A1_WithSatelites by
Revision 0:eade49d47e3a, committed 2017-06-12
- Comitter:
- JerrySzczurak
- Date:
- Mon Jun 12 15:01:09 2017 +0000
- Child:
- 1:9d5c48d409b6
- Commit message:
- Sample ranging example. Suporting up to 3 sensors. Sendinf result from X-NUCLEO-53L0A1 both on com port and on digit display. User button IRQ used for switching displayed sensor
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/X_NUCLEO_53L0A1.lib Mon Jun 12 15:01:09 2017 +0000 @@ -0,0 +1,1 @@ +https://developer.mbed.org/teams/ST/code/X_NUCLEO_53L0A1/#ceaa5a026412
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Jun 12 15:01:09 2017 +0000 @@ -0,0 +1,152 @@ +#include "mbed.h" +#include "x_nucleo_53l0a1.h" +#include <string.h> +#include <stdlib.h> +#include <stdio.h> +#include <assert.h> + +/* This VL53L0X Expansion board test application performs a range measurement in polling mode + on the onboard embedded top sensor. + The measured data is displayed on the on-board 4-digit display. + + User Blue button stops the current measurement and the entire program, releasing all resources. + Reset button is used to restart the program. */ + +/* Polling operating modes don`t require callback function that handles IRQ + Callback IRQ functions are used only for measure that require interrupt */ + +/* GetMeasurement is asynchronous! It returns NOT_READY if the measurement value + is not ready to be read from the corresponding register. So you need to wait + for the result to be ready */ + +#define VL53L0_I2C_SDA D14 +#define VL53L0_I2C_SCL D15 + +#define RANGE 0 + +static X_NUCLEO_53L0A1 *board=NULL; +VL53L0X_RangingMeasurementData_t data_sensor; +OperatingMode operating_mode; + +/* flags that handle interrupt request */ +volatile bool int_sensor_centre=false; +/* Current sensor number*/ +int currentSensor = 0; +int sensorCnt = 0; + +struct Sensors +{ + char prefix; + VL53L0X *sensorPtr; +} installedSensors[3]; + + +/* 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 switch measuring sensor. */ +void SwitchMeasuringSensorIRQ(void) +{ + ++currentSensor; + if (currentSensor == sensorCnt) + currentSensor = 0; + printf("Sensor changed to %c\r\n",installedSensors[currentSensor].prefix); +} + +/* On board 4 digit local display refresh */ +void DisplayRefresh(OperatingMode op_mode) +{ + char str[4]; + + if (op_mode==range_single_shot_polling || op_mode==range_continuous_interrupt || op_mode==range_continuous_polling) + { + for (int t=0; t < sensorCnt; t++) + { + installedSensors[t].sensorPtr->GetMeasurement(operating_mode, &data_sensor); + if (data_sensor.RangeStatus == 0) // we have a valid range. + { + printf("%c %4d; ", installedSensors[t].prefix,data_sensor.RangeMilliMeter); + if (currentSensor == t) + { + sprintf(str,"%c%3d", installedSensors[t].prefix ,data_sensor.RangeMilliMeter); + } + } + else + { + printf("%c ----; ", installedSensors[t].prefix); + if (currentSensor == t) + { + sprintf(str,"%c%s", installedSensors[t].prefix, "---"); + } + } + } + printf("\r\n"); + } + 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_single_shot_polling; + /* start the measure on sensor top */ + if (NULL != board->sensor_centre) + { + installedSensors[sensorCnt].prefix = 'C'; + installedSensors[sensorCnt].sensorPtr = board->sensor_centre; + ++sensorCnt; + status=board->sensor_centre->StartMeasurement(operating_mode, SensorTopIRQ); + } + if (NULL != board->sensor_left) + { + installedSensors[sensorCnt].prefix='L'; + installedSensors[sensorCnt].sensorPtr = board->sensor_left; + ++sensorCnt; + status=board->sensor_left->StartMeasurement(operating_mode, SensorTopIRQ); + } + if (NULL != board->sensor_right) + { + installedSensors[sensorCnt].prefix = 'R'; + installedSensors[sensorCnt].sensorPtr = board->sensor_right; + ++sensorCnt; + status=board->sensor_right->StartMeasurement(operating_mode, SensorTopIRQ); + } + + currentSensor = 0; + + if(!status) + { + while(1) + { + DisplayRefresh(operating_mode); + } + } + 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 (&SwitchMeasuringSensorIRQ); +#endif + DevI2C *device_i2c =new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL); + RangeMeasure(device_i2c); // start continuous measures +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Mon Jun 12 15:01:09 2017 +0000 @@ -0,0 +1,1 @@ +https://mbed.org/users/mbed_official/code/mbed/builds/0f02307a0877 \ No newline at end of file