#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 concluído
Medidor ultrassônico de distância HC-SR04 com ESP32
Um pequeno aparelho que mede a distância até sua mão ou uma caixa, sem precisar de régua. O sensor de distância emite um som que seus ouvidos não conseguem ouvir e capta o eco. Em seguida, o ESP32 mostra o resultado em centímetros em um pequeno display e avisa quando algo está fora do alcance. Você vê, na sua própria mesa, como os morcegos se orientam no escuro.

Vídeo

Esquema do circuito

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

Código-fonte

C++ (Arduino IDE)
1// ─────────────────────────────────────────
2//   BlueGrays · bluegrays.com
3//   Medidor ultrassônico de distância HC-SR04 com ESP32
4// ─────────────────────────────────────────
5// Dispara o HC-SR04 com um pulso no TRIG, calcula a distância (cm) pelo
6// tempo do ECHO e mostra em um LCD I2C 16x2 a cada 0.2 s. Se nenhum eco
7// voltar, a tela mostra "Menzil disinda" (fora de alcance).
8//
9// Pinos:
10//   GPIO 5  -> HC-SR04 TRIG
11//   GPIO 18 -> HC-SR04 ECHO (via divisor de tensão)
12//   Divisor: ECHO -> 1k -> GPIO 18 -> 2k -> GND
13//   GPIO 21 -> LCD SDA, GPIO 22 -> LCD SCL
14//   HC-SR04 and LCD VCC -> 5V (VIN), GND -> GND
15
16#include <Wire.h>
17#include <LiquidCrystal_I2C.h>
18
19// Definição dos pinos
20const int TRIG_PIN = 5;
21const int ECHO_PIN = 18;   // Precisa de um divisor de tensão de 1k + 2k
22
23// Endereço do LCD 0x27 ou 0x3F
24LiquidCrystal_I2C lcd(0x27, 16, 2);
25
26const float SOUND_SPEED_CM_PER_US = 0.0343f;      // Velocidade do som (cm/us)
27const unsigned long PULSE_TIMEOUT_US = 30000UL;   // Tempo limite do eco (~5 m)
28
29void setup() {
30  pinMode(TRIG_PIN, OUTPUT);
31  pinMode(ECHO_PIN, INPUT);
32  digitalWrite(TRIG_PIN, LOW);
33
34  // Pinos I2C padrão da DevKit V1
35  Wire.begin(21, 22);
36
37  lcd.init();
38  lcd.backlight();
39
40  // Tela de abertura por 3 s
41  lcd.setCursor(3, 0);
42  lcd.print("BlueGrays");
43  lcd.setCursor(1, 1);
44  lcd.print("HC-SR04 v1.0");
45  delay(3000);
46
47  // Tela principal
48  lcd.clear();
49  lcd.setCursor(0, 0);
50  lcd.print("Mesafe:");
51}
52
53// Lê a distância em cm, -1 em caso de erro
54float readDistanceCm() {
55  // Um pulso de 10 us no TRIG inicia uma medição
56  digitalWrite(TRIG_PIN, LOW);
57  delayMicroseconds(2);
58  digitalWrite(TRIG_PIN, HIGH);
59  delayMicroseconds(10);
60  digitalWrite(TRIG_PIN, LOW);
61
62  unsigned long duration = pulseIn(ECHO_PIN, HIGH, PULSE_TIMEOUT_US);
63  if (duration == 0) return -1.0f;
64  // Ida e volta, então divide por 2
65  return (duration * SOUND_SPEED_CM_PER_US) / 2.0f;
66}
67
68void loop() {
69  float distance = readDistanceCm();
70
71  // Limpa a linha de baixo
72  lcd.setCursor(0, 1);
73  lcd.print("                ");
74  lcd.setCursor(0, 1);
75
76  if (distance < 0) {
77    lcd.print("Menzil disinda");
78  } else {
79    lcd.print(distance, 1);   // 1 casa decimal
80    lcd.print(" cm");
81  }
82
83  delay(200);
84}
85

Perguntas frequentes

Por que usar um divisor de tensão na linha ECHO?

O HC-SR04 opera a 5 V e o pino ECHO fornece 5 V; as entradas do ESP32 aceitam no máximo 3,3 V. Um divisor de tensão com resistores de 1 kΩ e 2 kΩ reduz os 5 V para aproximadamente 3,3 V, protegendo o ESP32.

O pino TRIG também precisa de um divisor?

Não. TRIG é um sinal enviado do ESP32 ao sensor; o nível HIGH de 3,3 V do ESP32 geralmente é detectado de forma confiável pelo HC-SR04.

É necessário usar um divisor com o HC-SR04P?

Modelos como o HC-SR04P e o RCWL-1601 podem ser alimentados com 3,3 V. Nesse caso, a saída ECHO também é de 3,3 V e não é necessário usar um divisor.

Como tornar as medições de distância mais precisas?

A velocidade do som varia com a temperatura (aproximadamente 343 m/s a 20 °C). Corrigir a velocidade do som com um sensor de temperatura e usar a mediana de várias medições melhora a precisão.