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:   X_NUCLEO_53L0A1 mbed

Fork of Display_53L0A1_WithSatelites by Jerry Szczurak

Committer:
JerrySzczurak
Date:
Mon Jun 12 15:01:09 2017 +0000
Revision:
0:eade49d47e3a
Child:
1:9d5c48d409b6
Sample ranging example. Suporting up to 3 sensors. Sendinf 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 0:eade49d47e3a 9 on the onboard embedded top sensor.
JerrySzczurak 0:eade49d47e3a 10 The measured data is displayed on the on-board 4-digit display.
JerrySzczurak 0:eade49d47e3a 11
JerrySzczurak 0:eade49d47e3a 12 User Blue button stops the current measurement and the entire program, releasing all resources.
JerrySzczurak 0:eade49d47e3a 13 Reset button is used to restart the program. */
JerrySzczurak 0:eade49d47e3a 14
JerrySzczurak 0:eade49d47e3a 15 /* Polling operating modes don`t require callback function that handles IRQ
JerrySzczurak 0:eade49d47e3a 16 Callback IRQ functions are used only for measure that require interrupt */
JerrySzczurak 0:eade49d47e3a 17
JerrySzczurak 0:eade49d47e3a 18 /* GetMeasurement is asynchronous! It returns NOT_READY if the measurement value
JerrySzczurak 0:eade49d47e3a 19 is not ready to be read from the corresponding register. So you need to wait
JerrySzczurak 0:eade49d47e3a 20 for the result to be ready */
JerrySzczurak 0:eade49d47e3a 21
JerrySzczurak 0:eade49d47e3a 22 #define VL53L0_I2C_SDA D14
JerrySzczurak 0:eade49d47e3a 23 #define VL53L0_I2C_SCL D15
JerrySzczurak 0:eade49d47e3a 24
JerrySzczurak 0:eade49d47e3a 25 #define RANGE 0
JerrySzczurak 0:eade49d47e3a 26
JerrySzczurak 0:eade49d47e3a 27 static X_NUCLEO_53L0A1 *board=NULL;
JerrySzczurak 0:eade49d47e3a 28 VL53L0X_RangingMeasurementData_t data_sensor;
JerrySzczurak 0:eade49d47e3a 29 OperatingMode operating_mode;
JerrySzczurak 0:eade49d47e3a 30
JerrySzczurak 0:eade49d47e3a 31 /* flags that handle interrupt request */
JerrySzczurak 0:eade49d47e3a 32 volatile bool int_sensor_centre=false;
JerrySzczurak 0:eade49d47e3a 33 /* Current sensor number*/
JerrySzczurak 0:eade49d47e3a 34 int currentSensor = 0;
JerrySzczurak 0:eade49d47e3a 35 int sensorCnt = 0;
JerrySzczurak 0:eade49d47e3a 36
JerrySzczurak 0:eade49d47e3a 37 struct Sensors
JerrySzczurak 0:eade49d47e3a 38 {
JerrySzczurak 0:eade49d47e3a 39 char prefix;
JerrySzczurak 0:eade49d47e3a 40 VL53L0X *sensorPtr;
JerrySzczurak 0:eade49d47e3a 41 } installedSensors[3];
JerrySzczurak 0:eade49d47e3a 42
JerrySzczurak 0:eade49d47e3a 43
JerrySzczurak 0:eade49d47e3a 44 /* ISR callback function of the sensor_centre */
JerrySzczurak 0:eade49d47e3a 45 void SensorTopIRQ(void)
JerrySzczurak 0:eade49d47e3a 46 {
JerrySzczurak 0:eade49d47e3a 47 int_sensor_centre=true;
JerrySzczurak 0:eade49d47e3a 48 board->sensor_centre->DisableInterruptMeasureDetectionIRQ();
JerrySzczurak 0:eade49d47e3a 49 }
JerrySzczurak 0:eade49d47e3a 50
JerrySzczurak 0:eade49d47e3a 51 /* ISR callback function of the user blue button to switch measuring sensor. */
JerrySzczurak 0:eade49d47e3a 52 void SwitchMeasuringSensorIRQ(void)
JerrySzczurak 0:eade49d47e3a 53 {
JerrySzczurak 0:eade49d47e3a 54 ++currentSensor;
JerrySzczurak 0:eade49d47e3a 55 if (currentSensor == sensorCnt)
JerrySzczurak 0:eade49d47e3a 56 currentSensor = 0;
JerrySzczurak 0:eade49d47e3a 57 printf("Sensor changed to %c\r\n",installedSensors[currentSensor].prefix);
JerrySzczurak 0:eade49d47e3a 58 }
JerrySzczurak 0:eade49d47e3a 59
JerrySzczurak 0:eade49d47e3a 60 /* On board 4 digit local display refresh */
JerrySzczurak 0:eade49d47e3a 61 void DisplayRefresh(OperatingMode op_mode)
JerrySzczurak 0:eade49d47e3a 62 {
JerrySzczurak 0:eade49d47e3a 63 char str[4];
JerrySzczurak 0:eade49d47e3a 64
JerrySzczurak 0:eade49d47e3a 65 if (op_mode==range_single_shot_polling || op_mode==range_continuous_interrupt || op_mode==range_continuous_polling)
JerrySzczurak 0:eade49d47e3a 66 {
JerrySzczurak 0:eade49d47e3a 67 for (int t=0; t < sensorCnt; t++)
JerrySzczurak 0:eade49d47e3a 68 {
JerrySzczurak 0:eade49d47e3a 69 installedSensors[t].sensorPtr->GetMeasurement(operating_mode, &data_sensor);
JerrySzczurak 0:eade49d47e3a 70 if (data_sensor.RangeStatus == 0) // we have a valid range.
JerrySzczurak 0:eade49d47e3a 71 {
JerrySzczurak 0:eade49d47e3a 72 printf("%c %4d; ", installedSensors[t].prefix,data_sensor.RangeMilliMeter);
JerrySzczurak 0:eade49d47e3a 73 if (currentSensor == t)
JerrySzczurak 0:eade49d47e3a 74 {
JerrySzczurak 0:eade49d47e3a 75 sprintf(str,"%c%3d", installedSensors[t].prefix ,data_sensor.RangeMilliMeter);
JerrySzczurak 0:eade49d47e3a 76 }
JerrySzczurak 0:eade49d47e3a 77 }
JerrySzczurak 0:eade49d47e3a 78 else
JerrySzczurak 0:eade49d47e3a 79 {
JerrySzczurak 0:eade49d47e3a 80 printf("%c ----; ", installedSensors[t].prefix);
JerrySzczurak 0:eade49d47e3a 81 if (currentSensor == t)
JerrySzczurak 0:eade49d47e3a 82 {
JerrySzczurak 0:eade49d47e3a 83 sprintf(str,"%c%s", installedSensors[t].prefix, "---");
JerrySzczurak 0:eade49d47e3a 84 }
JerrySzczurak 0:eade49d47e3a 85 }
JerrySzczurak 0:eade49d47e3a 86 }
JerrySzczurak 0:eade49d47e3a 87 printf("\r\n");
JerrySzczurak 0:eade49d47e3a 88 }
JerrySzczurak 0:eade49d47e3a 89 board->display->DisplayString(str);
JerrySzczurak 0:eade49d47e3a 90 }
JerrySzczurak 0:eade49d47e3a 91
JerrySzczurak 0:eade49d47e3a 92 void RangeMeasure(DevI2C *device_i2c) {
JerrySzczurak 0:eade49d47e3a 93 int status;
JerrySzczurak 0:eade49d47e3a 94
JerrySzczurak 0:eade49d47e3a 95 /* creates the 53L0A1 expansion board singleton obj */
JerrySzczurak 0:eade49d47e3a 96 board=X_NUCLEO_53L0A1::Instance(device_i2c, A2, D8, D2);
JerrySzczurak 0:eade49d47e3a 97
JerrySzczurak 0:eade49d47e3a 98 board->display->DisplayString("53L0");
JerrySzczurak 0:eade49d47e3a 99 /* init the 53L0A1 expansion board with default values */
JerrySzczurak 0:eade49d47e3a 100 status=board->InitBoard();
JerrySzczurak 0:eade49d47e3a 101 if(status)
JerrySzczurak 0:eade49d47e3a 102 printf("Failed to init board!\n\r");
JerrySzczurak 0:eade49d47e3a 103 operating_mode=range_single_shot_polling;
JerrySzczurak 0:eade49d47e3a 104 /* start the measure on sensor top */
JerrySzczurak 0:eade49d47e3a 105 if (NULL != board->sensor_centre)
JerrySzczurak 0:eade49d47e3a 106 {
JerrySzczurak 0:eade49d47e3a 107 installedSensors[sensorCnt].prefix = 'C';
JerrySzczurak 0:eade49d47e3a 108 installedSensors[sensorCnt].sensorPtr = board->sensor_centre;
JerrySzczurak 0:eade49d47e3a 109 ++sensorCnt;
JerrySzczurak 0:eade49d47e3a 110 status=board->sensor_centre->StartMeasurement(operating_mode, SensorTopIRQ);
JerrySzczurak 0:eade49d47e3a 111 }
JerrySzczurak 0:eade49d47e3a 112 if (NULL != board->sensor_left)
JerrySzczurak 0:eade49d47e3a 113 {
JerrySzczurak 0:eade49d47e3a 114 installedSensors[sensorCnt].prefix='L';
JerrySzczurak 0:eade49d47e3a 115 installedSensors[sensorCnt].sensorPtr = board->sensor_left;
JerrySzczurak 0:eade49d47e3a 116 ++sensorCnt;
JerrySzczurak 0:eade49d47e3a 117 status=board->sensor_left->StartMeasurement(operating_mode, SensorTopIRQ);
JerrySzczurak 0:eade49d47e3a 118 }
JerrySzczurak 0:eade49d47e3a 119 if (NULL != board->sensor_right)
JerrySzczurak 0:eade49d47e3a 120 {
JerrySzczurak 0:eade49d47e3a 121 installedSensors[sensorCnt].prefix = 'R';
JerrySzczurak 0:eade49d47e3a 122 installedSensors[sensorCnt].sensorPtr = board->sensor_right;
JerrySzczurak 0:eade49d47e3a 123 ++sensorCnt;
JerrySzczurak 0:eade49d47e3a 124 status=board->sensor_right->StartMeasurement(operating_mode, SensorTopIRQ);
JerrySzczurak 0:eade49d47e3a 125 }
JerrySzczurak 0:eade49d47e3a 126
JerrySzczurak 0:eade49d47e3a 127 currentSensor = 0;
JerrySzczurak 0:eade49d47e3a 128
JerrySzczurak 0:eade49d47e3a 129 if(!status)
JerrySzczurak 0:eade49d47e3a 130 {
JerrySzczurak 0:eade49d47e3a 131 while(1)
JerrySzczurak 0:eade49d47e3a 132 {
JerrySzczurak 0:eade49d47e3a 133 DisplayRefresh(operating_mode);
JerrySzczurak 0:eade49d47e3a 134 }
JerrySzczurak 0:eade49d47e3a 135 }
JerrySzczurak 0:eade49d47e3a 136 board->display->DisplayString("BYE");
JerrySzczurak 0:eade49d47e3a 137 delete board;
JerrySzczurak 0:eade49d47e3a 138 }
JerrySzczurak 0:eade49d47e3a 139
JerrySzczurak 0:eade49d47e3a 140 /*=================================== Main ==================================
JerrySzczurak 0:eade49d47e3a 141 Press the blue user button to stop the measurements in progress
JerrySzczurak 0:eade49d47e3a 142 =============================================================================*/
JerrySzczurak 0:eade49d47e3a 143 int main()
JerrySzczurak 0:eade49d47e3a 144 {
JerrySzczurak 0:eade49d47e3a 145 #if USER_BUTTON==PC_13 // we are cross compiling for Nucleo-f401
JerrySzczurak 0:eade49d47e3a 146 InterruptIn stop_button (USER_BUTTON);
JerrySzczurak 0:eade49d47e3a 147 stop_button.rise (&SwitchMeasuringSensorIRQ);
JerrySzczurak 0:eade49d47e3a 148 #endif
JerrySzczurak 0:eade49d47e3a 149 DevI2C *device_i2c =new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL);
JerrySzczurak 0:eade49d47e3a 150 RangeMeasure(device_i2c); // start continuous measures
JerrySzczurak 0:eade49d47e3a 151 }
JerrySzczurak 0:eade49d47e3a 152