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-SR04 | JSN-SR04T | VL53L0X |
|---|---|---|---|
| Công nghệ | Siêu âm | Siêu âm | Laser ToF |
| Chống nước | ❌ | ✅ | ❌ |
| Độ chính xác | Trung bình | Trung bình | Cao |
| Góc ảnh hưởng | Có | Có | Ít |
| Indoor | Tốt | Tốt | Rất tốt |
| Outdoor | Trung bình | Tốt | Ké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)
| VL53L0X | ESP32-C3 |
|---|---|
| VCC | 3.3V |
| GND | GND |
| SDA | GPIO8 |
| SCL | GPIO9 |
📌 Đị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


