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:
Mon Aug 07 15:38:43 2017 +0000
Revision:
2:a3bc0a0af780
Parent:
1:9d5c48d409b6
Child:
3:ff6e42401073
Align with ARM mbed coding style.

Who changed what in which revision?

UserRevisionLine numberNew 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
johnAlexander 2:a3bc0a0af780 9 on the sensors. The demo supports the centre sensor and up to 2 satellites 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
johnAlexander 2:a3bc0a0af780 37 int init_sensors_array()
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;
johnAlexander 2:a3bc0a0af780 46 status=board->sensor_centre->start_measurement(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;
johnAlexander 2:a3bc0a0af780 54 status=board->sensor_left->start_measurement(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;
johnAlexander 2:a3bc0a0af780 62 status=board->sensor_right->start_measurement(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. */
johnAlexander 2:a3bc0a0af780 70 void switch_measuring_sensor_irq(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*/
johnAlexander 2:a3bc0a0af780 79 void display_refresh(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 {
johnAlexander 2:a3bc0a0af780 85 installedSensors[t].sensorPtr->get_measurement(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");
johnAlexander 2:a3bc0a0af780 104 board->display->display_string(str);
JerrySzczurak 0:eade49d47e3a 105 }
JerrySzczurak 0:eade49d47e3a 106
johnAlexander 2:a3bc0a0af780 107 void range_measure(DevI2C *device_i2c) {
JerrySzczurak 0:eade49d47e3a 108 int status;
JerrySzczurak 0:eade49d47e3a 109
JerrySzczurak 0:eade49d47e3a 110 /* creates the 53L0A1 expansion board singleton obj */
johnAlexander 2:a3bc0a0af780 111 board=X_NUCLEO_53L0A1::instance(device_i2c, A2, D8, D2);
JerrySzczurak 0:eade49d47e3a 112
johnAlexander 2:a3bc0a0af780 113 board->display->display_string("53L0");
JerrySzczurak 0:eade49d47e3a 114 /* init the 53L0A1 expansion board with default values */
johnAlexander 2:a3bc0a0af780 115 status=board->init_board();
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
johnAlexander 2:a3bc0a0af780 120 status = init_sensors_array();
JerrySzczurak 0:eade49d47e3a 121
JerrySzczurak 0:eade49d47e3a 122 if(!status)
JerrySzczurak 0:eade49d47e3a 123 {
JerrySzczurak 0:eade49d47e3a 124 while(1)
JerrySzczurak 0:eade49d47e3a 125 {
johnAlexander 2:a3bc0a0af780 126 display_refresh(operating_mode);
JerrySzczurak 0:eade49d47e3a 127 }
JerrySzczurak 0:eade49d47e3a 128 }
johnAlexander 2:a3bc0a0af780 129 board->display->display_string("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);
johnAlexander 2:a3bc0a0af780 140 stop_button.rise (&switch_measuring_sensor_irq);
JerrySzczurak 0:eade49d47e3a 141 #endif
JerrySzczurak 0:eade49d47e3a 142 DevI2C *device_i2c =new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL);
johnAlexander 2:a3bc0a0af780 143 range_measure(device_i2c); // start continuous measures
JerrySzczurak 0:eade49d47e3a 144 }
JerrySzczurak 0:eade49d47e3a 145