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.

Vídeo
Esquema do circuito

Código-fonte
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// ESP32 HC-SR04 Ultrasonic Distance Sensor
4// ─────────────────────────────────────────
5// Triggers the HC-SR04 with a TRIG pulse, computes the distance (cm) from
6// the ECHO time and shows it on a 16x2 I2C LCD every 0.2 s. If no echo
7// comes back, the screen shows "Menzil disinda" (out of range).
8//
9// Pins:
10// GPIO 5 -> HC-SR04 TRIG
11// GPIO 18 -> HC-SR04 ECHO (via a voltage divider)
12// Divider: 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// Pin definitions
20const int TRIG_PIN = 5;
21const int ECHO_PIN = 18; // Needs a 1k + 2k voltage divider
22
23// LCD addr 0x27 or 0x3F
24LiquidCrystal_I2C lcd(0x27, 16, 2);
25
26const float SOUND_SPEED_CM_PER_US = 0.0343f; // Speed of sound (cm/us)
27const unsigned long PULSE_TIMEOUT_US = 30000UL; // Echo timeout (~5 m)
28
29void setup() {
30 pinMode(TRIG_PIN, OUTPUT);
31 pinMode(ECHO_PIN, INPUT);
32 digitalWrite(TRIG_PIN, LOW);
33
34 // DevKit V1 default I2C pins
35 Wire.begin(21, 22);
36
37 lcd.init();
38 lcd.backlight();
39
40 // Splash screen 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 // Main screen
48 lcd.clear();
49 lcd.setCursor(0, 0);
50 lcd.print("Mesafe:");
51}
52
53// Reads the distance in cm, -1 on error
54float readDistanceCm() {
55 // A 10 us TRIG pulse starts a measurement
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 // Round trip, so divide by 2
65 return (duration * SOUND_SPEED_CM_PER_US) / 2.0f;
66}
67
68void loop() {
69 float distance = readDistanceCm();
70
71 // Clear bottom row
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 decimal place
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.
