Example Code for Arduino-Read Sensor Data
This project demonstrates how to initialize the sensor and read its current data, displaying the output in the Serial Monitor.
Hardware Preparation
- DFRduino UNO R3 (or similar) x 1
- VL53L3CX ToF Distance Ranging Sensor Breakout Board x1
- Jumper wires
Software Preparation
- Arduino IDE
- Download and install the VL53L3CX Library and Sample Code. (About how to install the library?)
Wiring Diagram

Other Preparation Work
If you’re gonna use ESP32 to drive VL53L3CX, you need to change the I2C buffer size in the following way:
- Enter the file Directory
%USERPROFILE%\AppData\Local\Arduino15\packages\DFRobot\hardware\esp32\0.2.1\libraries\Wire\src - Open the Wire.h file
- Change the I2C_BUFFER_LENGTH macro value to 256
Sample Code
/**
******************************************************************************
* @file VL53L3CX_Sat_HelloWorld.ino
* @author SRA
* @version V1.0.0
* @date 30 July 2020
* @brief Arduino test application for the STMicroelectronics VL53L3CX
* proximity sensor satellite based on FlightSense.
* This application makes use of C++ classes obtained from the C
* components' drivers.
******************************************************************************
* @attention
*
* <h2><center>© COPYRIGHT(c) 2020 STMicroelectronics</center></h2>
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of STMicroelectronics nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************
*/
/*
* To use this sketch you need to connect the VL53L3CX satellite sensor directly to the Nucleo board with wires in this way:
* pin 1 (Interrupt) of the VL53L3CX satellite connected to pin A2 of the Nucleo board
* pin 2 (SCL_I) of the VL53L3CX satellite connected to pin D15 (SCL) of the Nucleo board with a Pull-Up resistor of 4.7 KOhm
* pin 3 (XSDN_I) of the VL53L3CX satellite connected to pin A1 of the Nucleo board
* pin 4 (SDA_I) of the VL53L3CX satellite connected to pin D14 (SDA) of the Nucleo board with a Pull-Up resistor of 4.7 KOhm
* pin 5 (VDD) of the VL53L3CX satellite connected to 3V3 pin of the Nucleo board
* pin 6 (GND) of the VL53L3CX satellite connected to GND of the Nucleo board
* pins 7, 8, 9 and 10 are not connected.
*/
/* Includes ------------------------------------------------------------------*/
#include <Arduino.h>
#include <Wire.h>
#include <vl53lx_class.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <assert.h>
#include <stdlib.h>
#define DEV_I2C Wire
#define SerialPort Serial
#ifndef LED_BUILTIN
#define LED_BUILTIN 13
#endif
#define LedPin LED_BUILTIN
// Components.
VL53LX sensor_vl53lx_sat(&DEV_I2C, A1);
/* Setup ---------------------------------------------------------------------*/
void setup()
{
// Led.
pinMode(LedPin, OUTPUT);
// Initialize serial for output.
SerialPort.begin(115200);
SerialPort.println("Starting...");
// Initialize I2C bus.
DEV_I2C.begin();
// Configure VL53LX satellite component.
sensor_vl53lx_sat.begin();
// Switch off VL53LX satellite component.
sensor_vl53lx_sat.VL53LX_Off();
//Initialize VL53LX satellite component.
sensor_vl53lx_sat.InitSensor(0x12);
// Start Measurements
sensor_vl53lx_sat.VL53LX_StartMeasurement();
}
void loop()
{
VL53LX_MultiRangingData_t MultiRangingData;
VL53LX_MultiRangingData_t *pMultiRangingData = &MultiRangingData;
uint8_t NewDataReady = 0;
int no_of_object_found = 0, j;
char report[64];
int status;
do
{
status = sensor_vl53lx_sat.VL53LX_GetMeasurementDataReady(&NewDataReady);
} while (!NewDataReady);
//Led on
digitalWrite(LedPin, HIGH);
if((!status)&&(NewDataReady!=0))
{
status = sensor_vl53lx_sat.VL53LX_GetMultiRangingData(pMultiRangingData);
no_of_object_found=pMultiRangingData->NumberOfObjectsFound;
snprintf(report, sizeof(report), "VL53LX Satellite: Count=%d, #Objs=%1d ", pMultiRangingData->StreamCount, no_of_object_found);
SerialPort.print(report);
for(j=0;j<no_of_object_found;j++)
{
if(j!=0)SerialPort.print("\r\n ");
SerialPort.print("status=");
SerialPort.print(pMultiRangingData->RangeData[j].RangeStatus);
SerialPort.print(", D=");
SerialPort.print(pMultiRangingData->RangeData[j].RangeMilliMeter);
SerialPort.print("mm");
SerialPort.print(", Signal=");
SerialPort.print((float)pMultiRangingData->RangeData[j].SignalRateRtnMegaCps/65536.0);
SerialPort.print(" Mcps, Ambient=");
SerialPort.print((float)pMultiRangingData->RangeData[j].AmbientRateRtnMegaCps/65536.0);
SerialPort.print(" Mcps");
}
SerialPort.println("");
if (status==0)
{
status = sensor_vl53lx_sat.VL53LX_ClearInterruptAndStartMeasurement();
}
}
digitalWrite(LedPin, LOW);
}
Result

Was this article helpful?
