Guias · 11 min de leitura

Tipos de sensores de distância para Arduino: HC-SR04, IR, VL53L0X e LiDAR

Comparação de sensores de distância para Arduino: HC-SR04, JSN-SR04T, Sharp IR, VL53L0X/VL53L1X, TF-Luna e TCRT5000; alcance, exatidão, ângulo do feixe, superfícies e exemplos de código.

Escolher entre os tipos de sensores de distância para Arduino parece, à primeira vista, uma questão de “qual mede mais longe”, mas o que realmente decide é a superfície que você vai medir, a exatidão necessária, o quanto o feixe precisa ser estreito e as condições do ambiente. O mesmo HC-SR04 que mede a distância até uma parede com exatidão de centímetros pode ficar instável diante do tecido macio de um sofá, enquanto um sensor laser barato que oferece precisão milimétrica pode perder metade do alcance sob a luz do sol. Neste guia, colocamos lado a lado os seis sensores mais usados em projetos com Arduino.

Os sensores que vamos comparar são: o ultrassônico HC-SR04 e seu irmão à prova d’água, o JSN-SR04T, o sensor de triangulação infravermelha Sharp GP2Y0A21, os sensores laser de tempo de voo (ToF) VL53L0X e VL53L1X, o pequeno LiDAR TF-Luna e o sensor de proximidade de curto alcance TCRT5000. Para cada um, explicamos o princípio de funcionamento, o alcance, a exatidão, o ângulo do feixe, a reação às superfícies e a interface, e fornecemos um sketch de exemplo compilado. No final, uma tabela resume qual escolher para cada projeto.

Sensor ultrassônico de distância HC-SR04
HC-SR04: dois transdutores ultrassônicos, um que emite som e outro que escuta o eco; o sensor de distância mais comum no mundo Arduino.

Como os sensores de distância medem? Três princípios básicos

Quase todos os sensores de distância usados com Arduino se baseiam em um de três métodos. Tempo de voo: o sensor emite um pulso de som ou luz e mede quanto tempo a reflexão leva para voltar; a distância é metade do produto entre tempo e velocidade. Sensores ultrassônicos fazem isso com som, e o VL53L0X e o TF-Luna, com luz. Como a luz é cerca de um milhão de vezes mais rápida que o som, sensores ToF contêm chips especiais com temporização na escala de picossegundos. Triangulação: sensores Sharp IR emitem um feixe infravermelho em direção ao alvo e verificam onde a luz refletida atinge um detector sensível à posição (PSD); para objetos próximos, o ponto se desloca para uma extremidade e, para os distantes, para a outra. Intensidade da reflexão: sensores simples como o TCRT5000 medem apenas a intensidade da luz que retorna; como isso depende muito da cor da superfície, trata-se de detecção de proximidade, e não de uma medição real de distância.

PrincípioSensoresVantagensDesvantagens
Tempo de voo com somHC-SR04, JSN-SR04TBarato, não é afetado pela cor nem pela luzFeixe amplo, desempenho fraco em superfícies macias e inclinadas, sensível à temperatura
Tempo de voo com luzVL53L0X, VL53L1X, TF-LunaRápido, feixe estreito, boa exatidãoLuz solar e vidro causam problemas
Triangulação infravermelhaSharp GP2Y0A21Pouco afetado pela cor, saída analógica simplesSaída não linear, faixa limitada, resultados enganosos abaixo de 10 cm
Intensidade da reflexãoTCRT5000Muito barato, muito rápidoApenas alguns mm a cm, depende muito da cor

A tabela geral de comparação

A tabela abaixo reúne os valores típicos dos módulos de cada sensor. Os alcances são os informados pelos fabricantes; em um projeto real, podem ser menores dependendo da superfície e do ambiente. Os preços variam conforme o país, por isso são apresentados em termos relativos.

SensorAlcanceExatidãoÂngulo do feixeInterfaceAlimentaçãoPreço relativo
HC-SR042–400 cmCerca de ±0,3–1 cmCerca de 15°Pulso Trig/Echo5 V (HC-SR04P: 3,3–5 V)Muito barato
JSN-SR04TCerca de 25–450 cmCerca de ±1 cmAmplo (cerca de 45° ou mais)Trig/Echo, UART em algumas versões5 VBarato
Sharp GP2Y0A2110–80 cmBoa de perto, fraca de longeEstreito (alguns graus)Tensão analógica4,5–5,5 VMédio
VL53L0X3 cm – 2 m (padrão ~1,2 m)Cerca de ±3%25°I2C (0x29)Módulo 3,3–5 VBarato
VL53L1X4 cm – 4 mCerca de ±3%, resolução em mm27° (pode ser reduzido a 15°)I2C (0x29)Módulo 3,3–5 VMédio
TF-Luna0,2–8 m±6 cm (até 3 m), ±2% (3–8 m)2°UART ou I2C5 V, lógica de 3,3 VCaro
TCRT5000Cerca de 0,2–15 mm (melhor a 2,5 mm)Não mede distância, indica presença/ausênciaEstreitoDigital (DO) + analógica (AO)3,3–5 VMuito barato

HC-SR04: o clássico ultrassônico

O HC-SR04 emite oito pulsos sonoros de 40 kHz e mantém o pino ECHO em HIGH até o eco retornar. O Arduino mede a duração desse pulso em microssegundos com pulseIn(). A 20 °C, o som percorre cerca de 343 metros por segundo, ou 0,0343 cm por microssegundo; como o som vai até o alvo e volta, distância = tempo × 0,0343 / 2. A velocidade do som varia com a temperatura (cerca de 331,3 + 0,606 × T m/s): entre 0 °C e 35 °C, há uma diferença de cerca de 6%, o que significa até 12 cm de erro a 2 metros. O código abaixo aplica essa correção e usa a mediana de cinco leituras para eliminar ecos incorretos ocasionais.

C++ (Arduino IDE)
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
  • Espere pelo menos 60 ms entre as leituras: se você medir novamente enquanto os ecos do pulso anterior ainda estiverem se refletindo pelo ambiente, os resultados serão incorretos.
  • Superfícies macias e inclinadas: tecido, espuma e cortinas absorvem som; superfícies inclinadas mais de 45 graus refletem o eco para longe do sensor.
  • Feixe amplo: o cone de aproximadamente 15 graus cobre uma área com quase 50 cm de largura a 2 metros; em um corredor estreito, ele também pode detectar as paredes laterais.
  • Placas de 3,3 V: o HC-SR04 clássico precisa de 5 V e sua saída ECHO é de 5 V; no ESP32 e no Pico, coloque um divisor de tensão no ECHO ou use o HC-SR04P, que funciona com 3,3 V.
  • Vários sensores: dois HC-SR04 acionados ao mesmo tempo captam os ecos um do outro; acione-os um após o outro.

A ligação do HC-SR04 e seu uso com o Monitor Serial e um LCD são explicados em detalhes no artigo sobre o sensor de distância HC-SR04; aqui, o foco é a comparação.

JSN-SR04T: o ultrassônico à prova d’água

O JSN-SR04T funciona com a mesma lógica de disparo e eco do HC-SR04, mas seu transdutor fica em uma cápsula à prova d’água ligada por um cabo, separada da placa eletrônica. Isso o torna a escolha para locais úmidos, como caixas-d’água, poços, cisternas de chuva e sensores de estacionamento externos. Ele tem duas diferenças importantes: como um único transdutor emite e escuta, há uma zona cega a curta distância (cerca de 20–25 cm), e seu feixe é mais amplo que o do HC-SR04. Instale o sensor na tampa superior do reservatório, pelo menos 25 cm acima do nível máximo da água. O código abaixo transforma a distância em um percentual de enchimento.

C++ (Arduino IDE)
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}
38
Escadas, tubos ou boias dentro do reservatório podem gerar ecos devido ao feixe amplo; coloque o sensor longe deles, próximo ao centro do reservatório. Se gotas de condensação se acumularem no transdutor, as leituras ficam incorretas; instalar o sensor levemente inclinado permite que as gotas escorram. Se a superfície da água apresentar ondulações, use a mediana de várias leituras.

Sharp GP2Y0A21: infravermelho analógico

O Sharp GP2Y0A21YK0F é um sensor infravermelho que funciona entre 10 e 80 cm e fornece uma tensão analógica conforme a distância. Como usa triangulação, ele é menos sensível à cor do alvo que sensores baseados na intensidade da reflexão. Sua saída não é linear: fornece cerca de 2,3 V a 10 cm e 0,4 V a 80 cm, seguindo uma curva de potência inversa entre esses pontos. O código converte essa curva com a aproximação distância = 29.988 × V^-1.173. A maior armadilha ocorre abaixo de 10 cm: à medida que o alvo se aproxima, a saída volta a cair, e um objeto a 5 cm pode parecer estar a 20 cm. Instale o sensor de modo que o alvo nunca possa se aproximar a menos de 10 cm.

C++ (Arduino IDE)
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

Sensores Sharp consomem pulsos curtos de alta corrente durante a medição, e esses pulsos geram ruído na linha de alimentação. Um capacitor de aproximadamente 10 µF próximo aos pinos VCC e GND do sensor estabiliza bastante as leituras. A família também tem modelos com outros alcances: o GP2Y0A41SK0F funciona de 4 a 30 cm, e o GP2Y0A02YK0F, de 20 a 150 cm; cada um tem coeficientes de curva diferentes.

VL53L0X e VL53L1X: sensores laser ToF

O VL53L0X e o VL53L1X são minúsculos sensores laser de tempo de voo da STMicroelectronics. Eles emitem um pulso laser invisível de 940 nm, medem o tempo de retorno da reflexão com contadores de fótons e fornecem o resultado diretamente em milímetros via I2C. São quase independentes da cor, seu feixe é mais estreito que o de um sensor ultrassônico e uma medição leva 20–50 ms. O VL53L0X mede até cerca de 1,2 metro no modo padrão e 2 metros no modo de longo alcance; o VL53L1X chega a 4 metros e seu campo de visão (ROI) pode ser reduzido por software. Ambos têm o endereço I2C padrão 0x29. O código abaixo usa a biblioteca VL53L0X da Pololu; busque “VL53L0X” no Gerenciador de Bibliotecas e instale a versão da Pololu.

C++ (Arduino IDE)
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

O tempo reservado para a medição define o equilíbrio entre exatidão e velocidade: 20 ms é rápido, mas gera ruído; 200 ms é lento, mas estável. A luz solar e fontes intensas de infravermelho reduzem bastante o alcance; lembre-se disso se for medir ao ar livre. Para conectar dois VL53L0X ao mesmo barramento I2C, como ambos têm o endereço 0x29, mantenha um desativado pelo pino XSHUT e atribua um novo endereço ao outro (setAddress); os detalhes do I2C estão no artigo O que é I2C.

TF-Luna: 8 metros com um pequeno LiDAR

O TF-Luna é o pequeno LiDAR de ponto único da Benewake: ele mede o tempo de voo modulando luz infravermelha de 850 nm, funciona de 0,2 a 8 metros com um feixe muito estreito de apenas 2 graus e pode fazer até 250 leituras por segundo. Por padrão, envia cada leitura via UART a 115200 baud como um pacote de 9 bytes: dois bytes de cabeçalho 0x59, distância (cm), intensidade do sinal, temperatura interna e uma soma de verificação. Se a intensidade do sinal for inferior a 100 ou igual a 65.535 (superexposição), a leitura é considerada pouco confiável. Ele é alimentado com 5 V, mas seu nível lógico UART é de 3,3 V, então pode ser conectado diretamente a um ESP32. Como a SoftwareSerial do Uno não é confiável a 115200 baud, escolha uma placa com UART por hardware, como o ESP32 ou o Mega; a lógica de interpretação de pacotes UART é explicada no artigo sobre comunicação serial UART.

C++ (Arduino IDE)
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}
44

TCRT5000: detecção de proximidade e de linha

Sensor infravermelho reflexivo TCRT5000
TCRT5000: um LED infravermelho e um fototransistor lado a lado; a placa do módulo contém um comparador, um potenciômetro de ajuste do limiar e saídas digital e analógica.

O TCRT5000 não é um medidor de distância, mas um sensor reflexivo: a luz do LED infravermelho é refletida pela superfície, e o fototransistor ao lado mede quanto retorna. Ele funciona melhor a cerca de 2,5 mm, e o sinal enfraquece rapidamente além de 1,5 cm. Como superfícies brancas refletem muito e as pretas muito pouco, ele fornece valores completamente diferentes conforme a cor, mesmo à mesma distância; por isso, é usado para distinguir preto de branco em robôs seguidores de linha, contar furos em discos de encoder e detectar objetos muito próximos. O comparador do módulo comuta a saída digital quando o limiar ajustado pelo potenciômetro é ultrapassado. Veja os detalhes no artigo sobre o sensor infravermelho TCRT5000.

C++ (Arduino IDE)
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

Efeito da superfície e do ambiente

O alcance de um sensor no papel muda quando ele encontra a superfície que você vai medir. Sensores ultrassônicos são excelentes em superfícies rígidas que refletem som, mas têm dificuldade com tecidos que o absorvem; sensores baseados em luz são afetados pela cor, pelo brilho e pela luz solar. A tabela abaixo mostra qual sensor permanece confiável em cada situação para ajudar você a planejar seu projeto.

Superfície / ambienteUltrassônico (HC-SR04)Sharp IRLaser ToF (VL53, TF-Luna)TCRT5000
Parede rígida e planaMuito bomBomMuito bomBom (apenas muito perto)
Tecido, espuma, cortinasFraco (som absorvido)BomBomMédio
Superfície preta foscaBomMédioAlcance reduzidoMuito fraco
Vidro, espelho, metal brilhanteBom (o som é refletido)EnganosoEnganoso (a luz atravessa ou é desviada)Enganoso
Superfície inclinadaFraco (o eco é desviado)MédioBomMédio
Luz solar, ambiente externoNão é afetadoÉ afetadoAlcance bastante reduzidoÉ afetado
Superfície da águaBom (medição em reservatórios)FracoVariávelNão adequado
Variações de temperaturaA velocidade do som muda, exige correçãoPouco afetadoPouco afetadoPouco afetado

Resumo das ligações: Uno, ESP32 e Pico

SensorArduino UnoESP32Raspberry Pi PicoObservação
HC-SR04 / JSN-SR04TTRIG D9, ECHO D10, 5VTRIG 5, ECHO 18 (via divisor), VIN 5VTRIG GP14, ECHO GP15 (via divisor), VBUSA saída ECHO fornece 5 V
Sharp GP2Y0A21A0, 5VGPIO 34 (via divisor), VIN 5VGP26 (via divisor), VBUSA saída pode chegar a 3,1 V
VL53L0X / VL53L1XSDA A4, SCL A5SDA 21, SCL 22SDA GP4, SCL GP5Endereço 0x29
TF-LunaSoftwareSerial não recomendadaTX → GPIO 16, RX → GPIO 17TX → GP1 (uart0 RX), RX → GP0Alimentação de 5 V, lógica de 3,3 V
Módulo TCRT5000DO D7, AO A1DO 27, AO 34DO GP16, AO GP273,3–5 V
Ao conectar as saídas de sensores alimentados com 5 V (ECHO do HC-SR04, saída analógica do Sharp) a um ESP32 ou Pico, não se esqueça do divisor de tensão; os pinos dessas placas não toleram 5 V. Como a saída do Sharp pode chegar a 3,1 V, ela leva um ADC com referência de 3,3 V ao limite; é mais seguro medir por meio de um divisor, como 10 kΩ + 20 kΩ, e multiplicar o resultado por 1,5.

Medição ultrassônica com o Raspberry Pi Pico

No MicroPython, a duração do pulso é medida com machine.time_pulse_us(); ela faz o mesmo que pulseIn() no Arduino e retorna um valor negativo quando o tempo limite é excedido. Alimente o HC-SR04 pelo pino VBUS (USB 5 V) do Pico e coloque um divisor de 1 kΩ + 2 kΩ na linha ECHO, ou use o HC-SR04P, que funciona diretamente com 3,3 V. Também existem drivers MicroPython para o VL53L0X e o TF-Luna; você pode interpretar facilmente o pacote UART do TF-Luna com machine.UART usando a mesma lógica do código Arduino.

MicroPython
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

Qual sensor de distância usar em cada projeto?

ProjetoSensor recomendadoPor quê?
Robô que desvia de obstáculosHC-SR04 (econômico) ou VL53L0XO feixe amplo não deixa passar obstáculos; o VL53L0X é mais rápido e menor
Nível de caixa-d’água ou poçoJSN-SR04TSonda à prova d’água, detecta bem a superfície da água
Sensor de estacionamento para carroJSN-SR04T ou HC-SR04Resistência ao ambiente externo, alcance de 2–3 m é suficiente
Robô seguidor de linhaTCRT5000Feito para distinguir preto de branco
Mini sumô, medição precisa sobre a bancadaVL53L0X / VL53L1XResolução milimétrica, feixe estreito, tamanho pequeno
Radar com Arduino (varredura com servo)HC-SR04 ou TF-LunaO HC-SR04 é barato; o feixe de 2° do TF-Luna desenha um mapa muito mais nítido
Medidor de altura, contador de passagem em portasVL53L1X ou TF-LunaLongo alcance e leituras estáveis
Drone, longa distânciaTF-LunaAlcance de 8 m, até 250 Hz
Torneira sem toque, detecção de mãosSharp GP2Y0A21Alcance de 10–80 cm e saída analógica simples

Mais algumas ideias de projetos: gire um HC-SR04 com um servo para montar uma visualização de radar com Arduino; use um HC-SR04 na frente e dois VL53L0X nas laterais do seu robô que desvia de obstáculos; abra a tampa de uma lixeira inteligente quando uma mão se aproximar; monte uma trena digital portátil com um display OLED ou envie o nível de enchimento da caixa-d’água para seu celular por meio de um ESP32 com um JSN-SR04T.

Erros comuns e soluções

SintomaCausa provávelSolução
HC-SR04 sempre indica 0 ou fora de alcanceSem eco, problema de ligação ou alimentaçãoVerifique a alimentação de 5 V e os pinos TRIG/ECHO, defina um tempo limite para pulseIn
Leituras ultrassônicas dão saltos de vez em quandoEco do pulso anterior ou de uma parede lateralEspere 60 ms entre as leituras, use um filtro de mediana
JSN-SR04T não consegue medir de pertoZona cega (20–25 cm)Instale o sensor a pelo menos 25 cm do alvo
Sharp indica um valor alto e incorreto muito pertoA curva se inverte abaixo de 10 cmImpeça que o alvo se aproxime a menos de 10 cm
Leituras do Sharp têm ruídoPulsos de corrente perturbam a alimentaçãoCapacitor de 10 µF entre VCC-GND, calcule a média das leituras
VL53L0X não encontradoLigação I2C ou conflito de endereçosVerifique SDA/SCL e o endereço 0x29 com um scanner I2C
Sensor laser indica distância menor ao ar livreInfravermelho presente na luz solarFaça sombra, aumente o tempo reservado à medição ou use um ultrassônico
Dados do TF-Luna sem sentidoBaud rate incorreto ou SoftwareSerial não acompanhaUse 115200 baud e uma UART por hardware, verifique a soma de verificação
Antes de escolher um sensor, pense no alvo: para um alvo grande, rígido e próximo, um HC-SR04 costuma ser suficiente. Se precisar medir um ponto estreito com precisão ou detectar superfícies macias, passe para ToF; para locais úmidos ou externos, use o JSN-SR04T; e, se precisar de mais que alguns metros ou de leituras muito rápidas, use o TF-Luna.

Sensores de distância são a maneira mais fácil de fazer projetos com Arduino perceberem o ambiente ao redor, e escolher o modelo certo é o que diferencia um projeto estável de outro que tira você do sério. As tabelas e o código desta comparação ajudam a equilibrar orçamento e desempenho conforme suas necessidades. No app BlueGrays, você encontra projetos passo a passo com esquemas do circuito e código para medição de distância com HC-SR04, sensor de estacionamento, medidor de altura, robô que desvia de obstáculos, sensor de estacionamento com ESP32 e medição de distância com TCRT5000.

Perguntas frequentes

Qual é o melhor sensor de distância para Arduino?

Não existe um único sensor melhor; a escolha depende do alvo e do ambiente. O HC-SR04 atende ao uso geral de baixo custo; o VL53L0X ou VL53L1X, à precisão milimétrica e ao feixe estreito; o JSN-SR04T, a locais úmidos; e o TF-Luna, à medição rápida além de alguns metros.

Até que distância o HC-SR04 consegue medir?

O fabricante informa de 2 cm a 4 metros, mas, na prática, as leituras confiáveis costumam chegar a 2–3 metros. Você se aproxima do limite quando o alvo é grande, rígido e perpendicular ao sensor; com alvos macios, pequenos ou inclinados, o alcance diminui bastante.

Qual é a diferença entre sensores de distância ultrassônicos e infravermelhos?

Um sensor ultrassônico mede o tempo de retorno do eco de um pulso sonoro; ele não é afetado pela cor nem pela luz, mas seu feixe é amplo e ele tem dificuldade com superfícies macias. Sensores infravermelhos usam luz, têm feixes mais estreitos e são rápidos, mas a luz solar, o vidro e algumas superfícies escuras podem prejudicar a leitura.

Qual é a diferença entre o VL53L0X e o VL53L1X?

Ambos são sensores laser ToF com interface I2C. O VL53L0X mede até cerca de 2 metros, enquanto o VL53L1X chega a 4 metros, pode medir mais rápido e permite reduzir o campo de visão por software. O VL53L0X atende a pequenos robôs de curto alcance; o VL53L1X, a medições mais distantes e precisas.

Qual sensor de distância devo usar para medir o nível de uma caixa-d’água?

O JSN-SR04T, com sua sonda à prova d’água, é a escolha mais comum; ele é instalado na tampa superior do reservatório, pelo menos 25 cm acima do nível máximo da água. O HC-SR04 também funciona em reservatórios secos e fechados, mas a umidade e a condensação podem danificá-lo rapidamente.

Sensores de distância funcionam com ESP32 e Raspberry Pi Pico?

Sim, mas você precisa de um divisor de tensão para reduzir a 3,3 V a saída ECHO dos HC-SR04 e JSN-SR04T de 5 V e a saída analógica do Sharp. Os módulos VL53L0X e o TF-Luna já usam lógica compatível com 3,3 V, e o HC-SR04P funciona diretamente com 3,3 V.

Ver todos os projetos
Medição de distância com HC-SR04 (Monitor Serial)
#27Iniciante

Medição de distância com HC-SR04 (Monitor Serial)

O sensor HC-SR04 funciona como um morcego que se orienta no escuro: emite um som que você não consegue ouvir, escuta o eco e mede a distância até o objeto à sua frente. O Arduino escreve essa distânci

4.6(46)
71
Sensor de estacionamento com HC-SR04
#28Intermediário
Premium

Sensor de estacionamento com HC-SR04

Uma versão em miniatura do sensor de estacionamento de um carro: quanto mais perto um objeto chega, mais rápidos ficam os bipes. O sensor de distância mede a distância até o objeto à sua frente; se el

4.8(64)
85
Projeto de medição de altura
#33Intermediário
Premium

Projeto de medição de altura

Um medidor de altura preso ao batente da porta que informa, em centímetros, a altura de quem está embaixo dele. Primeiro, você pressiona o primeiro botão sem ninguém embaixo, e o sensor de distância m

4.5(25)
34
Robô que desvia de obstáculos
#81Avançado
Premium

Robô que desvia de obstáculos

Que tal construir um veículo inteligente que encontra seu próprio caminho? O robô que desvia de obstáculos monitora o ambiente constantemente com o sensor ultrassônico na parte da frente. Ao encontrar

5.0(38)
49
Medidor ultrassônico de distância HC-SR04 com ESP32
#116Intermediário

Medidor ultrassônico de distância HC-SR04 com ESP32

O sensor ultrassônico HC-SR04 calcula a distância medindo o tempo que a onda sonora emitida leva para atingir um objeto e retornar (tempo de voo). Neste projeto, enviaremos um pulso de 10 microssegundos do ESP32 ao pino TRIG do sensor e leremos a duração do eco no pino ECHO com pulseIn(). Exibiremos a distância calculada em centímetros em um LCD I2C 16x2. Como o HC-SR04 opera a 5V, é preciso usar um divisor de tensão no pino ECHO; caso contrário, o GPIO de 3,3V do ESP32 será danificado.

4.9(28)
45
Sensor de estacionamento com ESP32 (HC-SR04 + barra de 5 LEDs + buzzer + OLED)
#142Avançado
Premium

Sensor de estacionamento com ESP32 (HC-SR04 + barra de 5 LEDs + buzzer + OLED)

A versão com ESP32 do sensor de estacionamento de carro! Usamos o sensor ultrassônico HC-SR04 para medir a distância até o objeto à sua frente. Conforme a distância diminui, a barra de 5 LEDs vai se preenchendo (verde → amarelo → vermelho) e o intervalo entre os bipes do buzzer diminui. Quando o objeto chega muito perto (menos de 10 cm), o alarme soa continuamente e todos os LEDs acendem.

0.0(0)
14
Leitura de reflexão (proximidade) com TCRT5000
#77Intermediário
Premium

Leitura de reflexão (proximidade) com TCRT5000

Com um pequeno sensor que emite luz invisível e mede quanto dela é refletido, você detecta a superfície à frente dele. Quanto mais o sensor se aproxima de um objeto ou de uma superfície clara, mais lu

4.6(33)
43
Medição de distância com display LCD
#31Avançado
Premium

Medição de distância com display LCD

Uma ferramenta que mede distâncias sem régua: aproxime e afaste a mão na frente do sensor e veja o número mudar. O HC-SR04 emite uma onda sonora e escuta seu eco, e o Arduino calcula a distância em ce

4.6(45)
59