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@4:3c5cc844a7e5, 2019-06-06 (annotated)
- Committer:
- johnAlexander
- Date:
- Thu Jun 06 09:11:02 2019 +0000
- Revision:
- 4:3c5cc844a7e5
- Parent:
- 3:ff6e42401073
Use published. mbed-certified board and sensor libraries.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
JerrySzczurak | 0:eade49d47e3a | 1 | #include "mbed.h" |
johnAlexander | 4:3c5cc844a7e5 | 2 | #include "XNucleo53L0A1.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 |
johnAlexander | 2:a3bc0a0af780 | 9 | on the sensors. The demo supports the centre sensor and up to 2 satellites boards. |
johnAlexander | 3:ff6e42401073 | 10 | |
johnAlexander | 3:ff6e42401073 | 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. |
johnAlexander | 3:ff6e42401073 | 14 | |
johnAlexander | 3:ff6e42401073 | 15 | The Reset button is used to restart the program. |
JerrySzczurak | 1:9d5c48d409b6 | 16 | */ |
JerrySzczurak | 0:eade49d47e3a | 17 | |
johnAlexander | 3:ff6e42401073 | 18 | #define VL53L0_I2C_SDA D14 |
johnAlexander | 3:ff6e42401073 | 19 | #define VL53L0_I2C_SCL D15 |
JerrySzczurak | 0:eade49d47e3a | 20 | |
johnAlexander | 4:3c5cc844a7e5 | 21 | static XNucleo53L0A1 *board = NULL; |
JerrySzczurak | 0:eade49d47e3a | 22 | VL53L0X_RangingMeasurementData_t data_sensor; |
JerrySzczurak | 0:eade49d47e3a | 23 | OperatingMode operating_mode; |
johnAlexander | 3:ff6e42401073 | 24 | |
JerrySzczurak | 0:eade49d47e3a | 25 | /* Current sensor number*/ |
JerrySzczurak | 1:9d5c48d409b6 | 26 | int currentSensor = 0; |
johnAlexander | 3:ff6e42401073 | 27 | /* Installed sensors count */ |
johnAlexander | 3:ff6e42401073 | 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*/ |
johnAlexander | 3:ff6e42401073 | 31 | struct Sensors { |
JerrySzczurak | 0:eade49d47e3a | 32 | char prefix; |
JerrySzczurak | 0:eade49d47e3a | 33 | VL53L0X *sensorPtr; |
JerrySzczurak | 0:eade49d47e3a | 34 | } installedSensors[3]; |
JerrySzczurak | 0:eade49d47e3a | 35 | |
johnAlexander | 2:a3bc0a0af780 | 36 | int init_sensors_array() |
JerrySzczurak | 0:eade49d47e3a | 37 | { |
johnAlexander | 3:ff6e42401073 | 38 | int status = 1; |
johnAlexander | 3:ff6e42401073 | 39 | /* start the measure on sensor top */ |
johnAlexander | 3:ff6e42401073 | 40 | if (NULL != board->sensor_centre) { |
johnAlexander | 3:ff6e42401073 | 41 | installedSensors[sensorCnt].prefix = 'C'; |
johnAlexander | 3:ff6e42401073 | 42 | installedSensors[sensorCnt].sensorPtr = board->sensor_centre; |
johnAlexander | 3:ff6e42401073 | 43 | ++sensorCnt; |
johnAlexander | 3:ff6e42401073 | 44 | status = board->sensor_centre->start_measurement(operating_mode, NULL); |
johnAlexander | 3:ff6e42401073 | 45 | } |
johnAlexander | 3:ff6e42401073 | 46 | /* start the measure on sensor left if present */ |
johnAlexander | 3:ff6e42401073 | 47 | if (NULL != board->sensor_left) { |
johnAlexander | 3:ff6e42401073 | 48 | installedSensors[sensorCnt].prefix = 'L'; |
JerrySzczurak | 1:9d5c48d409b6 | 49 | installedSensors[sensorCnt].sensorPtr = board->sensor_left; |
johnAlexander | 3:ff6e42401073 | 50 | ++sensorCnt; |
johnAlexander | 3:ff6e42401073 | 51 | status = board->sensor_left->start_measurement(operating_mode, NULL); |
johnAlexander | 3:ff6e42401073 | 52 | } |
johnAlexander | 3:ff6e42401073 | 53 | /* start the measure on sensor right if present */ |
johnAlexander | 3:ff6e42401073 | 54 | if (NULL != board->sensor_right) { |
JerrySzczurak | 1:9d5c48d409b6 | 55 | installedSensors[sensorCnt].prefix = 'R'; |
JerrySzczurak | 1:9d5c48d409b6 | 56 | installedSensors[sensorCnt].sensorPtr = board->sensor_right; |
JerrySzczurak | 1:9d5c48d409b6 | 57 | ++sensorCnt; |
johnAlexander | 3:ff6e42401073 | 58 | status = board->sensor_right->start_measurement(operating_mode, NULL); |
johnAlexander | 3:ff6e42401073 | 59 | } |
johnAlexander | 3:ff6e42401073 | 60 | /* set first displayed sensor to embedded top */ |
johnAlexander | 3:ff6e42401073 | 61 | currentSensor = 0; |
johnAlexander | 3:ff6e42401073 | 62 | return status; |
JerrySzczurak | 1:9d5c48d409b6 | 63 | } |
JerrySzczurak | 0:eade49d47e3a | 64 | |
JerrySzczurak | 0:eade49d47e3a | 65 | /* ISR callback function of the user blue button to switch measuring sensor. */ |
johnAlexander | 2:a3bc0a0af780 | 66 | void switch_measuring_sensor_irq(void) |
JerrySzczurak | 0:eade49d47e3a | 67 | { |
JerrySzczurak | 0:eade49d47e3a | 68 | ++currentSensor; |
JerrySzczurak | 0:eade49d47e3a | 69 | if (currentSensor == sensorCnt) |
JerrySzczurak | 0:eade49d47e3a | 70 | currentSensor = 0; |
johnAlexander | 3:ff6e42401073 | 71 | printf("Sensor changed to %c\r\n", installedSensors[currentSensor].prefix); |
JerrySzczurak | 0:eade49d47e3a | 72 | } |
JerrySzczurak | 0:eade49d47e3a | 73 | |
JerrySzczurak | 1:9d5c48d409b6 | 74 | /* On board 4 digit local display refresh*/ |
johnAlexander | 2:a3bc0a0af780 | 75 | void display_refresh(OperatingMode op_mode) |
johnAlexander | 3:ff6e42401073 | 76 | { |
johnAlexander | 3:ff6e42401073 | 77 | char str[4]; |
johnAlexander | 3:ff6e42401073 | 78 | |
johnAlexander | 3:ff6e42401073 | 79 | for (int t = 0; t < sensorCnt; t++) { |
johnAlexander | 3:ff6e42401073 | 80 | installedSensors[t].sensorPtr->get_measurement(op_mode, &data_sensor); |
johnAlexander | 3:ff6e42401073 | 81 | if (data_sensor.RangeStatus == 0) { // we have a valid range. |
johnAlexander | 3:ff6e42401073 | 82 | printf("%c %4d; ", installedSensors[t].prefix, data_sensor.RangeMilliMeter); |
johnAlexander | 3:ff6e42401073 | 83 | if (currentSensor == t) { |
johnAlexander | 3:ff6e42401073 | 84 | sprintf(str, "%c%3d", installedSensors[t].prefix, data_sensor.RangeMilliMeter); |
johnAlexander | 3:ff6e42401073 | 85 | } |
johnAlexander | 3:ff6e42401073 | 86 | } else { |
johnAlexander | 3:ff6e42401073 | 87 | printf("%c ----; ", installedSensors[t].prefix); |
johnAlexander | 3:ff6e42401073 | 88 | if (currentSensor == t) { |
johnAlexander | 3:ff6e42401073 | 89 | sprintf(str, "%c%s", installedSensors[t].prefix, "---"); |
johnAlexander | 3:ff6e42401073 | 90 | } |
johnAlexander | 3:ff6e42401073 | 91 | } |
johnAlexander | 3:ff6e42401073 | 92 | } |
johnAlexander | 3:ff6e42401073 | 93 | printf("\r\n"); |
johnAlexander | 3:ff6e42401073 | 94 | board->display->display_string(str); |
JerrySzczurak | 0:eade49d47e3a | 95 | } |
JerrySzczurak | 0:eade49d47e3a | 96 | |
johnAlexander | 3:ff6e42401073 | 97 | void range_measure(DevI2C *device_i2c) |
johnAlexander | 3:ff6e42401073 | 98 | { |
johnAlexander | 3:ff6e42401073 | 99 | int status; |
JerrySzczurak | 0:eade49d47e3a | 100 | |
johnAlexander | 3:ff6e42401073 | 101 | /* creates the 53L0A1 expansion board singleton obj */ |
johnAlexander | 4:3c5cc844a7e5 | 102 | board = XNucleo53L0A1::instance(device_i2c, A2, D8, D2); |
JerrySzczurak | 1:9d5c48d409b6 | 103 | |
johnAlexander | 3:ff6e42401073 | 104 | board->display->display_string("53L0"); |
johnAlexander | 3:ff6e42401073 | 105 | /* init the 53L0A1 expansion board with default values */ |
johnAlexander | 3:ff6e42401073 | 106 | status = board->init_board(); |
johnAlexander | 3:ff6e42401073 | 107 | if (status) |
johnAlexander | 3:ff6e42401073 | 108 | printf("Failed to init board!\n\r"); |
johnAlexander | 3:ff6e42401073 | 109 | operating_mode = range_single_shot_polling; |
johnAlexander | 3:ff6e42401073 | 110 | |
johnAlexander | 3:ff6e42401073 | 111 | status = init_sensors_array(); |
johnAlexander | 3:ff6e42401073 | 112 | |
johnAlexander | 3:ff6e42401073 | 113 | if (!status) { |
johnAlexander | 3:ff6e42401073 | 114 | while (1) { |
johnAlexander | 3:ff6e42401073 | 115 | display_refresh(operating_mode); |
johnAlexander | 3:ff6e42401073 | 116 | } |
johnAlexander | 3:ff6e42401073 | 117 | } |
johnAlexander | 3:ff6e42401073 | 118 | board->display->display_string("BYE"); |
johnAlexander | 3:ff6e42401073 | 119 | delete board; |
johnAlexander | 3:ff6e42401073 | 120 | } |
JerrySzczurak | 0:eade49d47e3a | 121 | |
JerrySzczurak | 0:eade49d47e3a | 122 | /*=================================== Main ================================== |
johnAlexander | 3:ff6e42401073 | 123 | Press the blue user button to switch the sensor. |
JerrySzczurak | 0:eade49d47e3a | 124 | =============================================================================*/ |
JerrySzczurak | 0:eade49d47e3a | 125 | int main() |
johnAlexander | 3:ff6e42401073 | 126 | { |
JerrySzczurak | 0:eade49d47e3a | 127 | #if USER_BUTTON==PC_13 // we are cross compiling for Nucleo-f401 |
johnAlexander | 3:ff6e42401073 | 128 | InterruptIn stop_button(USER_BUTTON); |
johnAlexander | 3:ff6e42401073 | 129 | stop_button.rise(&switch_measuring_sensor_irq); |
johnAlexander | 3:ff6e42401073 | 130 | #endif |
johnAlexander | 3:ff6e42401073 | 131 | DevI2C *device_i2c = new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL); |
johnAlexander | 3:ff6e42401073 | 132 | range_measure(device_i2c); // start continuous measures |
JerrySzczurak | 0:eade49d47e3a | 133 | } |
JerrySzczurak | 0:eade49d47e3a | 134 |