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: X_NUCLEO_53L0A1 mbed
Fork of Display_53L0A1_WithSatelites by
main.cpp
- Committer:
- JerrySzczurak
- Date:
- 2017-06-12
- Revision:
- 0:eade49d47e3a
- Child:
- 1:9d5c48d409b6
File content as of revision 0:eade49d47e3a:
#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 }