Виды датчиков расстояния для Arduino: HC-SR04, ИК, VL53L0X и LiDAR
Сравнение датчиков расстояния для Arduino: HC-SR04, JSN-SR04T, Sharp IR, VL53L0X/VL53L1X, TF-Luna и TCRT5000. Дальность, точность, угол луча, поверхности и примеры кода.
Выбор среди видов датчиков расстояния для Arduino поначалу кажется вопросом «какой измеряет дальше», но на деле всё решают поверхность объекта, нужная точность, требуемая ширина луча и окружающие условия. Тот же HC-SR04, который измеряет расстояние до стены с точностью до сантиметра, может давать нестабильные показания на мягкой ткани дивана, а недорогой лазерный датчик с миллиметровой точностью — терять половину дальности на солнце. В этом руководстве мы сравним шесть датчиков, которые чаще всего используют в проектах на Arduino.
Мы сравним ультразвуковой HC-SR04 и его водостойкий аналог JSN-SR04T, инфракрасный триангуляционный датчик Sharp GP2Y0A21, лазерные датчики времени пролёта (ToF) VL53L0X и VL53L1X, компактный LiDAR TF-Luna и датчик приближения малого радиуса действия TCRT5000. Для каждого разберём принцип работы, дальность, точность, угол луча, реакцию на поверхности и интерфейс, а также приведём пример скетча, прошедшего компиляцию. В конце таблица поможет выбрать датчик для конкретного проекта.

Как датчики измеряют расстояние? Три основных принципа
Почти все датчики расстояния для Arduino используют один из трёх методов. Время пролёта: датчик посылает звуковой или световой импульс и измеряет время возвращения отражённого сигнала; расстояние равно половине произведения времени на скорость. Ультразвуковые датчики делают это с помощью звука, а VL53L0X и TF-Luna — света. Свет примерно в миллион раз быстрее звука, поэтому ToF-датчики содержат специальные микросхемы, измеряющие время с пикосекундной точностью. Триангуляция: ИК-датчики Sharp направляют инфракрасный луч на объект и определяют, куда попадает отражённый свет на позиционно-чувствительном детекторе (PSD); для близких объектов пятно смещается к одному краю, для далёких — к другому. Интенсивность отражения: простые датчики вроде TCRT5000 измеряют только силу возвращающегося света; она сильно зависит от цвета поверхности, поэтому это обнаружение приближения, а не настоящее измерение расстояния.
| Принцип | Датчики | Плюсы | Минусы |
|---|---|---|---|
| Время пролёта звука | HC-SR04, JSN-SR04T | Недорого, цвет и свет не влияют | Широкий луч, плохо работает с мягкими и наклонными поверхностями, чувствителен к температуре |
| Время пролёта света | VL53L0X, VL53L1X, TF-Luna | Быстро, узкий луч, хорошая точность | Солнечный свет и стекло создают проблемы |
| Инфракрасная триангуляция | Sharp GP2Y0A21 | Мало зависит от цвета, простой аналоговый выход | Нелинейный выход, узкий диапазон, неверные показания ближе 10 см |
| Интенсивность отражения | TCRT5000 | Очень дёшево, очень быстро | Только от нескольких мм до см, сильная зависимость от цвета |
Большая сравнительная таблица
В таблице ниже собраны типичные характеристики модулей с каждым датчиком. Дальность указана по данным производителей; в реальном проекте она может быть меньше в зависимости от поверхности и окружающих условий. Цены различаются по странам, поэтому приведены в относительном виде.
| Датчик | Дальность | Точность | Угол луча | Интерфейс | Питание | Относительная цена |
|---|---|---|---|---|---|---|
| HC-SR04 | 2–400 см | Около ±0,3–1 см | Около 15° | Импульс Trig/Echo | 5 V (HC-SR04P: 3,3–5 V) | Очень низкая |
| JSN-SR04T | Около 25–450 см | Около ±1 см | Широкий (около 45° и более) | Trig/Echo, UART в некоторых версиях | 5 V | Низкая |
| Sharp GP2Y0A21 | 10–80 см | Хорошая вблизи, низкая вдали | Узкий (несколько градусов) | Аналоговое напряжение | 4,5–5,5 V | Средняя |
| VL53L0X | 3 см – 2 м (по умолчанию ~1,2 м) | Около ±3% | 25° | I2C (0x29) | Модуль 3,3–5 V | Низкая |
| VL53L1X | 4 см – 4 м | Около ±3%, разрешение в мм | 27° (можно сузить до 15°) | I2C (0x29) | Модуль 3,3–5 V | Средняя |
| TF-Luna | 0,2–8 м | ±6 см (до 3 м), ±2% (3–8 м) | 2° | UART или I2C | 5 V, логика 3,3 V | Высокая |
| TCRT5000 | Около 0,2–15 мм (лучше всего на 2,5 мм) | Не расстояние, а наличие/отсутствие | Узкий | Цифровой (DO) + аналоговый (AO) | 3,3–5 V | Очень низкая |
HC-SR04: ультразвуковая классика
HC-SR04 посылает восемь звуковых импульсов частотой 40 kHz и удерживает на пине ECHO уровень HIGH до возвращения эха. Arduino измеряет длительность этого импульса в микросекундах с помощью pulseIn(). При 20 °C звук распространяется со скоростью около 343 метров в секунду, или 0,0343 см за микросекунду; поскольку он проходит путь до объекта и обратно, distance = time × 0.0343 / 2. Скорость звука меняется с температурой (примерно 331,3 + 0,606 × T м/с): между 0 °C и 35 °C разница составляет около 6%, что даёт погрешность до 12 см на расстоянии 2 метра. Код ниже учитывает эту поправку и берёт медиану пяти измерений, чтобы отсеять случайные ошибочные эхо-сигналы.
1const int TRIG_PIN = 9;
2const int ECHO_PIN = 10;
3const float SICAKLIK = 20.0; // ortam sıcaklığı, °C / ambient temperature, °C
4float sesHizi; // cm/µs
5
6float mesafeOlc() {
7 digitalWrite(TRIG_PIN, LOW);
8 delayMicroseconds(2);
9 digitalWrite(TRIG_PIN, HIGH); // 10 µs tetik darbesi / 10 µs trigger pulse
10 delayMicroseconds(10);
11 digitalWrite(TRIG_PIN, LOW);
12 unsigned long sure = pulseIn(ECHO_PIN, HIGH, 30000UL); // 30 ms ≈ 5 m sınırı / ~5 m limit
13 if (sure == 0) return -1; // yankı yok / no echo
14 return sure * sesHizi / 2.0; // gidiş-dönüş / round trip
15}
16
17void setup() {
18 Serial.begin(9600);
19 pinMode(TRIG_PIN, OUTPUT);
20 pinMode(ECHO_PIN, INPUT);
21 sesHizi = (331.3 + 0.606 * SICAKLIK) / 10000.0; // m/s -> cm/µs (20 °C: 0,0343)
22}
23
24void loop() {
25 float olcum[5];
26 for (int i = 0; i < 5; i++) { // 5 ölçüm, aralarında 60 ms / 5 readings, 60 ms apart
27 olcum[i] = mesafeOlc();
28 delay(60);
29 }
30 for (int i = 1; i < 5; i++) { // sırala / sort
31 float x = olcum[i];
32 int j = i - 1;
33 while (j >= 0 && olcum[j] > x) { olcum[j + 1] = olcum[j]; j--; }
34 olcum[j + 1] = x;
35 }
36 float d = olcum[2]; // ortanca / median
37 if (d < 0) Serial.println("Menzil disi / out of range");
38 else { Serial.print(d, 1); Serial.println(" cm"); }
39}
40- Выдерживай минимум 60 мс между измерениями: если повторить измерение, пока эхо предыдущего импульса ещё отражается по комнате, результат будет неверным.
- Мягкие и наклонные поверхности: ткань, поролон и шторы поглощают звук; поверхности с наклоном более 45 градусов отражают эхо в сторону от датчика.
- Широкий луч: конус примерно в 15 градусов на расстоянии 2 метра охватывает область шириной почти 50 см; в узком коридоре датчик может видеть и боковые стены.
- Платы на 3,3 V: классическому HC-SR04 нужно 5 V, и его выход ECHO тоже выдаёт 5 V; для ESP32 и Pico установи делитель напряжения на ECHO или используй HC-SR04P, работающий от 3,3 V.
- Несколько датчиков: два HC-SR04, запущенные одновременно, слышат эхо друг друга; запускай их по очереди.
Подключение HC-SR04 и его использование с монитором порта и LCD подробно разобраны в статье «Датчик расстояния HC-SR04»; здесь мы сосредоточимся на сравнении.
JSN-SR04T: водостойкий ультразвуковой датчик
JSN-SR04T использует ту же логику запуска и эха, что и HC-SR04, но его преобразователь находится в водонепроницаемой капсуле на кабеле, отдельно от электронной платы. Поэтому он подходит для влажных мест: баков с водой, колодцев, ёмкостей для дождевой воды и уличных парктроников. Есть два важных отличия: поскольку один преобразователь и излучает, и принимает сигнал, вблизи него есть слепая зона (около 20–25 см), а луч шире, чем у HC-SR04. Установи датчик на верхней крышке бака как минимум на 25 см выше максимального уровня воды. Код ниже преобразует расстояние в процент заполнения.
1// JSN-SR04T ile su deposu doluluğu / water tank level with a JSN-SR04T
2const int TRIG_PIN = 9;
3const int ECHO_PIN = 10;
4const float SENSOR_BOSLUK = 25.0; // sensörden en yüksek su seviyesine, cm (ölü bölge) / sensor to max level (blind zone)
5const float DEPO_DERINLIK = 120.0; // en yüksek seviyeden depo dibine, cm / max level to tank bottom
6
7float mesafeOlc() {
8 digitalWrite(TRIG_PIN, LOW);
9 delayMicroseconds(5);
10 digitalWrite(TRIG_PIN, HIGH);
11 delayMicroseconds(20); // JSN-SR04T 10 µs'den uzun darbeyi sever / likes a longer pulse
12 digitalWrite(TRIG_PIN, LOW);
13 unsigned long sure = pulseIn(ECHO_PIN, HIGH, 40000UL);
14 if (sure == 0) return -1;
15 return sure * 0.0343 / 2.0; // 20 °C ses hızı / speed of sound at 20 °C
16}
17
18void setup() {
19 Serial.begin(9600);
20 pinMode(TRIG_PIN, OUTPUT);
21 pinMode(ECHO_PIN, INPUT);
22}
23
24void loop() {
25 float d = mesafeOlc();
26 if (d < 0) {
27 Serial.println("Yanki yok / no echo");
28 } else {
29 float suYuksekligi = DEPO_DERINLIK - (d - SENSOR_BOSLUK); // dipten su yüksekliği / water height
30 float yuzde = constrain(suYuksekligi / DEPO_DERINLIK * 100.0, 0, 100);
31 Serial.print("Mesafe / distance: ");
32 Serial.print(d, 1);
33 Serial.print(" cm Doluluk / fill: %");
34 Serial.println(yuzde, 0);
35 }
36 delay(1000); // su yüzeyi dalgalanır, sık ölçme / water ripples, measure slowly
37}
38Sharp GP2Y0A21: аналоговый инфракрасный датчик
Sharp GP2Y0A21YK0F — инфракрасный датчик, работающий на расстоянии от 10 до 80 см и выдающий аналоговое напряжение в зависимости от расстояния. Благодаря триангуляции он менее чувствителен к цвету объекта, чем датчики на основе интенсивности отражения. Выход нелинейный: около 2,3 V при 10 см и 0,4 V при 80 см, а между ними зависимость описывается степенной функцией с отрицательным показателем. Код преобразует эту кривую по приближённой формуле distance = 29.988 × V^-1.173. Главная ловушка — расстояние меньше 10 см: при дальнейшем приближении объекта выходное напряжение снова падает, и объект в 5 см может выглядеть так, будто находится в 20 см. Установи датчик так, чтобы объект никогда не мог приблизиться ближе 10 см.
1// Sharp GP2Y0A21YK0F (10–80 cm), analog / analog output
2const int SHARP_PIN = A0;
3
4float sharpCm() {
5 long toplam = 0;
6 for (int i = 0; i < 20; i++) { // 20 okumanın ortalaması / average of 20 readings
7 toplam += analogRead(SHARP_PIN);
8 delay(2);
9 }
10 float volt = toplam / 20.0 * 5.0 / 1023.0;
11 if (volt < 0.35) return -1; // 80 cm'den uzak / farther than 80 cm
12 float cm = 29.988 * pow(volt, -1.173); // ters güç eğrisi / inverse power curve
13 if (cm > 80) return -1;
14 return cm; // 10 cm altı yanıltıcı / misleading below 10 cm
15}
16
17void setup() {
18 Serial.begin(9600);
19}
20
21void loop() {
22 float cm = sharpCm();
23 if (cm < 0) Serial.println("Menzil disi / out of range");
24 else { Serial.print(cm, 1); Serial.println(" cm"); }
25 delay(100);
26}
27Во время измерения датчики Sharp потребляют короткие импульсы большого тока, создающие помехи на линии питания. Конденсатор примерно на 10 µF рядом с пинами VCC и GND датчика заметно стабилизирует показания. В семействе есть модели с другими диапазонами: GP2Y0A41SK0F работает от 4 до 30 см, GP2Y0A02YK0F — от 20 до 150 см; у каждой свои коэффициенты кривой.
VL53L0X и VL53L1X: лазерные ToF-датчики
VL53L0X и VL53L1X — крошечные лазерные датчики времени пролёта от STMicroelectronics. Они посылают невидимый лазерный импульс с длиной волны 940 нм, измеряют время возвращения отражения с помощью счётчиков фотонов и передают результат прямо в миллиметрах по I2C. Они почти не зависят от цвета, их луч уже, чем у ультразвуковых датчиков, а измерение занимает 20–50 мс. VL53L0X измеряет примерно до 1,2 метра в режиме по умолчанию и до 2 метров в режиме увеличенной дальности; VL53L1X достигает 4 метров, а его поле зрения (ROI) можно сузить программно. I2C-адрес по умолчанию у обоих — 0x29. Код ниже использует библиотеку VL53L0X от Pololu; найди «VL53L0X» в «Менеджере библиотек» (Library Manager) и установи версию Pololu.
1#include <Wire.h>
2#include <VL53L0X.h> // Pololu VL53L0X kütüphanesi / library
3
4VL53L0X sensor;
5
6void setup() {
7 Serial.begin(9600);
8 Wire.begin(); // Uno: SDA A4, SCL A5 / ESP32: SDA 21, SCL 22
9 sensor.setTimeout(500);
10 if (!sensor.init()) {
11 Serial.println("VL53L0X bulunamadi / not found");
12 while (true) {}
13 }
14 // Uzun menzil modu (2 m'ye kadar, daha gürültülü) / long range mode (up to 2 m, noisier):
15 // sensor.setSignalRateLimit(0.1);
16 // sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
17 // sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
18 sensor.setMeasurementTimingBudget(50000); // 50 ms: daha kararlı ölçüm / steadier reading
19 sensor.startContinuous();
20}
21
22void loop() {
23 uint16_t mm = sensor.readRangeContinuousMillimeters();
24 if (sensor.timeoutOccurred()) {
25 Serial.println("Zaman asimi / timeout");
26 } else if (mm >= 8190) { // 8190-8191: hedef yok / no target
27 Serial.println("Menzil disi / out of range");
28 } else {
29 Serial.print(mm);
30 Serial.println(" mm");
31 }
32}
33Время, отведённое на измерение, определяет баланс точности и скорости: 20 мс — быстро, но с шумом, 200 мс — медленно, но стабильно. Солнечный свет и мощные инфракрасные источники заметно сокращают дальность; учитывай это при измерениях на улице. Чтобы подключить два VL53L0X к одной шине I2C, при одинаковом адресе 0x29 нужно удерживать один выключенным через пин XSHUT, а другому назначить новый адрес (setAddress); подробности I2C — в статье «Что такое I2C».
TF-Luna: 8 метров с компактным LiDAR
TF-Luna — компактный одноточечный LiDAR от Benewake: он измеряет время пролёта, модулируя инфракрасный свет с длиной волны 850 нм, работает от 0,2 до 8 метров с очень узким лучом всего 2 градуса и выполняет до 250 измерений в секунду. По умолчанию он передаёт каждое измерение по UART на скорости 115200 бод пакетом из 9 байт: два байта заголовка 0x59, расстояние (см), сила сигнала, внутренняя температура и контрольная сумма. Если сила сигнала ниже 100 или равна 65535 (засветка), измерение считается ненадёжным. Питание — 5 V, но логический уровень UART — 3,3 V, поэтому к ESP32 он подключается напрямую. Поскольку SoftwareSerial на Uno ненадёжно работает на скорости 115200 бод, выбирай плату с аппаратным UART, например ESP32 или Mega; логика разбора UART-пакетов описана в статье «Последовательная связь UART».
1// TF-Luna LiDAR, UART (115200), ESP32 Serial2
2// TF-Luna TX -> GPIO 16, RX -> GPIO 17, VCC 5V, GND
3const int RXD2 = 16, TXD2 = 17;
4
5uint8_t kare[9]; // 0x59 0x59 DistL DistH AmpL AmpH TempL TempH Checksum
6int konum = 0;
7
8void setup() {
9 Serial.begin(115200);
10 Serial2.begin(115200, SERIAL_8N1, RXD2, TXD2);
11}
12
13void loop() {
14 while (Serial2.available()) {
15 uint8_t b = Serial2.read();
16 if (konum < 2) { // iki 0x59 başlık baytını bekle / wait for two 0x59 header bytes
17 if (b == 0x59) kare[konum++] = b;
18 else konum = 0;
19 continue;
20 }
21 kare[konum++] = b;
22 if (konum < 9) continue;
23 konum = 0;
24
25 uint8_t toplam = 0;
26 for (int i = 0; i < 8; i++) toplam += kare[i];
27 if (toplam != kare[8]) continue; // sağlama toplamı hatalı / bad checksum
28
29 uint16_t mesafe = kare[2] | (kare[3] << 8); // cm
30 uint16_t guc = kare[4] | (kare[5] << 8); // sinyal gücü / signal strength
31 float derece = (kare[6] | (kare[7] << 8)) / 8.0 - 256.0;
32
33 if (guc < 100 || guc == 65535) { // zayıf ya da aşırı sinyal / weak or saturated
34 Serial.println("Guvenilmez / unreliable");
35 } else {
36 Serial.print(mesafe);
37 Serial.print(" cm guc / amp: ");
38 Serial.print(guc);
39 Serial.print(" ic sicaklik / chip temp: ");
40 Serial.println(derece, 1);
41 }
42 }
43}
44TCRT5000: обнаружение приближения и линии

TCRT5000 — не дальномер, а отражательный датчик: свет инфракрасного светодиода отражается от поверхности, а расположенный рядом фототранзистор измеряет, сколько света вернулось. Лучше всего он работает примерно на 2,5 мм, а дальше 1,5 см сигнал быстро ослабевает. Белые поверхности отражают много света, а чёрные — очень мало, поэтому даже на одинаковом расстоянии значения сильно зависят от цвета; именно поэтому датчик используют для различения чёрного и белого в роботах, следующих по линии, подсчёта отверстий в дисках энкодеров и обнаружения очень близких объектов. Компаратор модуля переключает цифровой выход при пересечении порога, заданного потенциометром. Подробности — в статье «Инфракрасный датчик TCRT5000».
1// TCRT5000 modülü: DO dijital, AO analog / TCRT5000 module: DO digital, AO analog
2const int DO_PIN = 7;
3const int AO_PIN = A1;
4const int LED_PIN = 13;
5
6void setup() {
7 Serial.begin(9600);
8 pinMode(DO_PIN, INPUT);
9 pinMode(LED_PIN, OUTPUT);
10}
11
12void loop() {
13 bool nesneVar = (digitalRead(DO_PIN) == LOW); // çoğu modülde LOW = yansıma var / LOW = reflection on most modules
14 int yansima = analogRead(AO_PIN); // düşük değer = güçlü yansıma / low value = strong reflection
15 digitalWrite(LED_PIN, nesneVar);
16 Serial.print(nesneVar ? "Nesne VAR / object " : "Nesne yok / none ");
17 Serial.println(yansima);
18 delay(100);
19}
20Влияние поверхности и окружающих условий
Заявленная дальность датчика меняется при работе с конкретной поверхностью. Ультразвуковые датчики отлично справляются с твёрдыми поверхностями, отражающими звук, но испытывают трудности с поглощающей его тканью; оптическим датчикам важны цвет, блеск и солнечный свет. Таблица ниже поможет при проектировании понять, какой датчик сохраняет надёжность в разных условиях.
| Поверхность / условия | Ультразвуковой (HC-SR04) | Sharp IR | Лазерный ToF (VL53, TF-Luna) | TCRT5000 |
|---|---|---|---|---|
| Твёрдая плоская стена | Очень хорошо | Хорошо | Очень хорошо | Хорошо (только совсем вблизи) |
| Ткань, поролон, шторы | Плохо (звук поглощается) | Хорошо | Хорошо | Средне |
| Матовая чёрная поверхность | Хорошо | Средне | Дальность сокращается | Очень плохо |
| Стекло, зеркало, блестящий металл | Хорошо (звук отражается) | Неверные показания | Неверные показания (свет проходит насквозь или отклоняется) | Неверные показания |
| Наклонная поверхность | Плохо (эхо уходит в сторону) | Средне | Хорошо | Средне |
| Солнечный свет, улица | Не влияет | Влияет | Дальность заметно падает | Влияет |
| Поверхность воды | Хорошо (измерение в баке) | Плохо | Нестабильно | Не подходит |
| Изменения температуры | Скорость звука меняется, нужна поправка | Слабое влияние | Слабое влияние | Слабое влияние |
Сводка подключений: Uno, ESP32 и Pico
| Датчик | Arduino Uno | ESP32 | Raspberry Pi Pico | Примечание |
|---|---|---|---|---|
| HC-SR04 / JSN-SR04T | TRIG D9, ECHO D10, 5V | TRIG 5, ECHO 18 (через делитель), VIN 5V | TRIG GP14, ECHO GP15 (через делитель), VBUS | ECHO выдаёт 5 V |
| Sharp GP2Y0A21 | A0, 5V | GPIO 34 (через делитель), VIN 5V | GP26 (через делитель), VBUS | Выход может достигать 3,1 V |
| VL53L0X / VL53L1X | SDA A4, SCL A5 | SDA 21, SCL 22 | SDA GP4, SCL GP5 | Адрес 0x29 |
| TF-Luna | SoftwareSerial не рекомендуется | TX → GPIO 16, RX → GPIO 17 | TX → GP1 (uart0 RX), RX → GP0 | Питание 5 V, логика 3,3 V |
| Модуль TCRT5000 | DO D7, AO A1 | DO 27, AO 34 | DO GP16, AO GP27 | 3,3–5 V |
Ультразвуковые измерения с Raspberry Pi Pico
В MicroPython длительность импульса измеряется функцией machine.time_pulse_us(); она выполняет ту же задачу, что pulseIn() на Arduino, и при таймауте возвращает отрицательное значение. Подай питание на HC-SR04 с пина VBUS (USB 5 V) платы Pico и установи делитель 1 kΩ + 2 kΩ на линию ECHO либо используй HC-SR04P, который работает напрямую от 3,3 V. Для VL53L0X и TF-Luna тоже есть драйверы MicroPython; UART-пакет TF-Luna легко разобрать с помощью machine.UART по той же логике, что и в коде Arduino.
1from machine import Pin, time_pulse_us
2import time
3
4trig = Pin(14, Pin.OUT)
5echo = Pin(15, Pin.IN) # 5 V ECHO için gerilim bölücü şart / divider required for a 5 V ECHO
6SES_HIZI = 0.0343 # cm/µs, 20 °C
7
8def mesafe_olc():
9 trig.low()
10 time.sleep_us(2)
11 trig.high()
12 time.sleep_us(10) # 10 µs tetik / 10 µs trigger
13 trig.low()
14 sure = time_pulse_us(echo, 1, 30000) # zaman aşımında eksi döner / negative on timeout
15 if sure < 0:
16 return None
17 return sure * SES_HIZI / 2
18
19while True:
20 d = mesafe_olc()
21 print("Menzil disi" if d is None else "{:.1f} cm".format(d))
22 time.sleep_ms(100)
23Какой датчик расстояния выбрать для проекта?
| Проект | Рекомендуемый датчик | Почему? |
|---|---|---|
| Робот, объезжающий препятствия | HC-SR04 (бюджетный) или VL53L0X | Широкий луч не пропускает препятствия; VL53L0X быстрее и компактнее |
| Уровень воды в баке или колодце | JSN-SR04T | Водонепроницаемый зонд, хорошо видит поверхность воды |
| Автомобильный парктроник | JSN-SR04T или HC-SR04 | Устойчивость к уличным условиям, дальности 2–3 м достаточно |
| Робот, следующий по линии | TCRT5000 | Предназначен для различения чёрного и белого |
| Мини-сумо, точные измерения на столе | VL53L0X / VL53L1X | Миллиметровое разрешение, узкий луч, малые размеры |
| Радар на Arduino (развёртка сервоприводом) | HC-SR04 или TF-Luna | HC-SR04 недорогой; луч TF-Luna в 2° даёт гораздо более чёткую карту |
| Ростомер, счётчик проходов в дверном проёме | VL53L1X или TF-Luna | Большая дальность и стабильные показания |
| Дрон, большое расстояние | TF-Luna | Дальность 8 м, до 250 Hz |
| Бесконтактный кран, обнаружение руки | Sharp GP2Y0A21 | Диапазон 10–80 см и простой аналоговый выход |
Ещё несколько идей: поворачивай HC-SR04 сервоприводом, чтобы создать дисплей радара на Arduino; поставь один HC-SR04 спереди и два VL53L0X по бокам робота, объезжающего препятствия; открывай крышку умного мусорного ведра при приближении руки; собери переносную цифровую рулетку с OLED-дисплеем или передавай уровень заполнения бака на телефон через ESP32 с JSN-SR04T.
Частые ошибки и их решения
| Симптом | Вероятная причина | Решение |
|---|---|---|
| HC-SR04 всегда показывает 0 или выход за диапазон | Нет эха, проблема с подключением или питанием | Проверь питание 5 V и пины TRIG/ECHO, задай таймаут для pulseIn |
| Ультразвуковые показания иногда скачут | Эхо предыдущего импульса или боковой стены | Выдерживай 60 мс между измерениями, используй медианный фильтр |
| JSN-SR04T не измеряет вблизи | Слепая зона (20–25 см) | Установи датчик минимум в 25 см от объекта |
| Sharp вблизи даёт большое неверное значение | Ближе 10 см кривая разворачивается | Не допускай приближения объекта ближе 10 см |
| Показания Sharp зашумлены | Импульсы тока создают помехи в питании | Конденсатор 10 µF между VCC и GND, усреднение показаний |
| VL53L0X не найден | Подключение I2C или конфликт адресов | Проверь SDA/SCL и адрес 0x29 сканером I2C |
| Лазерный датчик на улице показывает меньшее расстояние | Инфракрасная составляющая солнечного света | Добавь затенение, увеличь время измерения или используй ультразвуковой датчик |
| Некорректные данные TF-Luna | Неверная скорость или SoftwareSerial не успевает | Используй 115200 бод и аппаратный UART, проверяй контрольную сумму |
Датчики расстояния — самый простой способ дать проектам на Arduino возможность воспринимать окружение, а правильный выбор определяет, будет ли проект работать стабильно или постоянно раздражать. Таблицы и код в этом сравнении помогут найти баланс цены и характеристик под твои задачи. В приложении BlueGrays есть пошаговые проекты со схемами и кодом: измерение расстояния с HC-SR04, парктроник, ростомер, робот, объезжающий препятствия, парктроник на ESP32 и измерение расстояния с TCRT5000.
Частые вопросы
Какой датчик расстояния лучше всего подходит для Arduino?
Единственного лучшего датчика нет: выбор зависит от объекта и условий. HC-SR04 подходит для обычных недорогих проектов, VL53L0X или VL53L1X — для миллиметровой точности и узкого луча, JSN-SR04T — для влажных мест, а TF-Luna — для быстрых измерений на расстоянии больше нескольких метров.
На каком расстоянии может измерять HC-SR04?
Производитель указывает диапазон от 2 см до 4 метров, но на практике надёжные показания обычно удаётся получить до 2–3 метров. К пределу можно приблизиться, если объект крупный, твёрдый и расположен перпендикулярно датчику; для мягких, маленьких или наклонных объектов дальность заметно сокращается.
Чем отличаются ультразвуковые и инфракрасные датчики расстояния?
Ультразвуковой датчик измеряет время возвращения эха звукового импульса; цвет и свет на него не влияют, но луч широкий, а мягкие поверхности затрудняют измерения. Инфракрасные датчики используют свет, имеют более узкий луч и работают быстро, но солнце, стекло и некоторые тёмные поверхности могут искажать показания.
Чем отличаются VL53L0X и VL53L1X?
Оба — лазерные ToF-датчики с интерфейсом I2C. VL53L0X измеряет примерно до 2 метров, а VL53L1X достигает 4 метров, может измерять быстрее и позволяет программно сужать поле зрения. VL53L0X подходит небольшим роботам для близких расстояний, VL53L1X — для более дальних и точных измерений.
Какой датчик расстояния использовать для уровня воды в баке?
Чаще всего выбирают JSN-SR04T с водонепроницаемым зондом; его устанавливают на верхней крышке бака как минимум на 25 см выше максимального уровня воды. HC-SR04 тоже работает в сухих закрытых баках, но влажность и конденсат могут быстро его повредить.
Работают ли датчики расстояния с ESP32 и Raspberry Pi Pico?
Да, но нужен делитель напряжения, чтобы понизить выход ECHO датчиков HC-SR04 и JSN-SR04T с питанием 5 V, а также аналоговый выход Sharp до 3,3 V. Модули VL53L0X и TF-Luna уже используют логику, совместимую с 3,3 V, а HC-SR04P работает напрямую от 3,3 V.
Что собрать после прочтения
Все проекты
Измерение расстояния HC-SR04 (вывод в порт)
Датчик HC-SR04 работает совсем как летучая мышь, которая находит дорогу в темноте: он посылает звук, которого ты не слышишь, слушает эхо и измеряет, насколько далеко предмет перед ним. Arduino каждые

Парктроник на HC-SR04
Мини-версия автомобильного парктроника: чем ближе предмет, тем чаще сигнал. Датчик расстояния измеряет предмет перед собой; если он дальше 20 сантиметров, горит зелёный светодиод, а если ближе — мигае

Измерение роста
Ростомер, который вешается на дверную раму и сообщает в сантиметрах рост человека, стоящего под ним. Сначала, пока под ним никого нет, ты нажимаешь первую кнопку, и датчик расстояния измеряет расстоян

Робот, объезжающий препятствия
Как насчёт того, чтобы собрать умную машину, которая сама находит дорогу? Робот, объезжающий препятствия, постоянно осматривает всё вокруг благодаря ультразвуковому датчику спереди. Встретив препятств

Ультразвуковой датчик расстояния HC-SR04 на ESP32
Ультразвуковой датчик HC-SR04 вычисляет расстояние по времени, за которое испущенная им звуковая волна отражается от предмета и возвращается (Time of Flight). В этом проекте ESP32 подаёт импульс 10 микросекунд на пин TRIG датчика, а длительность эха читает с пина ECHO через pulseIn(). Вычисленное расстояние в сантиметрах выводится на I2C LCD 16x2. HC-SR04 работает от 5V, поэтому на пине ECHO нужен делитель напряжения.

Парктроник на ESP32 (HC-SR04 + шкала из 5 светодиодов + зуммер + OLED)
ESP32-версия автомобильного парктроника! Ультразвуковой датчик HC-SR04 измеряет расстояние до предмета перед ним. По мере уменьшения расстояния шкала из 5 светодиодов заполняется (зелёный → жёлтый → красный), а интервал сигналов зуммера сокращается. Когда предмет совсем близко (меньше 10 см), звучит непрерывная тревога и горят все светодиоды. OLED SSD1306 показывает расстояние в см крупным шрифтом и сообщение состояния (STOP / CAUTION / CLOSE / STOP! / DANGER).

Чтение отражения (приближения) с TCRT5000
С маленьким датчиком, который посылает невидимый свет и измеряет, сколько его отражается обратно, можно определить поверхность перед ним. Чем ближе предмет или светлая поверхность, тем больше света во

Измерение расстояния с выводом на LCD
Инструмент, который измеряет расстояние без линейки: двигай рукой перед датчиком туда-сюда и смотри, как меняется число. HC-SR04 посылает звуковую волну и слушает эхо, а Arduino вычисляет расстояние в
Другие статьи
Приложение BlueGrays
Собери эту схему шаг за шагом в телефоне
Схема подключения, код и список деталей на одном экране. 200+ проектов на Arduino, ESP32 и Pico готовы к сборке.
Наведи камеру телефона
Наведи камеру на код — откроется магазин приложений на телефоне.
или открыть магазин

