HC-SR04: Sensor Ultrassônico com Arduino e ESP32 — Guia Completo com Problemas e Soluções
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.
📡 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
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
t é a duração do pulso Echo em microssegundosvelocidade do som ≈ 343 m/s a 20°C | ida + volta = dividir por 2 | simplificando: ÷ 58📊 Especificações Técnicas
| Parâmetro | Valor | Observação |
|---|---|---|
| Tensão de alimentação | 5V DC | Não alimentar com 3.3V — o sensor pode falhar |
| Corrente típica | 15 mA | Pico de 30 mA durante disparo |
| Frequência ultrassônica | 40 kHz | Inaudível para humanos |
| Alcance mínimo | 2 cm | Abaixo disso: zona cega — leituras incorretas! |
| Alcance máximo | 4 m | Superfícies lisas e perpendiculares |
| Ângulo de detecção | ≤ 15° | Cone de detecção de 30° total |
| Resolução | ~3 mm | Depende da implementação |
| Pulso TRIG | 10 µs HIGH | Mínimo para disparar a medição |
| Nível lógico ECHO | 5V | ⚠️ Cuidado com ESP32/3.3V! |
| Taxa de medição | Max 40 Hz | Aguardar ≥ 25 ms entre medições |
🔌 Pinos e Ligação
5V obrigatório
Não use 3.3V
Entrada digital
Pulso 10µs HIGH
Saída 5V!
⚠️ Cuidado ESP32
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)
- ECHO → Divisor 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.
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.
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.
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.
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.
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.
Tire a mediana de 5 leituras. Aguarde 25 ms entre cada uma. Garanta GND limpo e cabo curto.
💻 Código Arduino UNO / NANO / MEGA
// 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
// 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
- 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.
- 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.
- Sempre use timeout no pulseIn(). Sem timeout, uma medição sem objeto vai travar seu programa por quase 1 segundo.
- Aguarde ≥ 25 ms entre disparos. O eco do pulso anterior precisa se dissipar. Abaixo disso você captura ecos fantasmas.
- Posicione perpendicular à superfície-alvo. Superfícies anguladas refletem o som para longe — sem leitura ou leitura falsa.
- 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