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
main.cpp@1:9d5c48d409b6, 2017-06-14 (annotated)
- Committer:
- JerrySzczurak
- Date:
- Wed Jun 14 09:14:13 2017 +0000
- Revision:
- 1:9d5c48d409b6
- Parent:
- 0:eade49d47e3a
- Child:
- 2:a3bc0a0af780
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
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 | 1:9d5c48d409b6 | 9 | on the sensors. The demo supports the centre sensor and up to 2 satelites boards. |
JerrySzczurak | 1:9d5c48d409b6 | 10 | |
JerrySzczurak | 1:9d5c48d409b6 | 11 | The User Blue button controls the selected sensor. Measurements from this sensor are displayed |
JerrySzczurak | 1:9d5c48d409b6 | 12 | on the 4-digit display. |
JerrySzczurak | 1:9d5c48d409b6 | 13 | Data collected from all sensors is also sent on the com port. |
JerrySzczurak | 1:9d5c48d409b6 | 14 | |
JerrySzczurak | 1:9d5c48d409b6 | 15 | The Reset button is used to restart the program. |
JerrySzczurak | 1:9d5c48d409b6 | 16 | */ |
JerrySzczurak | 0:eade49d47e3a | 17 | |
JerrySzczurak | 0:eade49d47e3a | 18 | #define VL53L0_I2C_SDA D14 |
JerrySzczurak | 0:eade49d47e3a | 19 | #define VL53L0_I2C_SCL D15 |
JerrySzczurak | 0:eade49d47e3a | 20 | |
JerrySzczurak | 0:eade49d47e3a | 21 | static X_NUCLEO_53L0A1 *board=NULL; |
JerrySzczurak | 0:eade49d47e3a | 22 | VL53L0X_RangingMeasurementData_t data_sensor; |
JerrySzczurak | 0:eade49d47e3a | 23 | OperatingMode operating_mode; |
JerrySzczurak | 0:eade49d47e3a | 24 | |
JerrySzczurak | 0:eade49d47e3a | 25 | /* Current sensor number*/ |
JerrySzczurak | 1:9d5c48d409b6 | 26 | int currentSensor = 0; |
JerrySzczurak | 1:9d5c48d409b6 | 27 | /* Installed sensors count */ |
JerrySzczurak | 0:eade49d47e3a | 28 | int sensorCnt = 0; |
JerrySzczurak | 0:eade49d47e3a | 29 | |
JerrySzczurak | 1:9d5c48d409b6 | 30 | /* array storing pointers to the sensors and their prefixes for the display purpouse*/ |
JerrySzczurak | 0:eade49d47e3a | 31 | struct Sensors |
JerrySzczurak | 0:eade49d47e3a | 32 | { |
JerrySzczurak | 0:eade49d47e3a | 33 | char prefix; |
JerrySzczurak | 0:eade49d47e3a | 34 | VL53L0X *sensorPtr; |
JerrySzczurak | 0:eade49d47e3a | 35 | } installedSensors[3]; |
JerrySzczurak | 0:eade49d47e3a | 36 | |
JerrySzczurak | 1:9d5c48d409b6 | 37 | int InitSensorsArray() |
JerrySzczurak | 0:eade49d47e3a | 38 | { |
JerrySzczurak | 1:9d5c48d409b6 | 39 | int status = 1; |
JerrySzczurak | 1:9d5c48d409b6 | 40 | /* start the measure on sensor top */ |
JerrySzczurak | 1:9d5c48d409b6 | 41 | if (NULL != board->sensor_centre) |
JerrySzczurak | 1:9d5c48d409b6 | 42 | { |
JerrySzczurak | 1:9d5c48d409b6 | 43 | installedSensors[sensorCnt].prefix = 'C'; |
JerrySzczurak | 1:9d5c48d409b6 | 44 | installedSensors[sensorCnt].sensorPtr = board->sensor_centre; |
JerrySzczurak | 1:9d5c48d409b6 | 45 | ++sensorCnt; |
JerrySzczurak | 1:9d5c48d409b6 | 46 | status=board->sensor_centre->StartMeasurement(operating_mode, NULL); |
JerrySzczurak | 1:9d5c48d409b6 | 47 | } |
JerrySzczurak | 1:9d5c48d409b6 | 48 | /* start the measure on sensor left if present */ |
JerrySzczurak | 1:9d5c48d409b6 | 49 | if (NULL != board->sensor_left) |
JerrySzczurak | 1:9d5c48d409b6 | 50 | { |
JerrySzczurak | 1:9d5c48d409b6 | 51 | installedSensors[sensorCnt].prefix='L'; |
JerrySzczurak | 1:9d5c48d409b6 | 52 | installedSensors[sensorCnt].sensorPtr = board->sensor_left; |
JerrySzczurak | 1:9d5c48d409b6 | 53 | ++sensorCnt; |
JerrySzczurak | 1:9d5c48d409b6 | 54 | status=board->sensor_left->StartMeasurement(operating_mode, NULL); |
JerrySzczurak | 1:9d5c48d409b6 | 55 | } |
JerrySzczurak | 1:9d5c48d409b6 | 56 | /* start the measure on sensor right if present */ |
JerrySzczurak | 1:9d5c48d409b6 | 57 | if (NULL != board->sensor_right) |
JerrySzczurak | 1:9d5c48d409b6 | 58 | { |
JerrySzczurak | 1:9d5c48d409b6 | 59 | installedSensors[sensorCnt].prefix = 'R'; |
JerrySzczurak | 1:9d5c48d409b6 | 60 | installedSensors[sensorCnt].sensorPtr = board->sensor_right; |
JerrySzczurak | 1:9d5c48d409b6 | 61 | ++sensorCnt; |
JerrySzczurak | 1:9d5c48d409b6 | 62 | status=board->sensor_right->StartMeasurement(operating_mode, NULL); |
JerrySzczurak | 1:9d5c48d409b6 | 63 | } |
JerrySzczurak | 1:9d5c48d409b6 | 64 | /* set first displayed sensor to embedded top */ |
JerrySzczurak | 1:9d5c48d409b6 | 65 | currentSensor = 0; |
JerrySzczurak | 1:9d5c48d409b6 | 66 | return status; |
JerrySzczurak | 1:9d5c48d409b6 | 67 | } |
JerrySzczurak | 0:eade49d47e3a | 68 | |
JerrySzczurak | 0:eade49d47e3a | 69 | /* ISR callback function of the user blue button to switch measuring sensor. */ |
JerrySzczurak | 0:eade49d47e3a | 70 | void SwitchMeasuringSensorIRQ(void) |
JerrySzczurak | 0:eade49d47e3a | 71 | { |
JerrySzczurak | 0:eade49d47e3a | 72 | ++currentSensor; |
JerrySzczurak | 0:eade49d47e3a | 73 | if (currentSensor == sensorCnt) |
JerrySzczurak | 0:eade49d47e3a | 74 | currentSensor = 0; |
JerrySzczurak | 0:eade49d47e3a | 75 | printf("Sensor changed to %c\r\n",installedSensors[currentSensor].prefix); |
JerrySzczurak | 0:eade49d47e3a | 76 | } |
JerrySzczurak | 0:eade49d47e3a | 77 | |
JerrySzczurak | 1:9d5c48d409b6 | 78 | /* On board 4 digit local display refresh*/ |
JerrySzczurak | 0:eade49d47e3a | 79 | void DisplayRefresh(OperatingMode op_mode) |
JerrySzczurak | 0:eade49d47e3a | 80 | { |
JerrySzczurak | 1:9d5c48d409b6 | 81 | char str[4]; |
JerrySzczurak | 0:eade49d47e3a | 82 | |
JerrySzczurak | 1:9d5c48d409b6 | 83 | for (int t=0; t < sensorCnt; t++) |
JerrySzczurak | 1:9d5c48d409b6 | 84 | { |
JerrySzczurak | 1:9d5c48d409b6 | 85 | installedSensors[t].sensorPtr->GetMeasurement(op_mode, &data_sensor); |
JerrySzczurak | 1:9d5c48d409b6 | 86 | if (data_sensor.RangeStatus == 0) // we have a valid range. |
JerrySzczurak | 1:9d5c48d409b6 | 87 | { |
JerrySzczurak | 1:9d5c48d409b6 | 88 | printf("%c %4d; ", installedSensors[t].prefix,data_sensor.RangeMilliMeter); |
JerrySzczurak | 1:9d5c48d409b6 | 89 | if (currentSensor == t) |
JerrySzczurak | 0:eade49d47e3a | 90 | { |
JerrySzczurak | 1:9d5c48d409b6 | 91 | sprintf(str,"%c%3d", installedSensors[t].prefix ,data_sensor.RangeMilliMeter); |
JerrySzczurak | 0:eade49d47e3a | 92 | } |
JerrySzczurak | 1:9d5c48d409b6 | 93 | } |
JerrySzczurak | 1:9d5c48d409b6 | 94 | else |
JerrySzczurak | 1:9d5c48d409b6 | 95 | { |
JerrySzczurak | 1:9d5c48d409b6 | 96 | printf("%c ----; ", installedSensors[t].prefix); |
JerrySzczurak | 1:9d5c48d409b6 | 97 | if (currentSensor == t) |
JerrySzczurak | 1:9d5c48d409b6 | 98 | { |
JerrySzczurak | 1:9d5c48d409b6 | 99 | sprintf(str,"%c%s", installedSensors[t].prefix, "---"); |
JerrySzczurak | 1:9d5c48d409b6 | 100 | } |
JerrySzczurak | 1:9d5c48d409b6 | 101 | } |
JerrySzczurak | 1:9d5c48d409b6 | 102 | } |
JerrySzczurak | 1:9d5c48d409b6 | 103 | printf("\r\n"); |
JerrySzczurak | 1:9d5c48d409b6 | 104 | board->display->DisplayString(str); |
JerrySzczurak | 0:eade49d47e3a | 105 | } |
JerrySzczurak | 0:eade49d47e3a | 106 | |
JerrySzczurak | 0:eade49d47e3a | 107 | void RangeMeasure(DevI2C *device_i2c) { |
JerrySzczurak | 0:eade49d47e3a | 108 | int status; |
JerrySzczurak | 0:eade49d47e3a | 109 | |
JerrySzczurak | 0:eade49d47e3a | 110 | /* creates the 53L0A1 expansion board singleton obj */ |
JerrySzczurak | 0:eade49d47e3a | 111 | board=X_NUCLEO_53L0A1::Instance(device_i2c, A2, D8, D2); |
JerrySzczurak | 0:eade49d47e3a | 112 | |
JerrySzczurak | 0:eade49d47e3a | 113 | board->display->DisplayString("53L0"); |
JerrySzczurak | 0:eade49d47e3a | 114 | /* init the 53L0A1 expansion board with default values */ |
JerrySzczurak | 0:eade49d47e3a | 115 | status=board->InitBoard(); |
JerrySzczurak | 0:eade49d47e3a | 116 | if(status) |
JerrySzczurak | 0:eade49d47e3a | 117 | printf("Failed to init board!\n\r"); |
JerrySzczurak | 0:eade49d47e3a | 118 | operating_mode=range_single_shot_polling; |
JerrySzczurak | 1:9d5c48d409b6 | 119 | |
JerrySzczurak | 1:9d5c48d409b6 | 120 | status = InitSensorsArray(); |
JerrySzczurak | 0:eade49d47e3a | 121 | |
JerrySzczurak | 0:eade49d47e3a | 122 | if(!status) |
JerrySzczurak | 0:eade49d47e3a | 123 | { |
JerrySzczurak | 0:eade49d47e3a | 124 | while(1) |
JerrySzczurak | 0:eade49d47e3a | 125 | { |
JerrySzczurak | 0:eade49d47e3a | 126 | DisplayRefresh(operating_mode); |
JerrySzczurak | 0:eade49d47e3a | 127 | } |
JerrySzczurak | 0:eade49d47e3a | 128 | } |
JerrySzczurak | 0:eade49d47e3a | 129 | board->display->DisplayString("BYE"); |
JerrySzczurak | 0:eade49d47e3a | 130 | delete board; |
JerrySzczurak | 0:eade49d47e3a | 131 | } |
JerrySzczurak | 0:eade49d47e3a | 132 | |
JerrySzczurak | 0:eade49d47e3a | 133 | /*=================================== Main ================================== |
JerrySzczurak | 1:9d5c48d409b6 | 134 | Press the blue user button to switch the sensor. |
JerrySzczurak | 0:eade49d47e3a | 135 | =============================================================================*/ |
JerrySzczurak | 0:eade49d47e3a | 136 | int main() |
JerrySzczurak | 0:eade49d47e3a | 137 | { |
JerrySzczurak | 0:eade49d47e3a | 138 | #if USER_BUTTON==PC_13 // we are cross compiling for Nucleo-f401 |
JerrySzczurak | 0:eade49d47e3a | 139 | InterruptIn stop_button (USER_BUTTON); |
JerrySzczurak | 0:eade49d47e3a | 140 | stop_button.rise (&SwitchMeasuringSensorIRQ); |
JerrySzczurak | 0:eade49d47e3a | 141 | #endif |
JerrySzczurak | 0:eade49d47e3a | 142 | DevI2C *device_i2c =new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL); |
JerrySzczurak | 0:eade49d47e3a | 143 | RangeMeasure(device_i2c); // start continuous measures |
JerrySzczurak | 0:eade49d47e3a | 144 | } |
JerrySzczurak | 0:eade49d47e3a | 145 |