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@0:eade49d47e3a, 2017-06-12 (annotated)
- Committer:
- JerrySzczurak
- Date:
- Mon Jun 12 15:01:09 2017 +0000
- Revision:
- 0:eade49d47e3a
- Child:
- 1:9d5c48d409b6
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
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
JerrySzczurak | 0:eade49d47e3a | 1 | #include "mbed.h" |
JerrySzczurak | 0:eade49d47e3a | 2 | #include "x_nucleo_53l0a1.h" |
JerrySzczurak | 0:eade49d47e3a | 3 | #include <string.h> |
JerrySzczurak | 0:eade49d47e3a | 4 | #include <stdlib.h> |
JerrySzczurak | 0:eade49d47e3a | 5 | #include <stdio.h> |
JerrySzczurak | 0:eade49d47e3a | 6 | #include <assert.h> |
JerrySzczurak | 0:eade49d47e3a | 7 | |
JerrySzczurak | 0:eade49d47e3a | 8 | /* This VL53L0X Expansion board test application performs a range measurement in polling mode |
JerrySzczurak | 0:eade49d47e3a | 9 | on the onboard embedded top sensor. |
JerrySzczurak | 0:eade49d47e3a | 10 | The measured data is displayed on the on-board 4-digit display. |
JerrySzczurak | 0:eade49d47e3a | 11 | |
JerrySzczurak | 0:eade49d47e3a | 12 | User Blue button stops the current measurement and the entire program, releasing all resources. |
JerrySzczurak | 0:eade49d47e3a | 13 | Reset button is used to restart the program. */ |
JerrySzczurak | 0:eade49d47e3a | 14 | |
JerrySzczurak | 0:eade49d47e3a | 15 | /* Polling operating modes don`t require callback function that handles IRQ |
JerrySzczurak | 0:eade49d47e3a | 16 | Callback IRQ functions are used only for measure that require interrupt */ |
JerrySzczurak | 0:eade49d47e3a | 17 | |
JerrySzczurak | 0:eade49d47e3a | 18 | /* GetMeasurement is asynchronous! It returns NOT_READY if the measurement value |
JerrySzczurak | 0:eade49d47e3a | 19 | is not ready to be read from the corresponding register. So you need to wait |
JerrySzczurak | 0:eade49d47e3a | 20 | for the result to be ready */ |
JerrySzczurak | 0:eade49d47e3a | 21 | |
JerrySzczurak | 0:eade49d47e3a | 22 | #define VL53L0_I2C_SDA D14 |
JerrySzczurak | 0:eade49d47e3a | 23 | #define VL53L0_I2C_SCL D15 |
JerrySzczurak | 0:eade49d47e3a | 24 | |
JerrySzczurak | 0:eade49d47e3a | 25 | #define RANGE 0 |
JerrySzczurak | 0:eade49d47e3a | 26 | |
JerrySzczurak | 0:eade49d47e3a | 27 | static X_NUCLEO_53L0A1 *board=NULL; |
JerrySzczurak | 0:eade49d47e3a | 28 | VL53L0X_RangingMeasurementData_t data_sensor; |
JerrySzczurak | 0:eade49d47e3a | 29 | OperatingMode operating_mode; |
JerrySzczurak | 0:eade49d47e3a | 30 | |
JerrySzczurak | 0:eade49d47e3a | 31 | /* flags that handle interrupt request */ |
JerrySzczurak | 0:eade49d47e3a | 32 | volatile bool int_sensor_centre=false; |
JerrySzczurak | 0:eade49d47e3a | 33 | /* Current sensor number*/ |
JerrySzczurak | 0:eade49d47e3a | 34 | int currentSensor = 0; |
JerrySzczurak | 0:eade49d47e3a | 35 | int sensorCnt = 0; |
JerrySzczurak | 0:eade49d47e3a | 36 | |
JerrySzczurak | 0:eade49d47e3a | 37 | struct Sensors |
JerrySzczurak | 0:eade49d47e3a | 38 | { |
JerrySzczurak | 0:eade49d47e3a | 39 | char prefix; |
JerrySzczurak | 0:eade49d47e3a | 40 | VL53L0X *sensorPtr; |
JerrySzczurak | 0:eade49d47e3a | 41 | } installedSensors[3]; |
JerrySzczurak | 0:eade49d47e3a | 42 | |
JerrySzczurak | 0:eade49d47e3a | 43 | |
JerrySzczurak | 0:eade49d47e3a | 44 | /* ISR callback function of the sensor_centre */ |
JerrySzczurak | 0:eade49d47e3a | 45 | void SensorTopIRQ(void) |
JerrySzczurak | 0:eade49d47e3a | 46 | { |
JerrySzczurak | 0:eade49d47e3a | 47 | int_sensor_centre=true; |
JerrySzczurak | 0:eade49d47e3a | 48 | board->sensor_centre->DisableInterruptMeasureDetectionIRQ(); |
JerrySzczurak | 0:eade49d47e3a | 49 | } |
JerrySzczurak | 0:eade49d47e3a | 50 | |
JerrySzczurak | 0:eade49d47e3a | 51 | /* ISR callback function of the user blue button to switch measuring sensor. */ |
JerrySzczurak | 0:eade49d47e3a | 52 | void SwitchMeasuringSensorIRQ(void) |
JerrySzczurak | 0:eade49d47e3a | 53 | { |
JerrySzczurak | 0:eade49d47e3a | 54 | ++currentSensor; |
JerrySzczurak | 0:eade49d47e3a | 55 | if (currentSensor == sensorCnt) |
JerrySzczurak | 0:eade49d47e3a | 56 | currentSensor = 0; |
JerrySzczurak | 0:eade49d47e3a | 57 | printf("Sensor changed to %c\r\n",installedSensors[currentSensor].prefix); |
JerrySzczurak | 0:eade49d47e3a | 58 | } |
JerrySzczurak | 0:eade49d47e3a | 59 | |
JerrySzczurak | 0:eade49d47e3a | 60 | /* On board 4 digit local display refresh */ |
JerrySzczurak | 0:eade49d47e3a | 61 | void DisplayRefresh(OperatingMode op_mode) |
JerrySzczurak | 0:eade49d47e3a | 62 | { |
JerrySzczurak | 0:eade49d47e3a | 63 | char str[4]; |
JerrySzczurak | 0:eade49d47e3a | 64 | |
JerrySzczurak | 0:eade49d47e3a | 65 | if (op_mode==range_single_shot_polling || op_mode==range_continuous_interrupt || op_mode==range_continuous_polling) |
JerrySzczurak | 0:eade49d47e3a | 66 | { |
JerrySzczurak | 0:eade49d47e3a | 67 | for (int t=0; t < sensorCnt; t++) |
JerrySzczurak | 0:eade49d47e3a | 68 | { |
JerrySzczurak | 0:eade49d47e3a | 69 | installedSensors[t].sensorPtr->GetMeasurement(operating_mode, &data_sensor); |
JerrySzczurak | 0:eade49d47e3a | 70 | if (data_sensor.RangeStatus == 0) // we have a valid range. |
JerrySzczurak | 0:eade49d47e3a | 71 | { |
JerrySzczurak | 0:eade49d47e3a | 72 | printf("%c %4d; ", installedSensors[t].prefix,data_sensor.RangeMilliMeter); |
JerrySzczurak | 0:eade49d47e3a | 73 | if (currentSensor == t) |
JerrySzczurak | 0:eade49d47e3a | 74 | { |
JerrySzczurak | 0:eade49d47e3a | 75 | sprintf(str,"%c%3d", installedSensors[t].prefix ,data_sensor.RangeMilliMeter); |
JerrySzczurak | 0:eade49d47e3a | 76 | } |
JerrySzczurak | 0:eade49d47e3a | 77 | } |
JerrySzczurak | 0:eade49d47e3a | 78 | else |
JerrySzczurak | 0:eade49d47e3a | 79 | { |
JerrySzczurak | 0:eade49d47e3a | 80 | printf("%c ----; ", installedSensors[t].prefix); |
JerrySzczurak | 0:eade49d47e3a | 81 | if (currentSensor == t) |
JerrySzczurak | 0:eade49d47e3a | 82 | { |
JerrySzczurak | 0:eade49d47e3a | 83 | sprintf(str,"%c%s", installedSensors[t].prefix, "---"); |
JerrySzczurak | 0:eade49d47e3a | 84 | } |
JerrySzczurak | 0:eade49d47e3a | 85 | } |
JerrySzczurak | 0:eade49d47e3a | 86 | } |
JerrySzczurak | 0:eade49d47e3a | 87 | printf("\r\n"); |
JerrySzczurak | 0:eade49d47e3a | 88 | } |
JerrySzczurak | 0:eade49d47e3a | 89 | board->display->DisplayString(str); |
JerrySzczurak | 0:eade49d47e3a | 90 | } |
JerrySzczurak | 0:eade49d47e3a | 91 | |
JerrySzczurak | 0:eade49d47e3a | 92 | void RangeMeasure(DevI2C *device_i2c) { |
JerrySzczurak | 0:eade49d47e3a | 93 | int status; |
JerrySzczurak | 0:eade49d47e3a | 94 | |
JerrySzczurak | 0:eade49d47e3a | 95 | /* creates the 53L0A1 expansion board singleton obj */ |
JerrySzczurak | 0:eade49d47e3a | 96 | board=X_NUCLEO_53L0A1::Instance(device_i2c, A2, D8, D2); |
JerrySzczurak | 0:eade49d47e3a | 97 | |
JerrySzczurak | 0:eade49d47e3a | 98 | board->display->DisplayString("53L0"); |
JerrySzczurak | 0:eade49d47e3a | 99 | /* init the 53L0A1 expansion board with default values */ |
JerrySzczurak | 0:eade49d47e3a | 100 | status=board->InitBoard(); |
JerrySzczurak | 0:eade49d47e3a | 101 | if(status) |
JerrySzczurak | 0:eade49d47e3a | 102 | printf("Failed to init board!\n\r"); |
JerrySzczurak | 0:eade49d47e3a | 103 | operating_mode=range_single_shot_polling; |
JerrySzczurak | 0:eade49d47e3a | 104 | /* start the measure on sensor top */ |
JerrySzczurak | 0:eade49d47e3a | 105 | if (NULL != board->sensor_centre) |
JerrySzczurak | 0:eade49d47e3a | 106 | { |
JerrySzczurak | 0:eade49d47e3a | 107 | installedSensors[sensorCnt].prefix = 'C'; |
JerrySzczurak | 0:eade49d47e3a | 108 | installedSensors[sensorCnt].sensorPtr = board->sensor_centre; |
JerrySzczurak | 0:eade49d47e3a | 109 | ++sensorCnt; |
JerrySzczurak | 0:eade49d47e3a | 110 | status=board->sensor_centre->StartMeasurement(operating_mode, SensorTopIRQ); |
JerrySzczurak | 0:eade49d47e3a | 111 | } |
JerrySzczurak | 0:eade49d47e3a | 112 | if (NULL != board->sensor_left) |
JerrySzczurak | 0:eade49d47e3a | 113 | { |
JerrySzczurak | 0:eade49d47e3a | 114 | installedSensors[sensorCnt].prefix='L'; |
JerrySzczurak | 0:eade49d47e3a | 115 | installedSensors[sensorCnt].sensorPtr = board->sensor_left; |
JerrySzczurak | 0:eade49d47e3a | 116 | ++sensorCnt; |
JerrySzczurak | 0:eade49d47e3a | 117 | status=board->sensor_left->StartMeasurement(operating_mode, SensorTopIRQ); |
JerrySzczurak | 0:eade49d47e3a | 118 | } |
JerrySzczurak | 0:eade49d47e3a | 119 | if (NULL != board->sensor_right) |
JerrySzczurak | 0:eade49d47e3a | 120 | { |
JerrySzczurak | 0:eade49d47e3a | 121 | installedSensors[sensorCnt].prefix = 'R'; |
JerrySzczurak | 0:eade49d47e3a | 122 | installedSensors[sensorCnt].sensorPtr = board->sensor_right; |
JerrySzczurak | 0:eade49d47e3a | 123 | ++sensorCnt; |
JerrySzczurak | 0:eade49d47e3a | 124 | status=board->sensor_right->StartMeasurement(operating_mode, SensorTopIRQ); |
JerrySzczurak | 0:eade49d47e3a | 125 | } |
JerrySzczurak | 0:eade49d47e3a | 126 | |
JerrySzczurak | 0:eade49d47e3a | 127 | currentSensor = 0; |
JerrySzczurak | 0:eade49d47e3a | 128 | |
JerrySzczurak | 0:eade49d47e3a | 129 | if(!status) |
JerrySzczurak | 0:eade49d47e3a | 130 | { |
JerrySzczurak | 0:eade49d47e3a | 131 | while(1) |
JerrySzczurak | 0:eade49d47e3a | 132 | { |
JerrySzczurak | 0:eade49d47e3a | 133 | DisplayRefresh(operating_mode); |
JerrySzczurak | 0:eade49d47e3a | 134 | } |
JerrySzczurak | 0:eade49d47e3a | 135 | } |
JerrySzczurak | 0:eade49d47e3a | 136 | board->display->DisplayString("BYE"); |
JerrySzczurak | 0:eade49d47e3a | 137 | delete board; |
JerrySzczurak | 0:eade49d47e3a | 138 | } |
JerrySzczurak | 0:eade49d47e3a | 139 | |
JerrySzczurak | 0:eade49d47e3a | 140 | /*=================================== Main ================================== |
JerrySzczurak | 0:eade49d47e3a | 141 | Press the blue user button to stop the measurements in progress |
JerrySzczurak | 0:eade49d47e3a | 142 | =============================================================================*/ |
JerrySzczurak | 0:eade49d47e3a | 143 | int main() |
JerrySzczurak | 0:eade49d47e3a | 144 | { |
JerrySzczurak | 0:eade49d47e3a | 145 | #if USER_BUTTON==PC_13 // we are cross compiling for Nucleo-f401 |
JerrySzczurak | 0:eade49d47e3a | 146 | InterruptIn stop_button (USER_BUTTON); |
JerrySzczurak | 0:eade49d47e3a | 147 | stop_button.rise (&SwitchMeasuringSensorIRQ); |
JerrySzczurak | 0:eade49d47e3a | 148 | #endif |
JerrySzczurak | 0:eade49d47e3a | 149 | DevI2C *device_i2c =new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL); |
JerrySzczurak | 0:eade49d47e3a | 150 | RangeMeasure(device_i2c); // start continuous measures |
JerrySzczurak | 0:eade49d47e3a | 151 | } |
JerrySzczurak | 0:eade49d47e3a | 152 |