IoTLabs

Nghiên cứu, Sáng tạo và Thử nghiệm

Series ESP32 & Cảm biến: Bài 26 – Đọc cảm biến VL53L0X: đo khoảng cách ToF chính xác & theo dõi realtime

Sau các bài đo khoảng cách bằng siêu âm, chúng ta chuyển sang một công nghệ hiện đại và chính xác hơn:
ToF – Time of Flight, với đại diện rất phổ biến là VL53L0X.

VL53L0X cho phép:

  • Đo khoảng cách bằng tia laser hồng ngoại
  • Ít bị ảnh hưởng bởi góc, gió, nhiệt độ
  • Phù hợp cho thiết bị nhỏ gọn, trong nhà, công nghiệp nhẹ

1. ToF (Time of Flight) là gì?

Time of Flight là phương pháp:

  • Phát xung ánh sáng (laser IR)
  • Đo thời gian ánh sáng phản xạ quay về
  • Tính khoảng cách dựa trên vận tốc ánh sáng

So với siêu âm:

  • Nhanh hơn
  • Chính xác hơn ở cự ly ngắn
  • Không bị nhiễu bởi gió / tiếng ồn

2. Giới thiệu cảm biến VL53L0X

VL53L0X là cảm biến ToF của STMicroelectronics.

Thông số chính:

  • Giao tiếp: I2C
  • Khoảng đo: ~30 mm → 2000 mm
  • Độ chính xác cao ở cự ly ngắn
  • Tốc độ đo nhanh

📌 Rất phù hợp cho:

  • Robot
  • Phát hiện vật thể
  • Đo khoảng cách chính xác trong nhà
  • UX interaction (hand distance, presence)

3. So sánh nhanh VL53L0X với HC-SR04 / JSN-SR04T

Tiêu chíHC-SR04JSN-SR04TVL53L0X
Công nghệSiêu âmSiêu âmLaser ToF
Chống nước
Độ chính xácTrung bìnhTrung bìnhCao
Góc ảnh hưởngÍt
IndoorTốtTốtRất tốt
OutdoorTrung bìnhTốtKém (ánh sáng mạnh)

👉 VL53L0X không thay thế hoàn toàn siêu âm, mà dùng đúng chỗ.

4. Chuẩn bị phần cứng & nối dây

Thiết bị

  • ESP32-C3 SuperMini
  • VL53L0X module

Kết nối I2C (chuẩn series)

VL53L0XESP32-C3
VCC3.3V
GNDGND
SDAGPIO8
SCLGPIO9

📌 Địa chỉ I2C mặc định: 0x29

5. Kiểm tra I2C address

Dùng lại đoạn I2C scan ở Level 2.
Nếu thấy 0x29 → cảm biến sẵn sàng.

6. Ví dụ 1: Đọc khoảng cách VL53L0X (local)

Thư viện

  • Adafruit VL53L0X
#include <Wire.h>
#include <Adafruit_VL53L0X.h>

Adafruit_VL53L0X lox = Adafruit_VL53L0X();

void setup() {
  Serial.begin(115200);
  Wire.begin(8, 9);

  if (!lox.begin()) {
    Serial.println("VL53L0X not found");
    while (1) delay(10);
  }

  Serial.println("VL53L0X ready");
}

void loop() {
  VL53L0X_RangingMeasurementData_t measure;

  lox.rangingTest(&measure, false);

  if (measure.RangeStatus != 4) {
    Serial.print("Distance: ");
    Serial.print(measure.RangeMilliMeter);
    Serial.println(" mm");
  } else {
    Serial.println("Out of range");
  }

  delay(500);
}

📌 Giá trị trả về là millimeter (mm) → rất tiện cho xử lý chính xác.

7. Dữ liệu ToF trong tư duy IoT

VL53L0X sinh telemetry chính xác cao, phù hợp:

  • Trigger automation
  • Gesture detection
  • Presence sensing

Payload gợi ý:

{
  "ts": 1760000000,
  "metrics": {
    "distance_mm": 438
  }
}

8. Ví dụ 2: Gửi dữ liệu ToF realtime lên IoTLabs Cloud MQTT

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <Adafruit_VL53L0X.h>

Adafruit_VL53L0X lox;

const char* WIFI_SSID = "YOUR_WIFI";
const char* WIFI_PASS = "YOUR_PASS";

const char* MQTT_HOST = "mqtt.iotlabs.vn";
const int MQTT_PORT = 8883;
const char* MQTT_USER = "YOUR_MQTT_USER";
const char* MQTT_PASS = "YOUR_MQTT_PASS";

const char* MQTT_TOPIC =
  "iotlabs/<orgId>/devices/<deviceId>/telemetry";

WiFiClientSecure net;
PubSubClient mqtt(net);

void connectWiFi() {
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) delay(500);
}

void connectMQTT() {
  net.setInsecure();
  mqtt.setServer(MQTT_HOST, MQTT_PORT);
  while (!mqtt.connected()) {
    mqtt.connect("esp32c3-vl53l0x", MQTT_USER, MQTT_PASS);
    delay(1000);
  }
}

unsigned long lastSend = 0;

void setup() {
  Serial.begin(115200);
  Wire.begin(8, 9);
  lox.begin();

  connectWiFi();
  connectMQTT();
}

void loop() {
  if (!mqtt.connected()) connectMQTT();
  mqtt.loop();

  if (millis() - lastSend > 500) {
    lastSend = millis();

    VL53L0X_RangingMeasurementData_t measure;
    lox.rangingTest(&measure, false);

    if (measure.RangeStatus != 4) {
      long ts = millis() / 1000;

      String payload = "{";
      payload += "\"ts\":" + String(ts) + ",";
      payload += "\"metrics\":{";
      payload += "\"distance_mm\":" + String(measure.RangeMilliMeter);
      payload += "}}";

      mqtt.publish(MQTT_TOPIC, payload.c_str());
      Serial.println(payload);
    }
  }
}

9. Kinh nghiệm thực tế với VL53L0X

  • Hoạt động tốt nhất trong nhà
  • Tránh ánh sáng mặt trời trực tiếp
  • Khoảng cách < 1m cho độ chính xác cao nhất
  • Có thể dùng làm:
    • Công tắc không chạm
    • Phát hiện người đứng gần
    • Đếm vật thể

10. Khi nào chọn VL53L0X?

Chọn VL53L0X khi:

  • Cần độ chính xác cao
  • Khoảng cách ngắn
  • Không cần chống nước

Chọn JSN-SR04T khi:

  • Ngoài trời
  • Bể nước
  • Môi trường ẩm

👉 Không có sensor “tốt nhất”, chỉ có sensor phù hợp.

11. Tổng kết Bài 26

Sau bài này, bạn đã:

  • Hiểu công nghệ ToF
  • Đọc VL53L0X chính xác bằng ESP32
  • Gửi dữ liệu realtime lên IoTLabs Cloud
  • Bổ sung thêm một “vũ khí” đo khoảng cách cho hệ IoT