Парктронік на лазерному далекомірі VL53L0X: LCD і зумер
VL53L0X міряє відстань за часом польоту лазерного імпульсу: до 1.2–2 м з точністю до міліметрів. Збираємо парктронік: сантиметри й смужка на LCD 1602, зумер пищить тим частіше, чим ближче перешкода.
Про проєкт
VL53L0X — крихітний лазерний далекомір (ToF, time-of-flight) від ST. Він випромінює невидимий інфрачервоний імпульс на 940 нм і рахує, за скільки пікосекунд світло повернеться. На відміну від ультразвукового HC-SR04, у нього вузький промінь, він не боїться м'яких поверхонь і працює по I2C. Збираємо парктронік для гаража.
Що знадобиться
- ESP32 DevKit
- Модуль VL53L0X (GY-530 або Pololu)
- LCD 1602 з I2C-перехідником
- Зумер (пасивний або активний) і резистор 100 Ом
- Бібліотеки VL53L0X (Pololu) і LiquidCrystal_I2C
Схема
VL53L0X і LCD — на спільній шині I2C, з адресами 0x29 і 0x27:
| Модуль | VIN/VCC | GND | SDA | SCL |
|---|---|---|---|---|
| VL53L0X | 3V3 | GND | GPIO21 | GPIO22 |
| LCD 1602 | 3V3 | GND | GPIO21 | GPIO22 |
Зумер: GPIO25 → 100 Ом → «+» зумера, «−» → GND. Резистор обмежує струм виводу, інакше симулятор попередить про перевищення 20 мА.
Виводи GPIO1 (переривання «вимір готовий») і XSHUT (вимкнення) можна не підключати. XSHUT знадобиться, якщо датчиків кілька: у всіх однакова адреса 0x29, тож їх вмикають по черзі й перепризначають адреси через setAddress().
Як це працює
startContinuous()— датчик міряє безперервно, кожне вимірювання ~33 мс (бюджет часу за замовчуванням).readRangeContinuousMillimeters()повертає останнє значення в мм. 8190/8191 означає, що в межах досяжності нічого немає.setTimeout(500)+timeoutOccurred()рятують від зависання, якщо датчик відвалився від шини.- Дальність: ~1.2 м у стандартному режимі, до 2 м у «long range» (
setSignalRateLimit(0.1)і довші імпульси VCSEL), ціною точності.
Код
// Парктронік: лазерний далекомір VL53L0X + LCD 1602 (обидва на I2C) + зумер
#include <Wire.h>
#include <VL53L0X.h>
#include <LiquidCrystal_I2C.h>
VL53L0X sensor;
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int BUZZER = 25;
unsigned long lastBeep = 0;
void setup() {
Serial.begin(115200);
Wire.begin();
lcd.init();
lcd.backlight();
sensor.setTimeout(500);
if (!sensor.init()) {
lcd.print("VL53L0X error");
while (true) delay(1000);
}
sensor.startContinuous();
pinMode(BUZZER, OUTPUT);
}
void loop() {
uint16_t mm = sensor.readRangeContinuousMillimeters();
bool valid = !sensor.timeoutOccurred() && mm < 8000; // 8190 — нічого в зоні досяжності
lcd.setCursor(0, 0);
if (valid) {
lcd.print("Distance: ");
lcd.print(mm / 10);
lcd.print(" cm ");
} else {
lcd.print("Too far ");
}
lcd.setCursor(0, 1);
int bars = valid ? constrain(map(mm, 50, 1000, 16, 0), 0, 16) : 0;
for (int i = 0; i < 16; i++) lcd.write(i < bars ? 0xFF : ' '); // 0xFF — зафарбована клітинка
// що ближче, то частіше пищить; ближче 10 см — безперервний тон
if (!valid || mm > 1000) {
noTone(BUZZER);
} else if (mm < 100) {
tone(BUZZER, 2000);
} else {
unsigned long interval = map(mm, 100, 1000, 80, 800);
if (millis() - lastBeep > interval) {
tone(BUZZER, 2000, 40);
lastBeep = millis();
}
}
}
Корисно знати
- Колір і матеріал. Чорний матовий пластик відбиває гірше: дальність падає до 50–70 см. Скло й дзеркала можуть давати хибні відстані.
- Яскраве сонце засвічує датчик, і на вулиці дальність помітно менша.
- Захисне скло перед датчиком без спеціальної калібровки дає відблиск і «вічні 3 см». Краще відкритий отвір.
- VL53L1X — старший брат: до 4 м і програмована зона огляду, бібліотека майже та сама.