Ultrazvučno merenje rastojanja (ESP32)
Ultrazvučni senzor meri udaljenost do objekta koristeći visokofrekventne zvučne talase (ultrazvuk). Senzor emituje kratki „ping“ (ultrazvučni impuls), zatim meri koliko je vremena proteklo dok se odjek (echo) nije vratio. Poznajući brzinu zvuka, možemo izračunati udaljenost objekta.
Kako radi senzor (osnovna ideja)
Tipičan senzor kao što je HC-SR04 ima četiri pina:
- VCC – napajanje (obično 5 V)
- Trig – ulaz (trigger): Arduino/ESP32 šalje kratak impuls da pokrene mjerenje
- Echo – izlaz: senzor vraća impuls čije trajanje odgovara vremenu povratka
- GND – zajednička masa
Osnovna formula
Merenjem vremena (Time) između slanja i prijema signala dobijamo:
Distance = (Time × Speed of Sound) / 2
Brzina zvuka u vazduhu je približno 340 m/s, odnosno ~0.034 cm/µs. Deli se sa 2 zato što je izmereno vreme za putovanje tamo-nazad (round-trip).
Ključne napomene
- Trig: postavite na HIGH na ~10 µs da pokrenete mjerenje.
- Echo: senzor drži Echo pin HIGH tokom vremena trajanja povratnog signala; to vreme koristimo za izračun.
- Model: HC-SR04 — najčešće korišćen jeftini modul za edukaciju.
Zašto koristiti ESP32 umesto Arduino Uno?
ESP32 donosi više procesorske snage, ugrađeno Wi-Fi/Bluetooth i više digitalnih/analognih pinova. To omogućava:
- slanje rezultata merenja preko Wi-Fi (npr. na web stranicu ili MQTT),
- paralelno upravljanje više senzora bez većih problema,
- korisne biblioteke i brže izvršavanje koda.
Važna razlika: nivo logike (3.3V vs 5V)
ESP32 radi na 3.3 V logičkim nivoima i NIJE tolerantna na 5 V na većini GPIO pinova. HC-SR04 se obično napaja sa 5 V i Echo pin može izlaziti signal od ~5 V — zato je neophodno obratiti pažnju na sigurnu povezivost:
- Trig pin HC-SR04 obično prihvata 3.3 V kao logičku HIGH, pa ga možete direktno povezati sa ESP32 Trig pinom (proveriti specifičan modul — većina radi sa 3.3 V na Trig).
- Echo pin mora ići kroz level shifter ili jednostavan delilac napona (npr. R1 = 1 kΩ i R2 = 2 kΩ) kako bi se smanjio 5 V na ~3.3 V pre nego što stigne do ESP32.
- Alternativno, napajajte HC-SR04 sa 3.3 V samo ako tvoj modul to podržava — ali mnogi HC-SR04 moduli ne funkcionišu pouzdano na 3.3 V.
Šta vam je potrebno za ovu vežbu
- ESP32 razvojna pločica (npr. DevKitC, WROOM ili slično)
- HC-SR04 ultrazvučni senzor
- Breadboard i skakači (jumper wires)
- Dva otpornika (npr. 1 kΩ i 2 kΩ) za delilac napona na Echo liniji (ili level shifter)
- Izvor napajanja za senzor (5 V) — može biti USB 5V ako modul i ploča to podržavaju ili odvojen adapter
- Računar sa instaliranim Arduino IDE (ili PlatformIO) i ESP32 podrškom
Bezbednosne napomene i dobre prakse
- uvek poveži GND napajanja senzora sa GND ESP32 (zajednička masa);
- ne prebacuj Echo pin direktno na ESP32 bez delitelja napona ili level shiftera;
- testiraj prvo samo čitanje analognih/digitalnih signala pre nego što napajanje ostalih komponenti priključiš;
- ako planiraš koristiti više senzora, obrati pažnju na interferenciju (senzori mogu "čuti" jedan drugog).
Kratak uvod u ESP32 mikrokontroler
ESP32 je snažan i moderni mikrokontroler koji se često koristi u IoT projektima, robotici i pametnim uređajima. U odnosu na klasični Arduino Uno, ESP32 nudi više procesorske snage, Wi-Fi i Bluetooth konekciju, veći broj GPIO pinova i rad na 3.3V logici. Zbog toga je izuzetno pogodan za naprednije projekte, merenje podataka i bežičnu komunikaciju.
Ako želiš da saznaš više o ESP32, preporučujemo sledeće resurse:
- Zvanična dokumentacija ESP-IDF (ESP32 Development Framework)
- Arduino Core for ESP32 – zvanična stranica za rad sa ESP32 u Arduino IDE-u
- Različiti tutorijali na platformama kao što su RandomNerdTutorials ili MakerPortal
Model ESP32 korišćen u ovoj vežbi
U ovoj vežbi koristi se razvojna ploča ESP32 DevKit V1 (DOIT), jedan od najčešćih dostupnih modela. Međutim, vežbu možeš izvesti i sa većinom drugih ESP32 ploča, jer su Trig i Echo pinovi ultrasoničnog senzora kompatibilni sa bilo kojim digitalnim pinom. Jedina razlika može biti raspored pinova na samoj ploči.
Potrebne biblioteke i dodaci u Arduino IDE-u
ESP32 nije direktno podržan u Arduino IDE-u odmah nakon instalacije, pa je potrebno dodati ESP32 paket. Pre nego što pređeš na kod i povezivanje, proveri sledeće:
- U Arduino IDE idi na File → Preferences i u polje „Additional Boards Manager URLs“ dodaj:
https://espressif.github.io/arduino-esp32/package_esp32_index.json - Zatim otvori Tools → Board → Boards Manager i instaliraj paket: ESP32 by Espressif Systems.
- Izaberi ploču: ESP32 Dev Module ili DOIT ESP32 DevKit V1 (oba rade bez problema).
Nakon ovoga tvoj Arduino IDE je spreman za programiranje ESP32 ploče i za rad sa ultrasoničnim senzorom.
Šema povezivanja
Da bismo ultrasonični senzor HC-SR04 povezali sa ESP32 mikrokontrolerom, potrebno je da pravilno povežemo napajanje i signalne pinove. Za razliku od Arduino Uno ploče, ESP32 koristi 3.3V logiku, što znači da moramo obratiti pažnju na Echo pin, jer on može dati signal od 5V. U ovoj vežbi koristićemo senzor HC-SR04 kompatibilan sa 3.3V signalima, ili ćemo Echo pin zaštititi otpornim deliteljem napona.
Ultrasonični senzor ima četiri pina:
- VCC – napajanje senzora (obično 5V)
- GND – masa (zajednička sa ESP32)
- Trig – pin preko kog ESP32 šalje ultrazvučni impuls
- Echo – pin preko kog ESP32 prima odjek ultrazvuka
Povezivanje senzora HC-SR04 sa ESP32 izgleda ovako:
- VCC senzora → 5V na ESP32
- GND senzora → GND na ESP32
- Trig → GPIO 5 (ili bilo koji slobodan digitalni pin)
- Echo → GPIO 18 (preporučuje se korišćenje delitelja napona)
Pošto Echo pin može biti 5V, preporuka je da se između Echo pina i ESP32 doda delitelj napona sa dva otpornika (na primer 1 kΩ i 2 kΩ), kako bi signal bio spušten na bezbednih 3.3V. Ako koristiš modul koji već ima integrisan delitelj, ovaj korak nije potreban.
Kako tačno povezati dva otpornika na Echo liniji?
Echo pin senzora daje signal od oko 5V. Da bismo ga spustili na 3.3V, koristimo dva otpornika kao delilac napona.
Vezivanje ide ovim redosledom:
1) Žica sa ECHO pina senzora ide prvo na otpornik R1.
2) Drugi kraj otpornika R1 spaja se u tačku koja se zove „srednja tačka delitelja“.
3) Iz te srednje tačke izlazi žica koja ide direktno na ESP32 ulazni pin (GPIO 18).
4) Iz te iste tačke kreće otpornik R2, čiji drugi kraj ide na GND.
Vizuelno, to izgleda ovako:
Echo (5V) → R1 → ● → ESP32 GPIO 18
│
R2
│
GND
Na srednjoj tački je već bezbednih oko 3.3V, što štiti ESP32 ulaz.
Na sledećoj slici videćemo kompletnu šemu povezivanja između ESP32 i ultrasoničnog senzora.
3. Kako ESP32 i ultrasonični senzor rade zajedno – detaljno objašnjenje
Da bismo razumeli kako ESP32 meri rastojanje pomoću ultrasoničnog senzora (HC-SR04), potrebno je da znamo šta se dešava inženjerski “iza kulisa”. U nastavku je prikazan ceo proces korak po korak.
1. ESP32 šalje TRIGGER impuls
ESP32 na TRIG pin šalje veoma kratak impuls:
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
Ovim impulsom ESP32 zapravo govori senzoru: „Pošalji ultrazvučni talas!“
2. Senzor emituje 8 ultrazvučnih talasa (40 kHz)
HC-SR04 automatski, bez dodatnog upravljanja, šalje 8 talasa koji putuju kroz vazduh. Istovremeno, senzor postavlja ECHO pin u stanje HIGH.
3. ECHO pin je HIGH dok talas putuje
Dok se ultrazvučni talas kreće ka objektu, ECHO pin ostaje HIGH. To znači:
- ECHO = HIGH → talas je u putu
- ECHO = LOW → talas se vratio, merenje je završeno
4. Talas se odbija od objekta i vraća u senzor
Kada ultrazvuk naiđe na prepreku, vraća se ka senzoru. Čim ga HC-SR04 registruje, ECHO pin automatski prelazi u LOW.
Kako ESP32 meri trajanje?
ESP32 koristi funkciju pulseIn() da izmeri koliko je dugo ECHO pin bio HIGH:
long duration = pulseIn(echoPin, HIGH);
Zatim ESP32 izračunava rastojanje:
float distance = duration * 0.034 / 2;
Zašto 0.034? To je brzina zvuka: 340 m/s ≈ 0.034 cm/μs. Delimo sa 2 jer talas ide do objekta i nazad.
Tabela vremena i događaja
| Vreme | Događaj |
|---|---|
| t₀ | ESP32 šalje 10 μs TRIG impuls |
| t₁ | Senzor šalje ultrazvuk i postavlja ECHO = HIGH |
| t₂ | Talas se vraća, ECHO prelazi u LOW |
| t₂ – t₁ | Trajanje impulsa u mikrosekundama |
Primer koda za ESP32 (osnovna verzija)
// Primer merenja rastojanja ultrasoničnim senzorom (ESP32)
int trigPin = 5; // TRIG povezan na GPO5
int echoPin = 18; // ECHO povezan na GPO18
long duration;
float distance;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(115200);
}
void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2;
Serial.print("Distance: ");
Serial.print(distance, 2);
Serial.println(" cm");
delay(500);
}
Ovaj kod šalje TRIG impuls, meri trajanje HIGH nivoa na ECHO pinu i izračunava rastojanje u centimetrima.
Napredna i poboljšana verzija koda
Sledeća verzija je pouzdanija: koristi timeout, vraća grešku ako nema odjeka i ima posebnu funkciju za merenje.
// Poboljšana verzija za ESP32
const int trigPin = 4;
const int echoPin = 5;
const float SOUND_SPEED = 0.034;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(115200);
}
void loop() {
float distance = measureDistance();
if (distance < 0) {
Serial.println("Nema odjeka ili je objekat van dometa.");
} else {
Serial.print("Distance: ");
Serial.print(distance, 2);
Serial.println(" cm");
}
delay(500);
}
float measureDistance() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH, 30000UL);
if (duration <= 0) return -1.0;
return (duration * SOUND_SPEED) / 2.0;
}
Problemi i kako ih rešiti
Nema očitavanja
Mogući uzroci:
- Objekat je preblizu (< 2 cm)
- Objekat je predaleko (> 400 cm)
- Pogrešno povezani TRIG i ECHO
- Loše napajanje ili loša masa
Smetnje kada se koristi više senzora
- Bira se jedan po jedan senzor (sekvencijalno)
- Senzori se fizički udalje 10+ cm
- Postave se male pregrade (baffles) da smanje „široko rasipanje“ zvuka
Kraća šema povezivanja (varijanta bez delitelja napona)
U ovoj alternativnoj šemi ultrasonični senzor se napaja sa 3.3V, direktno sa ESP32 ploče, i u tom slučaju nije potreban delitelj napona na Echo pinu. Ovo je moguće samo ako modul pravilno radi na 3.3V i ako proizvođač to izričito navodi. Kod standardnog HC-SR04 senzora rad na 3.3V može biti ograničen ili neprecizan, ali postoje verzije senzora koje su fabrički prilagođene za 3.3V.
U ovoj šemi dobijamo jednostavnije povezivanje:
- VCC senzora → 3.3V na ESP32
- GND senzora → GND na ESP32
- Trig → GPIO 5
- Echo → GPIO 18 (direktno, bez delitelja)
Kada je ovo bezbedno?
✔ Ako proizvođač senzora navodi da modul radi na 3.3V napajanju.
✔ Ako Echo pin senzora nikada ne prelazi 3.3V (mnogi “3.3V kompatibilni” moduli imaju ugradjeni regulator).
✔ Ako su udaljenosti male i nije vam potrebno maksimalno precizno merenje.
✔ Ako je projekat početnički i cilj je naučiti osnovnu funkcionalnost, a ne domet do 4–5 metara.
Koji su rizici?
⚠ Standardni HC-SR04 često NE radi stabilno na 3.3V (manji domet, nepreciznost, povremeni “0 cm” ili “400 cm”).
⚠ Ako je modul ustvari 5V tip (bez interne regulacije), Echo može dati i do 5V, što može oštetiti ESP32.
⚠ Ovo rešenje je preporučeno samo za početnike i samo ako ste sigurni da senzor radi na 3.3V.
Šema povezivanja (3.3V varijanta bez delitelja):
Ova šema je posebno korisna za početnike koji žele najjednostavniji mogući priključak senzora na ESP32, uz napomenu da se u ozbiljnijim projektima preporučuje napajanje senzora sa 5V i zaštita Echo linije.
4. Razumevanje ograničenja, smetnji i naprednih detalja o radu ultrasoničnih senzora
Do sada smo videli kako HC-SR04 funkcioniše, kako ESP32 šalje TRIGGER impuls i kako meri vreme pomoću ECHO pina. Sada idemo dublje – u situacije koje se često javljaju u realnim projektima i koje mogu da dovedu do pogrešnih očitavanja.
1. Minimalna i maksimalna udaljenost senzora
HC-SR04 ima fizička ograničenja u dometu merenja:
- Minimalno rastojanje: 2 cm – objekat je suviše blizu da bi se talas ispravno odbio.
- Maksimalno rastojanje: oko 400 cm – ultrazvučni talas se rasipa i ne vraća se dovoljno jak.
Ako je objekat bliži od 2 cm, senzor ne može da registruje povratak i ECHO ostaje LOW, pa pulseIn() vraća 0.
Ako je objekat predaleko, ponašanje je isto kao da nema objekta.
2. Površine koje slabo reflektuju ultrazvuk
Ultrazvučni talas se reflektuje drugačije u zavisnosti od površine objekta.
| Površina | Refleksija | Stabilnost očitavanja |
|---|---|---|
| Ravna, čvrsta (zid, drvo) | Odlična | Visoka |
| Ramena, zaobljena (stakla, flaše) | Umerena | Varira |
| Meka (tkanina, sunđer) | Slaba | Nestabilna |
| Neravna (šipke, rešetke) | Nepravilna | Nepravilna |
Ako je objekat kos, talas se može odbiti u stranu i senzor će misliti da objekta nema.
3. Temperatura, vlažnost i brzina zvuka
Brzina zvuka nije stalna – zavisi od temperature i vlažnosti vazduha. U kodu obično koristimo: 340 m/s, ali zapravo:
Brzina zvuka raste za oko 0.6 m/s za svaki stepen Celzijusa.
Ako radiš projekat na otvorenom ili u hladnom okruženju, očitavanja će varirati 2–5%.
4. Preklapanje ultrazvuka (crosstalk) među senzorima
Kada se koristi više ultrasoničnih senzora, zraci se preklapaju.
Najčešći problem: senzor A primi talas senzora B i očita pogrešno rastojanje.
Kako to sprečiti?
- Aktiviraj senzore jedan po jedan (sekvencijalno).
- Razmakni ih najmanje 10 cm ili ih zakreni pod različitim uglovima.
- Koristi male cevčice, kartonske ili 3D štampane „tunelčiće“ za fokusiranje zvuka.
5. Korišćenje timeout-a za sprečavanje blokiranja ESP32
Poziv:
duration = pulseIn(echoPin, HIGH);
Može da blokira ESP32 i do jedne sekunde, što je loše za robote, vozila i sisteme realnog vremena. Zato koristimo timeout:
duration = pulseIn(echoPin, HIGH, 30000UL); // 30 ms
Ako u 30 ms ne stiže echo, funkcija vraća 0 i petlja nastavlja dalje.
6. Kada su očitavanja potpuno pogrešna?
Najčešće greške:
- NAPAJANJE senzora sa 3.3V (uvek mora 5V)
- ECHO direktno na ESP32 bez delilaca napona
- Nema zajedničke mase između senzora i ESP32
- Predugački kablovi (više od 40 cm)
- Objekat nije dovoljno velik ili je previše ravan
7. Kako testirati senzor da vidimo da li radi 100% ispravno?
Radi sledeće testove:
- Zameni TRIG i ECHO kabl – ako očitavanja postanu random, znaš da senzor radi.
- Testiraj ga sa predmetom veličine dlana na 10–40 cm.
- Testiraj sa zidom – zid daje najbolja, najstabilnija očitavanja.
- Probaj različite uglove nagiba da vidiš kako se ponaša.
Ako senzor daje stalno 0 cm ili 300+ cm – moguće je da je oštećen ECHO tranzistor.
8. Vizuelni prikaz vremena i rastojanja
Kratko vreme ECHO HIGH = objekat blizu
Dugo vreme ECHO HIGH = objekat daleko
ESP32 zapravo ne meri rastojanje direktno – on meri vreme. Sve zavisi od toga koliko dugo ECHO ostane HIGH.
Zaključak
Ovaj deo lekcije bio je posvećen realnim situacijama i najčešćim problemima pri radu sa HC-SR04 senzorima. Razumevanje ovih ograničenja veoma je važno kada praviš projekte poput:
- autonomnih robota,
- vozila sa izbegavanjem prepreka,
- beskontaktnih merača udaljenosti,
- parking sistema,
- pametnih alarma i automatike.
Čitanje podataka sa ESP32 u Processing-u
U prethodnim primerima merenja distance ultrazvučnim senzorom, podatke smo prikazivali u Serial Monitor-u Arduino IDE okruženja. Međutim, umesto običnog teksta, te iste podatke možemo vizuelizovati u realnom vremenu pomoću programa Processing. Processing nam omogućava da vrednosti sa ESP32 prikazujemo grafički – kao broj, dijagram, animaciju ili čak 3D prikaz.
Da bi komunikacija radila, ESP32 preko serijskog porta šalje tekst u obliku:
Distance:23.45
A Processing aplikacija taj tekst čita, obrađuje i izdvaja samo broj koji predstavlja rastojanje.
Processing kod za prijem podataka sa ESP32
import processing.serial.*; // Biblioteka za rad sa serijskim portom
Serial myPort; // Serijski port objekat
float val = 0.0; // Ovde čuvamo poslednju primljenu distancu
void setup() {
size(400, 200); // Dimenzije prozora
printArray(Serial.list()); // Ispis svih dostupnih COM portova
try {
if (Serial.list().length > 0) {
// Preporučuje se da korisnik ručno izabere port kada zna tačan naziv (npr. "COM3")
String portName = Serial.list()[0];
println("Opening: " + portName);
// Otvaranje porta i postavljanje brizine 115200 bps (mora biti ista kao na ESP32)
myPort = new Serial(this, portName, 115200);
// Kažemo Processing-u da čeka dok ne stigne ceo red (do '\n')
myPort.bufferUntil('\n');
} else {
println("No serial ports available.");
}
} catch (Exception e) {
println("Error opening serial port: " + e.getMessage());
}
}
void draw() {
background(255);
fill(0);
textSize(20);
// Prikazuje poslednju primljenu vrednost distance
text("Distance: " + val + " cm", 50, 100);
}
// Ova funkcija se automatski pokreće kada stigne ceo red podataka
void serialEvent(Serial p) {
String data = p.readStringUntil('\n'); // Učitavanje jedne linije teksta
if (data != null) {
data = trim(data); // Uklanja nevidljive znakove (CR, LF, razmake)
// Provera da li linija počinje sa "Distance:"
if (data.startsWith("Distance:")) {
// Uzimamo samo broj posle prefiksa "Distance:"
val = float(data.substring(9));
} else {
println("Data ne pocinje sa Distance: ");
}
}
}
Kako radi ovaj kod?
Kada ESP32 šalje liniju teksta poput:
Distance:24.18
Processing je prima preko serijskog porta. Kod radi sledeće:
- bufferUntil('\n') – Processing čeka da ESP32 pošalje ceo red (završava se sa '\n'). Tek tada poziva
serialEvent(). - serialEvent() automatski obrađuje novu liniju kada stigne.
- U liniji:
program proverava da li je primljeni tekst validan.if (data.startsWith("Distance:")) - Ako jeste, uzima samo numerički deo:
Ovo uklanja tekst „Distance:“ i pretvara ono što ostane u broj tipa float.val = float(data.substring(9)); - Promenljiva
valse zatim prikazuje u ekranu u funkcijidraw().
Na ovaj način Processing praktično postaje „grafički monitor“ koji je mnogo moćniji od običnog serijskog monitora. Možeš kasnije dodati prikaz distance kao grafik, bar, ili čak 2D radar animaciju.

