HC-SR04 no Arduino: medindo distância em 15 minutos
Ligação, código comentado e a conta que transforma tempo em centímetro. Com os três erros que travam todo iniciante.
O HC-SR04 é o sensor que aparece em praticamente todo primeiro projeto de robótica, e por bons motivos: custa pouco, mede de 2 cm a 4 m com precisão de cerca de 3 mm e não exige biblioteca nenhuma. Ele é o "olho" do robô que desvia de obstáculo, do sensor de nível da caixa d'água e do contador de passagem na porta.
Como ele mede
O sensor emite um pulso de som em 40 kHz, acima do que ouvimos, e conta quanto tempo o eco leva para voltar. Como o som viaja a cerca de 343 metros por segundo no ar, o resto é aritmética:
distância em cm = tempo em microssegundos × 0,0343 ÷ 2
Divide-se por dois porque o som fez o caminho de ida e de volta.
Ligação
O módulo tem quatro pinos:
| Pino do sensor | Vai para | Observação |
|---|---|---|
| VCC | 5V do Arduino | não use 3,3V |
| Trig | pino digital 9 | saída |
| Echo | pino digital 10 | entrada |
| GND | GND | terra comum |
Numa protoboard isso leva dois minutos e quatro jumpers.
O código
const int PINO_TRIG = 9;
const int PINO_ECHO = 10;
void setup() {
Serial.begin(9600);
pinMode(PINO_TRIG, OUTPUT);
pinMode(PINO_ECHO, INPUT);
}
void loop() {
// O pulso precisa nascer limpo: garante nível baixo antes de disparar.
digitalWrite(PINO_TRIG, LOW);
delayMicroseconds(2);
// 10 microssegundos em nível alto é o que o módulo espera.
digitalWrite(PINO_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PINO_TRIG, LOW);
// Mede quanto tempo o Echo fica em nível alto. O limite de 30 ms evita
// travar o programa quando não volta eco nenhum (obstáculo longe demais).
long duracao = pulseIn(PINO_ECHO, HIGH, 30000);
if (duracao == 0) {
Serial.println("Fora de alcance");
} else {
float distancia = duracao * 0.0343 / 2;
Serial.print(distancia);
Serial.println(" cm");
}
delay(200);
}Abra o Monitor Serial em 9600 e aproxime a mão. Deve aparecer a distância em centímetros.
Os três erros que travam todo mundo
1. Leitura sempre zero. Quase sempre é o pulseIn sem timeout somado a Trig e Echo trocados. Confira a ligação e mantenha o timeout do exemplo.
2. Leitura errática, pulando entre valores absurdos. Duas causas comuns: leituras rápidas demais, sem dar tempo do eco anterior se dissipar, resolvido com o delay(200); e superfície ruim. O ultrassom não enxerga bem tecido, espuma e superfície inclinada, que espalham o som em vez de refletir.
3. Funciona no computador e falha na bateria. O HC-SR04 quer 5V estáveis. Alimentado por bateria fraca ou por uma porta USB dividida, ele oscila. Use fonte adequada.
Para além do exemplo
Uma média das últimas cinco leituras elimina quase todo o ruído e é o passo natural depois que o básico funciona. Se o projeto for para o campo, lembre que a velocidade do som varia com a temperatura, e existe correção simples para isso.
Quando quiser mandar essa leitura para o celular ou para um painel na nuvem, troque o Arduino por um ESP32: o mesmo código funciona, e o WiFi já vem embarcado.
Os componentes deste tutorial: Sensor Ultrassônico HC-SR04, Placa Compatível com Arduino Uno R3 e Protoboard 830 furos com jumpers. Para a versão conectada, o ESP32 DevKit V1; para mostrar a leitura sem o computador, o display OLED 0,96".