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 ST Expansion SW Team

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?

UserRevisionLine numberNew 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