Modulů pro Arduino existuje spousta. Některé měří teplotu, jiné světlo, napětí, proud nebo třeba vlhkost. Tentokrát se podíváme na jeden z nejznámějších modulů pro měření vzdálenosti – ultrazvukový dálkoměr HC-SR04.
Na první pohled ho pozná snad každý. Má dvě kulatá „očka“, díky kterým vypadá trochu jako malý robot nebo obličej. Ve skutečnosti jde o vysílač a přijímač ultrazvuku. Modul vyšle krátký zvukový impuls, počká na jeho odraz od překážky a podle času návratu spočítá vzdálenost.
Je to jednoduchý, levný a pro začátečníky hodně vděčný modul. Dá se na něm pěkně ukázat nejen měření vzdálenosti, ale i to, že reálný svět není tak dokonalý jako příklady v učebnici. Některé předměty se měří dobře, jiné hůř, na šikmé plochy se zvuk odráží jinam a hodnoty občas trochu poskakují.
V článku si ukážeme, jak HC-SR04 funguje, jak ho zapojit k Arduinu, jak napsat jednoduchý program a na co si dát při měření pozor.

Co je HC-SR04
HC-SR04 je ultrazvukový modul pro měření vzdálenosti. Používá se hlavně s Arduinem a podobnými vývojovými deskami.
Modul má čtyři vývody:
- VCC – napájení, obvykle 5 V
- Trig – spouštěcí vstup
- Echo – výstupní signál s délkou podle naměřené vzdálenosti
- GND – zem
Na desce jsou dva ultrazvukové měniče. Jeden slouží jako vysílač a druhý jako přijímač. Modul pracuje s ultrazvukem, tedy se zvukem o frekvenci vyšší, než slyší člověk. U HC-SR04 se běžně uvádí frekvence okolo 40 kHz.
Běžný měřicí rozsah modulu je přibližně od 2 cm do 400 cm. V praxi ale záleží na tom, co měříme, jaký má předmět tvar, povrch a jak je natočený vůči senzoru.
Princip měření
Modul vyšle krátký ultrazvukový impuls. Ten letí vzduchem, narazí na překážku a část zvuku se odrazí zpět. Přijímač na modulu tento odraz zachytí.
Arduino změří čas mezi vysláním a návratem signálu. Když známe rychlost zvuku, můžeme z času vypočítat vzdálenost.
Je ale potřeba nezapomenout na jednu důležitou věc: zvuk letí tam i zpět. Modul tedy měří čas celé cesty od senzoru k překážce a zpět k senzoru. Skutečná vzdálenost k překážce je proto jen polovina této dráhy.
Zjednodušeně se často používá vztah:
vzdalenost_cm = cas_us * 0.0343 / 2;
Hodnota 0.0343 znamená přibližnou rychlost zvuku v centimetrech za mikrosekundu.
V mnoha ukázkových programech se také používá zkrácený výpočet:
vzdalenost_cm = cas_us / 58;
Obě varianty dělají prakticky totéž.
Zapojení modulu k Arduinu
Zapojení je jednoduché. Modul potřebuje napájení, zem a dva datové piny. V ukázce budu používat Arduino MEGA 2560.
Příklad zapojení:
| HC-SR04 | Arduino |
|---|---|
| VCC | 5 V |
| GND | GND |
| Trig | pin 9 |
| Echo | pin 10 |
Pin Trig slouží k odeslání krátkého spouštěcího impulsu. Pin Echo se potom přepne do logické jedničky na dobu, která odpovídá naměřené vzdálenosti.

U klasického Arduina s 5V logikou je zapojení přímočaré. Výstup Echo má 5 V a Arduino UNO, Nano nebo MEGA s tím nemá problém. Pokud by se modul používal s deskami jako ESP8266, ESP32 nebo Raspberry Pi, je potřeba dát pozor na napěťové úrovně.
První jednoduchý program
Nejdřív si ukážeme úplně základní program bez použití knihovny.
Program pošle krátký impuls na pin Trig, změří délku impulsu na pinu Echo a vypočítá vzdálenost v centimetrech.
const int trigPin = 9;
const int echoPin = 10;
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
digitalWrite(trigPin, LOW);
}
void loop() {
// Krátký spouštěcí impuls
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Změření délky impulsu na Echo
long duration = pulseIn(echoPin, HIGH);
// Přepočet na vzdálenost v centimetrech
float distanceCm = duration * 0.0343 / 2;
Serial.print("Vzdalenost: ");
Serial.print(distanceCm);
Serial.println(" cm");
delay(500);
}
Po nahrání programu otevřeme Serial Monitor v Arduino IDE a nastavíme rychlost 9600 baud. Pokud je vše zapojené správně, měly by se začít vypisovat naměřené vzdálenosti.

Časový limit u pulseIn()
Základní program funguje, ale má jednu nevýhodu. Funkce pulseIn() může v některých případech čekat poměrně dlouho, pokud se žádný odraz nevrátí.
Lepší je proto použít variantu s časovým limitem:
long duration = pulseIn(echoPin, HIGH, 30000);
Hodnota 30000 znamená timeout 30 000 mikrosekund, tedy 30 ms. To zhruba odpovídá maximální vzdálenosti několika metrů.
Upravený program pak může vypadat takto:
const int trigPin = 9;
const int echoPin = 10;
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
digitalWrite(trigPin, LOW);
}
void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH, 30000);
if (duration == 0) {
Serial.println("Mereni se nepodarilo");
} else {
float distanceCm = duration * 0.0343 / 2;
Serial.print("Vzdalenost: ");
Serial.print(distanceCm);
Serial.println(" cm");
}
delay(500);
}
Tahle verze je pro praktické pokusy lepší, protože se program zbytečně nezasekne při nepovedeném měření.

Jednoduché vyhlazení hodnot
Při měření se může stát, že hodnoty trochu poskakují. Není to chyba programu. Ultrazvukové měření závisí na odrazu zvuku, tvaru překážky, okolním rušení i přesnosti samotného modulu.
Jednoduché řešení je udělat několik měření za sebou a spočítat průměr.
const int trigPin = 9;
const int echoPin = 10;
float zmerVzdalenost() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH, 30000);
if (duration == 0) {
return -1;
}
return duration * 0.0343 / 2;
}
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
digitalWrite(trigPin, LOW);
}
void loop() {
const int pocetMereni = 5;
float soucet = 0;
int platnaMereni = 0;
for (int i = 0; i < pocetMereni; i++) {
float vzdalenost = zmerVzdalenost();
if (vzdalenost > 0) {
soucet += vzdalenost;
platnaMereni++;
}
delay(50);
}
if (platnaMereni > 0) {
float prumer = soucet / platnaMereni;
Serial.print("Prumerna vzdalenost: ");
Serial.print(prumer);
Serial.println(" cm");
} else {
Serial.println("Mereni se nepodarilo");
}
delay(500);
}
Tím se náhodné výkyvy trochu vyhladí, ovšem za cenu pomalejší odezvy měření. Pro jednoduché projekty to ale může být naprosto dostačující.

Co ovlivňuje přesnost měření
HC-SR04 je levný modul, takže od něj nejde čekat laboratorní přesnost. Na pokusy, roboty nebo jednoduché měření vzdálenosti je ale velmi použitelný.
Výsledek ovlivňuje hlavně:
- vzdálenost předmětu,
- velikost překážky,
- natočení překážky,
- materiál a povrch,
- teplota vzduchu,
- proudění vzduchu,
- rušení od jiných ultrazvukových zdrojů.
Nejlépe se měří pevná rovná plocha kolmo proti senzoru. Typicky třeba zeď, krabice, deska nebo ruka přímo před modulem.
Horší výsledky můžou být u měkkých materiálů, látek, šikmých ploch, úzkých předmětů nebo předmětů s členitým povrchem.
Mrtvá zóna a maximální vzdálenost
Modul nedokáže dobře měřit úplně malé vzdálenosti. Běžně se uvádí minimální vzdálenost okolo 2 cm. Pokud dáme překážku příliš blízko, měření může být nesmyslné nebo nestabilní.
Na druhé straně se často uvádí maximální vzdálenost okolo 4 metrů, ale v praxi to nemusí být vždy dosažitelné. Záleží na velikosti a povrchu měřeného předmětu.
Pro spolehlivé pokusy je lepší počítat s kratší vzdáleností, třeba do jednoho až dvou metrů.
Vliv teploty na měření
Modul počítá vzdálenost podle rychlosti zvuku ve vzduchu. Jenže rychlost zvuku není úplně konstantní. Mění se hlavně s teplotou.
Při běžných domácích pokusech to není velký problém. Pokud ale chceme měřit přesněji, je dobré vědět, že při jiné teplotě vzduchu se může výsledek trochu lišit.
V jednoduchých projektech se obvykle používá pevná hodnota rychlosti zvuku. Pro přesnější měření by se dala přidat kompenzace podle teplotního čidla.
Praktické pokusy
Tady je několik jednoduchých pokusů, které se s modulem dají udělat.
Měření ruky před senzorem
Nejjednodušší test. Připojíme modul, otevřeme Serial Monitor a dáme ruku před senzor. Při přibližování a oddalování ruky by se měla hodnota měnit.
Tady si můžeme všimnout, že hodnota není úplně dokonale stabilní. To je normální.
Šikmá plocha
Když před senzor dáme hladkou desku šikmo, měření se může zhoršit nebo úplně selhat. Důvod je jednoduchý: zvuk se odrazí jiným směrem a nevrátí se zpět k přijímači.
Tohle je dobrý pokus, protože pěkně ukazuje rozdíl mezi teorií a praxí.
Měkký nebo členitý předmět
Látka, molitan, oblečení nebo členitý povrch můžou ultrazvuk částečně pohltit nebo rozptýlit. Výsledek pak může být méně stabilní.
Kde se dá HC-SR04 použít
Možností je hodně. HC-SR04 se hodí hlavně tam, kde nepotřebujeme extrémní přesnost a stačí nám jednoduché bezkontaktní měření vzdálenosti.
Příklady použití:
- robot vyhýbající se překážkám
- jednoduchý parkovací senzor
- počítání průchodů
- měření přiblížení ruky
- jednoduché bezpečnostní čidlo
- ukázkový školní projekt
Na přesná měření nebo náročné venkovní použití to ale není ideální modul. Je potřeba počítat s jeho limity.
Časté problémy
Modul pořád ukazuje nesmysly
Nejprve je dobré zkontrolovat zapojení. Hlavně jestli není prohozený pin Trig a Echo, jestli je připojená společná zem a jestli má modul správné napájení.
Hodnota hodně poskakuje
To může být normální. Pomůže průměrování více měření, pevnější uchycení modulu nebo měření proti větší rovné ploše.
Na krátkou vzdálenost to nefunguje
HC-SR04 má mrtvou zónu. Úplně blízké předměty neumí měřit dobře. Je lepší držet se nad vzdáleností přibližně 2 cm.
Závěr
Ultrazvukový dálkoměr HC-SR04 je jeden z těch modulů, které se k Arduinu hodí úplně skvěle. Je levný, snadno se zapojuje a princip měření je dobře pochopitelný i pro začátečníky.
Zároveň ale hezky ukazuje, že reálné měření není vždy dokonalé. Nestačí jen připojit modul a věřit každému číslu. Záleží na překážce, úhlu, povrchu, vzdálenosti i okolních podmínkách.
Pro první pokusy s měřením vzdálenosti je to ale výborný modul. Dá se s ním rychle dosáhnout viditelného výsledku a otevře cestu k dalším projektům, jako jsou roboti, parkovací senzory a jiné.
Tento senzor zakoupíte na Laskakit.cz přímý odkaz je ZDE.
Další díly ze začátečnické série o modulech najdete zde:

Super shrnutí. Nevíš, zda se s tím dá měřit i vodní hladina? Slyšel jsem že moc ne a proto jsem si v nádrží udělal tlakový měřák. Ale ten taky měří strašně nepřesně…
Díky, hladinu jsem nezkoušel ale teoreticky by šla. Případně tam dát nějaký plovák a namířit to na něj. Spíš bych se bál problémů s vlhkostí.