Aprender

Measure distance with an HC-SR04 ultrasonic sensor

Intermediário

Ou veja todas as aulas.

  • 503componentes na bancada
  • 44placas rodando agora
  • 1.00xtempo real, em todas as placas
Arduino Uno: sensor de estacionamentolive0.000 s 0.00x
Clique para abrir no editor
O exemplo parking: um HC-SR04 nos pinos 7 e 6, um buzzer no 9 e uma lâmpada no 8. Abra no editor e arraste o controle deslizante do sensor para mover a parede.

O HC-SR04 é o sensor com que toda turma começa, porque não tem nada escondido nele: nenhum barramento, nenhum endereço, nenhuma biblioteca em que você precise confiar. Você manda um pulso, ele devolve um pulso, e a duração do segundo é a distância. O circuito acima liga um deles a um Arduino Uno e transforma a leitura num sensor de estacionamento, com um buzzer que apita mais rápido à medida que a parede chega perto e uma lâmpada vermelha quando passa da linha de parada.

Abra no editor e arraste o controle deslizante do sensor para mover a parede. O monitor serial imprime a distância em centímetros e o intervalo entre os bipes.

What you need

  • Um Arduino Uno
  • Um sensor ultrassônico HC-SR04
  • Um buzzer
  • Um LED vermelho e um resistor de 220 ohms
  • Uma protoboard e jumpers

Wiring

Componente e pinoVai paraNota
VCC do HC-SR045 VO módulo precisa de 4,5 V ou mais
GND do HC-SR04GND
TRIG do HC-SR04Pino 7A placa dispara um ping por este pino
ECHO do HC-SR04Pino 6Em nível alto durante o tempo que o som leva para voltar
BuzzerPino 9A outra perna no GND
LED vermelho, por um resistor de 220 ohmsPino 8Acende quando passa da linha de parada

Como o sensor mede

Mantenha o TRIG em nível alto por pelo menos dez microssegundos e o módulo envia uma rajada curta de som a 40 kHz, depois deixa o ECHO em nível alto exatamente pelo tempo que o som leva para chegar até o objeto e voltar. O som anda cerca de 343 metros por segundo em temperatura ambiente, o que dá 0,0343 centímetro por microssegundo, e ele faz o percurso duas vezes. Então a distância em centímetros é o tempo do eco em microssegundos dividido por cerca de 58, o número pelo qual todo sketch de HC-SR04 divide.

O componente do Mokxi segue a temporização do datasheet: o ECHO sobe 460 microssegundos depois do trigger, fica em nível alto 58 microssegundos por centímetro, e sem nada ao alcance fica em nível alto pelo timeout inteiro de 38 milissegundos. A velocidade do som vem de uma temperatura do ar que você pode ajustar no componente, então um sketch que divide por 58 lê uma parede a um metro como 104 centímetros no ponto de congelamento, que é o que um módulo de verdade também faz.

O código, explicado

O exemplo lê o sensor por meio de uma pequena função auxiliar que faz o trigger, mede o tempo do eco e devolve milímetros, ou zero quando nada voltou. Escrita à mão com pulseIn(), que é como a maioria dos tutoriais faz, a medição tem cinco linhas.

O comportamento de estacionamento é uma função só. A menos de 15 centímetros ele mantém uma nota longa e acende o LED. Entre isso e dois metros, o intervalo entre os bipes cresce em linha reta de 90 milissegundos até 900. Além de dois metros ele fica em silêncio. Cada loop termina com uma espera de 60 milissegundos, e esse número importa: o datasheet pede 60 milissegundos entre um ping e outro, porque o eco do último ainda está ricocheteando pela sala.

A medição, do jeito que a maioria dos tutoriais escreve
const int TRIG = 7;
const int ECHO = 6;

long readCm() {
  digitalWrite(TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);
  long us = pulseIn(ECHO, HIGH, 38000);
  return us / 58;
}

Experimente no editor

Abra o circuito no editor e selecione o sensor. A propriedade de temperatura dele é a temperatura do ar, 20 graus por padrão. Coloque 0 e a mesma parede aparece alguns centímetros mais longe, porque o som é mais lento no ar frio; coloque 40 e ela aparece mais perto. O sketch não mudou, e o de uma placa de verdade também não mudaria.

Em seguida, mude o delay(60) no fim de cada ramo do loop() para delay(20). Muitos pings agora ficam sem resposta, porque o módulo ainda está esperando o último eco sumir e ignora um trigger que chega cedo demais, então o monitor serial começa a misturar "nada ao alcance" com distâncias de verdade. Volte para 60 e toda leitura volta a ser real.

Para um projeto diferente com a mesma ligação, tire o código do buzzer e mande a distância para o plotter serial, e você tem um medidor de distância simples.

Common mistakes

Disparar pings mais rápido do que a cada 60 milissegundos. A primeira leitura volta e as outras são ignoradas, porque o módulo se recusa a disparar enquanto ainda está escutando. O componente simulado faz a mesma coisa, então o bug aparece aqui antes de aparecer na sua mesa.

Trocar o TRIG e o ECHO. Nada queima, mas a placa fica esperando um pulso que nunca chega, e toda leitura dá zero ou o timeout inteiro.

Esquecer o timeout. Sem nada ao alcance, o eco dura 38 milissegundos, e o pulseIn() sem timeout espera um segundo inteiro antes de desistir, o que faz o resto do sketch parecer travado.

Confiar no último milímetro. Um HC-SR04 de verdade acerta no máximo por alguns milímetros e se confunde com superfícies macias ou inclinadas. A leitura simulada é exata, o que ajuda a aprender o código, mas é mais boazinha que a bancada.

Ligar o ECHO direto numa placa de 3,3 volts. O módulo aciona o ECHO com 5 volts. Num Uno tudo bem; num ESP32 ou num Pico, um circuito de verdade precisa de um divisor resistivo nessa linha.

Perguntas

Qual é o alcance do HC-SR04?

De uns 2 centímetros a 4 metros. O componente simulado informa qualquer coisa mais perto que 20 milímetros ou mais longe que 4000 como nada ao alcance.

Por que dividir por 58?

O som leva cerca de 29 microssegundos para andar um centímetro em temperatura ambiente, e o eco percorre a distância duas vezes, na ida e na volta. 29 vezes 2 dá 58.

Dá para usar o HC-SR04 com um ESP32?

Dá, com o mesmo código. No hardware de verdade os pinos do ESP32 não toleram 5 volts, então coloque um divisor no ECHO, por exemplo de 1 k e 2 k, para baixar para cerca de 3,3 volts.

O simulador modela o próprio som?

Não. Não há ângulo de feixe nem reflexão num ambiente. O componente é um cronômetro que mantém o ECHO em nível alto pelo tempo de ida e volta na velocidade do som, com a distância definida num controle deslizante. Isso basta para escrever e depurar o código exatamente como ele roda no hardware.

Monte isto de verdade

Abra o editor, mude um valor e veja o número mudar junto. Nada para instalar, e não precisa de conta.