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:
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?

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