Using two or more VL6180X 20cm Time-of-Flight proximity sensor with Arduino

Project Video
Project Details

This is the Arduino code for using two more m= VL6180X proximity sensors with 20cm range. Sensor explaiend in this video, wiring shown for 1 sensor and for 2 or more sensor. Adafruit Library is used. Code updated to be used easity with for real application for 1 sensor or 2 or more sensors.

Using single VL6080X Distance Proximity Sensor code is here

Chapters of this video

  • 00:56 Introduction
  • 04:30 VL6080V Datasheet viewed
  • 06:58 Wiring shown
  • 07:32 Wiring for two or more sensors
  • 09:22 Installing library
  • 10:30 Arduino code explained (1 sensor)
  • 12:57 Code for 2 or more sensors
  • 19:35 Demonstration 1 sensor
  • 22:05 Demonstration with 2 sensors
Project Code

 *  Arduino code 
Using two or more VL6180X 20cm Time-of-Flight proximity sensor with Arduino

View code for using single VL6180X sensors:

 * Original code and library by
 * Written/updated by Ahmad Shamshiri for Robojax
 * on Mar 12, 2021  in Ajax, Ontario, Canada
 Watch the video instruction for this sketch:

If you found this tutorial helpful, please support me so I can continue creating 
content like this. You can support me on Patreon
or make donation using PayPal

 * Code is available at

 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been download from
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see . 



// address we will assign if dual sensor is present
#define LOX1_ADDRESS 0x30
#define LOX2_ADDRESS 0x31

// set the pins to shutdown
#define SHT_LOX1 7
#define SHT_LOX2 6

// Optional define GPIO pins to check to see if complete
#define GPIO_LOX1 4
#define GPIO_LOX2 3

#define TIMING_PIN 13

// objects for the VL6180X
Adafruit_VL6180X lox1 = Adafruit_VL6180X();
Adafruit_VL6180X lox2 = Adafruit_VL6180X();

// Setup mode for doing reads

runmode_t run_mode = RUN_MODE_DEFAULT;
uint8_t show_command_list = 1;

// Define some globals used in the continuous range mode
// Note: going to start table drive this part, may back up and do the rest later
Adafruit_VL6180X *sensors[] = {&lox1, &lox2};
const uint8_t COUNT_SENSORS = sizeof(sensors) / sizeof(sensors[0]);
const int sensor_gpios[COUNT_SENSORS] = {GPIO_LOX1, GPIO_LOX2}; // if any are < 0 will poll instead
uint8_t  tempRange;
uint8_t         sensor_ranges[COUNT_SENSORS];
uint8_t         sensor_status[COUNT_SENSORS];
// Could do with uint8_t for 8 sensors, but just in case...
const uint16_t  ALL_SENSORS_PENDING = ((1 << COUNT_SENSORS) - 1);
uint16_t        sensors_pending = ALL_SENSORS_PENDING;
uint32_t        sensor_last_cycle_time;

    Reset all sensors by setting all of their XSHUT pins low for delay(10), then set all XSHUT high to bring out of reset
    Keep sensor #1 awake by keeping XSHUT pin high
    Put all other sensors into shutdown by pulling XSHUT pins low
    Initialize sensor #1 with lox.begin(new_i2c_address) Pick any number but 0x29 and it must be under 0x7F. Going with 0x30 to 0x3F is probably OK.
    Keep sensor #1 awake, and now bring sensor #2 out of reset by setting its XSHUT pin high.
    Initialize sensor #2 with lox.begin(new_i2c_address) Pick any number but 0x29 and whatever you set the first sensor to
void setID() {
  // all reset
  digitalWrite(SHT_LOX1, LOW);
  digitalWrite(SHT_LOX2, LOW);


  // all unreset
  digitalWrite(SHT_LOX1, HIGH);
  digitalWrite(SHT_LOX2, HIGH);


  // activating LOX1 and reseting LOX2
  digitalWrite(SHT_LOX1, HIGH);
  digitalWrite(SHT_LOX2, LOW);

  // initing LOX1
  if (!lox1.begin()) {
    Serial.println(F("Failed to boot first VL6180X"));
    while (1);

  // activating LOX2
  digitalWrite(SHT_LOX2, HIGH);

  //initing LOX2
  if (!lox2.begin()) {
    Serial.println(F("Failed to boot second VL6180X"));
    while (1);


void readSensor(Adafruit_VL6180X &vl) {

  float lux = vl.readLux(VL6180X_ALS_GAIN_5);

  uint8_t range = vl.readRange();

  uint8_t status = vl.readRangeStatus();

  if (status == VL6180X_ERROR_NONE) {
      tempRange = range;//save it for the moment

  // Some error occurred, print it out!

  if  ((status >= VL6180X_ERROR_SYSERR_1) && (status <= VL6180X_ERROR_SYSERR_5)) {
    Serial.print("(System error)");
  else if (status == VL6180X_ERROR_ECEFAIL) {
    Serial.print("(ECE failure)");
  else if (status == VL6180X_ERROR_NOCONVERGE) {
    Serial.print("(No convergence)");
  else if (status == VL6180X_ERROR_RANGEIGNORE) {
    Serial.print("(Ignoring range)");
  else if (status == VL6180X_ERROR_SNR) {
    Serial.print("Signal/Noise error");
  else if (status == VL6180X_ERROR_RAWUFLOW) {
    Serial.print("Raw reading underflow");
  else if (status == VL6180X_ERROR_RAWOFLOW) {
    Serial.print("Raw reading overflow");
  else if (status == VL6180X_ERROR_RANGEUFLOW) {
    Serial.print("Range reading underflow");
  else if (status == VL6180X_ERROR_RANGEOFLOW) {
    Serial.print("Range reading overflow");

void read_sensors() {
  sensor_ranges[0]=tempRange;//save it now

  sensor_ranges[1]=tempRange; //save it now 


// Setup
void setup() {

  // wait until serial port opens for native USB devices
  while (! Serial) {

  pinMode(SHT_LOX1, OUTPUT);
  pinMode(SHT_LOX2, OUTPUT);

  // Enable timing pin so easy to see when pass starts and ends

#ifdef GPIO_LOX1
  // If we defined GPIO pins, enable them as PULL UP


  Serial.println("Shutdown pins inited...");

  digitalWrite(SHT_LOX1, LOW);
  digitalWrite(SHT_LOX2, LOW);

  digitalWrite(TIMING_PIN, LOW);
  Serial.println("All in reset mode...(pins are low)");



// Loop
void loop() {
      for(int i=0; i=76)
//      {
//        //do something here
//      }

If you found this Arduino course helpful, please support me so I can continue creating content like this. support me via PayPal