← До всіх проєктів
Сенсори Середній

Парктронік на лазерному далекомірі VL53L0X: LCD і зумер

VL53L0X міряє відстань за часом польоту лазерного імпульсу: до 1.2–2 м з точністю до міліметрів. Збираємо парктронік: сантиметри й смужка на LCD 1602, зумер пищить тим частіше, чим ближче перешкода.

Складність
Середній
Час
45 min
Категорія
Сенсори
Оновлено

Про проєкт

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 м і програмована зона огляду, бібліотека майже та сама.