HC-SR04: Sensor Ultrassônico com Arduino e ESP32 — Guia Completo
Sensores

HC-SR04Sensor Ultrassônico · Medir Distância Sem Contato

O sensor mais popular do mundo maker: mede distância com ultrassom, custa menos de R$15 e funciona com Arduino e ESP32. Mas tem pegadinhas que derrubam todo mundo — vamos resolver todas.

HC-SR04 ULTRASONIC RANGING MODULE T (Tx) R (Rx) VCC TRIG ECHO GND
#hcsr04#ultrassonico#medirdistancia#arduino#esp32#eletronica-basica

📡 O que é o HC-SR04?

O HC-SR04 é um módulo sensor de distância por ultrassom. Ele emite pulsos sonoros a 40 kHz (além da audição humana), espera o eco refletir em um objeto e calcula a distância pelo tempo de viagem do som. Funciona de 2 cm até 4 metros, é alimentado por 5V e se comunica diretamente com Arduino e ESP32.

É usado em robôs que desviam de obstáculos, sistemas de estacionamento, medidores de nível de caixa d'água, alarmes de proximidade e muito mais. Simples de usar — mas cheio de detalhes que a maioria ignora.

⚙️ Como Funciona — O Princípio do Eco

O funcionamento é igual a um morcego ou sonar: dispara um som e mede o tempo até o eco voltar.

Diagrama de Timing — Sinal TRIG e ECHO

→ tempo TRIG 10µs ECHO duração do pulso Echo proporcional à distância som vai e volta

Passo 1: Você envia um pulso de 10 µs HIGH no pino TRIG.
Passo 2: O sensor dispara 8 bursts de 40 kHz pelo transdutor Tx.
Passo 3: O pino ECHO vai HIGH e fica assim até o eco voltar ao Rx.
Passo 4: Você mede a duração do pulso Echo → calcula a distância.

🧮 A Fórmula da Distância

d (cm) = t (µs) ÷ 58
Onde t é a duração do pulso Echo em microssegundos
velocidade do som ≈ 343 m/s a 20°C  |  ida + volta = dividir por 2  |  simplificando: ÷ 58
DISTÂNCIA EM cm
t_µs / 58.0
DISTÂNCIA EM mm
t_µs / 5.8
DISTÂNCIA EM m
t_µs / 5800.0

📊 Especificações Técnicas

ParâmetroValorObservação
Tensão de alimentação5V DCNão alimentar com 3.3V — o sensor pode falhar
Corrente típica15 mAPico de 30 mA durante disparo
Frequência ultrassônica40 kHzInaudível para humanos
Alcance mínimo2 cmAbaixo disso: zona cega — leituras incorretas!
Alcance máximo4 mSuperfícies lisas e perpendiculares
Ângulo de detecção≤ 15°Cone de detecção de 30° total
Resolução~3 mmDepende da implementação
Pulso TRIG10 µs HIGHMínimo para disparar a medição
Nível lógico ECHO5V⚠️ Cuidado com ESP32/3.3V!
Taxa de mediçãoMax 40 HzAguardar ≥ 25 ms entre medições

🔌 Pinos e Ligação

VCC
Alimentação
5V obrigatório
Não use 3.3V
TRIG
Disparo
Entrada digital
Pulso 10µs HIGH
ECHO
Eco recebido
Saída 5V!
⚠️ Cuidado ESP32
GND
Terra comum
Compartilhar com
Arduino/ESP32

⬡ Ligação com Arduino UNO / NANO

  • VCC → Pino 5V do Arduino
  • GND → GND do Arduino
  • TRIG → Qualquer pino digital (ex: D9)
  • ECHO → Qualquer pino digital (ex: D10)

✅ Ligação direta — Arduino opera em 5V, sem problemas.

⬡ Ligação com ESP32 3.3V LOGIC

  • VCC → Pino VIN (5V) do ESP32
  • GND → GND do ESP32
  • TRIG → Qualquer GPIO (3.3V é suficiente)
  • ECHODivisor de tensão! (ver abaixo)

⚠️ Echo = 5V pode queimar GPIOs do ESP32. Use divisor!

⚠️ Divisor de Tensão para o ESP32 — Obrigatório!

O pino ECHO do HC-SR04 sai em 5V, mas os GPIOs do ESP32 toleram apenas 3.3V. Use este divisor simples:
ECHO → R1 (1kΩ) → GPIO do ESP32 → R2 (2kΩ) → GND
Tensão no GPIO: 5V × 2kΩ / (1kΩ + 2kΩ) = 3.33V — perfeito!

Alternativa: use o módulo HC-SR04P que opera em 3.3V nativamente.


🔧 Problemas Comuns — e Como Resolver

🕳️

Zona Cega: objetos a menos de 2 cm

O sensor não distingue objetos muito próximos. Abaixo de 2 cm, o Rx ainda está "ensurdecido" pelo disparo do Tx.

✅ Solução

Verifique: if (dist < 2) return -1;. Posicione o sensor a pelo menos 3–4 cm do objeto mais próximo.

pulseIn() trava sem objeto

Sem objeto no alcance, o Echo nunca vai LOW. O pulseIn() padrão espera até 1 segundo — travando o loop inteiro.

✅ Solução

Use sempre: pulseIn(ECHO, HIGH, 30000) — timeout de 30 ms. Se retornar 0, não há objeto detectado.

📐

Superfícies anguladas e irregulares

O ultrassom reflete como luz. Superfícies inclinadas ou esponjosas absorvem ou desviam o som — gerando leituras erradas.

✅ Solução

Posicione o sensor perpendicular à superfície. Para objetos irregulares, use mediana de 5–10 leituras.

🌡️

Temperatura afeta a velocidade do som

A fórmula ÷58 assume 20°C. Em ambientes frios ou quentes, o erro pode chegar a 3–5 cm em 1 metro.

✅ Solução

Corrija com: v = 331.3 + (0.606 × T°C). Use um DHT11/22 para medir a temperatura em tempo real.

📡

Múltiplos sensores causam cross-talk

Se dois HC-SR04 dispararem ao mesmo tempo, o Rx de um pode captar o som do outro — leituras falsas e inconsistentes.

✅ Solução

Dispare um sensor por vez, aguardando o Echo do anterior. Use delay(25) entre disparos.

📊

Leituras instáveis e ruidosas

Mesmo com objeto fixo, leituras variam de 0.5 a 2 cm a cada medição. Vibrações e ruídos elétricos afetam o Echo.

✅ Solução

Tire a mediana de 5 leituras. Aguarde 25 ms entre cada uma. Garanta GND limpo e cabo curto.


💻 Código Arduino UNO / NANO / MEGA

// hcsr04_arduino.ino
// HC-SR04 com Arduino — versão robusta
// Mamute Eletrônica | blog.mamuteeletronica.com.br

#define TRIG_PIN  9
#define ECHO_PIN  10
#define TIMEOUT   30000  // 30 ms → ~5 m máximo

void setup() {
  Serial.begin(9600);
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
}

float lerDistancia() {
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);
  long dur = pulseIn(ECHO_PIN, HIGH, TIMEOUT);
  if (dur == 0) return -1;
  float d = dur / 58.0;
  return (d < 2.0) ? -1 : d;
}

float lerMediana(int n) {
  float v[n];
  for (int i=0;i<n;i++) { v[i]=lerDistancia(); delay(25); }
  for (int i=0;i<n-1;i++)
    for (int j=0;j<n-i-1;j++)
      if (v[j]>v[j+1]) { float t=v[j]; v[j]=v[j+1]; v[j+1]=t; }
  return v[n/2];
}

void loop() {
  float dist = lerMediana(5);
  if (dist < 0) Serial.println("Fora do alcance");
  else { Serial.print("Distância: "); Serial.print(dist,1); Serial.println(" cm"); }
  delay(500);
}

💻 Código ESP32 3.3V — COM DIVISOR

// hcsr04_esp32.ino
// HC-SR04 com ESP32 — divisor de tensão no ECHO
// VCC → VIN (5V) | ECHO → R1(1kΩ)+R2(2kΩ) → GPIO

#define TRIG_PIN   5
#define ECHO_PIN   18  // com divisor de tensão!
#define TIMEOUT    30000

void setup() {
  Serial.begin(115200);
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
}

float lerDistancia() {
  digitalWrite(TRIG_PIN, LOW);  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);
  long dur = pulseIn(ECHO_PIN, HIGH, TIMEOUT);
  if (dur==0) return -1;
  float d = dur/58.0;
  return (d<2.0||d>400.0) ? -1 : d;
}

void loop() {
  float dist = lerDistancia();
  if (dist<0) Serial.println("Sem objeto no alcance");
  else Serial.printf("Distância: %.1f cm\n", dist);
  delay(500);
}

🌡️ Dica Pro: Corrigir pela Temperatura

Para maior precisão, use um DHT11/22 e corrija a velocidade do som em tempo real:

// v(m/s) = 331.3 + (0.606 × temperatura_C)
float lerComTemp(float tempC) {
  float vel = 331.3 + (0.606 * tempC);
  long  dur = pulseIn(ECHO_PIN, HIGH, 30000);
  return (dur==0) ? -1 : (dur*vel)/20000.0;
}

✅ Checklist — Antes de Usar o HC-SR04

  • 1
    Alimentação em 5V. O sensor precisa de 5V para funcionar corretamente. Com 3.3V pode ligar mas gera leituras erráticas ou não funciona.
  • 2
    Divisor de tensão no ECHO se usar ESP32. O pino ECHO sai em 5V. Sem o divisor você pode queimar os GPIOs do ESP32 silenciosamente.
  • 3
    Sempre use timeout no pulseIn(). Sem timeout, uma medição sem objeto vai travar seu programa por quase 1 segundo.
  • 4
    Aguarde ≥ 25 ms entre disparos. O eco do pulso anterior precisa se dissipar. Abaixo disso você captura ecos fantasmas.
  • 5
    Posicione perpendicular à superfície-alvo. Superfícies anguladas refletem o som para longe — sem leitura ou leitura falsa.
  • 6
    Use mediana para leituras estáveis. A mediana de 5 leituras elimina picos e resulta em valores muito mais confiáveis.

🛒 HC-SR04 e Sensores na Mamute

Sensores ultrassônicos, HC-SR04P (3.3V), módulos e componentes

📡 Pronto para medir distâncias nos seus projetos?

HC-SR04, jumpers, resistores e tudo para montar agora — na Mamute. Ou passa pessoalmente: Rua Vitória, 125 — Santa Efigênia/SP ☕

🛒 Ver Sensores na Mamute