Знайди два круглі елементи датчика: передавач та приймач.
Передавач надсилає ультразвук, приймач ловить відбиття. Датчик вимірює час до повернення звуку; більший час означає більшу відстань.
Іди по черзі. На кроках із кодом подано повну програму: замінюй нею весь скетч. Не додавай новий код під старим. Змінюй один параметр, запускай і порівнюй результат.
Урок 8 · Крок 2 / 8
TRIG запускає, ECHO відповідає
Знайди на датчику контакти VCC, TRIG, ECHO та GND.
HC-SR04 — назва моделі датчика відстані. Пін — металевий контакт для підключення дроту. Напис «HC-SR04 TRIG» на схемі означає контакт TRIG саме цього датчика.
TRIG — команда почати вимірювання
TRIG — скорочення від trigger, «запуск». Це вхід датчика: Arduino через D7 подає на нього короткий електричний імпульс. Після цього датчик надсилає ультразвук.
Напрямок сигналу: Uno D7 → TRIG датчика.
ECHO — відповідь датчика
ECHO означає «відлуння». Це вихід датчика: він подає імпульс на D6 Arduino. Його тривалість відповідає часу проходження звуку до перешкоди й назад. Arduino вимірює тривалість і обчислює відстань.
Напрямок сигналу: ECHO датчика → Uno D6.
VCC та GND — живлення
VCC → 5V Uno подає живлення. GND → GND Uno з’єднує спільний нуль — точку відліку напруги та зворотний шлях струму. Через ці два контакти датчик живиться; команди й відповідь проходять через TRIG та ECHO.
Датчик живиться від Uno через USB. На цьому етапі на самій платі немає показу відстані — відкриємо монітор.
Що можна змінити
READ_MS — пауза між вимірюваннями; поки 500 мс. Окремих бібліотек цей код не потребує.
Чому один пін OUTPUT, а інший INPUT
TRIG_PIN = 7 — це номер контакту D7 на Arduino. pinMode(TRIG_PIN, OUTPUT) налаштовує його на надсилання сигналу. Для датчика TRIG є входом, а для Arduino підключений до нього D7 — виходом.
ECHO_PIN = 6 відповідає D6. pinMode(ECHO_PIN, INPUT) дозволяє Arduino читати відповідь датчика. INPUT і OUTPUT у коді описують напрямок сигналу саме для Arduino.
Крок 3: повний код
Заміни весь скетч. Потім завантаж його в Uno або перезапусти Wokwi.
#include <Arduino.h>
constbyte TRIG_PIN = 7;
constbyte ECHO_PIN = 6;
constunsignedlong READ_MS = 500; // Пауза між показамиfloat readDistanceCm() {
digitalWrite(TRIG_PIN, LOW); // Готуємо короткий імпульс
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH); // Запускаємо вимірювання
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
unsignedlong echoUs = pulseIn(ECHO_PIN, HIGH, 25000UL);
float cm = echoUs / 58.0; // Шлях туди й назад уже врахованийif (echoUs == 0 || cm < 2 || cm > 400) {
return -1; // Немає надійного вимірювання
}
return cm;
}
void setup() {
pinMode(TRIG_PIN, OUTPUT); // TRIG — команда датчику
pinMode(ECHO_PIN, INPUT); // ECHO — відповідь датчика
digitalWrite(TRIG_PIN, LOW);
Serial.begin(115200); // Така сама швидкість у моніторі
}
void loop() {
float cm = readDistanceCm();
if (cm < 0) {
Serial.println("No echo");
} else {
Serial.print("Distance: ");
Serial.print(cm, 1);
Serial.println(" cm");
}
delay(READ_MS);
}
Крок 3: код · 1/1
Це одна програма. Частини коду читаємо по черзі.
#include <Arduino.h>
constbyte TRIG_PIN = 7;
constbyte ECHO_PIN = 6;
constunsignedlong READ_MS = 500; // Пауза між показамиfloat readDistanceCm() {
digitalWrite(TRIG_PIN, LOW); // Готуємо короткий імпульс
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH); // Запускаємо вимірювання
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
unsignedlong echoUs = pulseIn(ECHO_PIN, HIGH, 25000UL);
float cm = echoUs / 58.0; // Шлях туди й назад уже врахованийif (echoUs == 0 || cm < 2 || cm > 400) {
return -1; // Немає надійного вимірювання
}
return cm;
}
void setup() {
pinMode(TRIG_PIN, OUTPUT); // TRIG — команда датчику
pinMode(ECHO_PIN, INPUT); // ECHO — відповідь датчика
digitalWrite(TRIG_PIN, LOW);
Serial.begin(115200); // Така сама швидкість у моніторі
}
void loop() {
float cm = readDistanceCm();
if (cm < 0) {
Serial.println("No echo");
} else {
Serial.print("Distance: ");
Serial.print(cm, 1);
Serial.println(" cm");
}
delay(READ_MS);
}
Знайди delayMicroseconds(10), pulseIn та echoUs / 58.0.
Простеж: імпульс TRIG запускає датчик; pulseIn вимірює тривалість HIGH на ECHO; ділення перетворює її на сантиметри.
580 мкс / 58 ≈ 10 см. Звук іде до предмета й назад; коефіцієнт 58 це враховує. 25000UL — максимум очікування у мікросекундах, а не відстань.
Що можна змінити
Не змінюй 58.0 для «підгонки» показів. Змінюй READ_MS, щоб дослідити частоту оновлення.
Які команди працюють із пінами
digitalWrite(TRIG_PIN, LOW) спочатку встановлює на D7 низький рівень — приблизно 0 V.
digitalWrite(TRIG_PIN, HIGH) встановлює високий рівень — приблизно 5 V на Uno.
delayMicroseconds(10) утримує його 10 мікросекунд, а наступний LOW завершує імпульс запуску.
pulseIn(ECHO_PIN, HIGH, 25000UL) вимірює тривалість високого рівня на D6 у мікросекундах. Якщо імпульс не завершився за відведений час, повертається 0.
echoUs / 58.0 перетворює цю тривалість на сантиметри.
Крок 6: повний код
Заміни весь скетч. Потім завантаж його в Uno або перезапусти Wokwi.
#include <Arduino.h>
constbyte TRIG_PIN = 7;
constbyte ECHO_PIN = 6;
constunsignedlong READ_MS = 500; // Пауза між показамиfloat readDistanceCm() {
digitalWrite(TRIG_PIN, LOW); // Готуємо короткий імпульс
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH); // Запускаємо вимірювання
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
unsignedlong echoUs = pulseIn(ECHO_PIN, HIGH, 25000UL);
float cm = echoUs / 58.0; // Шлях туди й назад уже врахованийif (echoUs == 0 || cm < 2 || cm > 400) {
return -1; // Немає надійного вимірювання
}
return cm;
}
void setup() {
pinMode(TRIG_PIN, OUTPUT); // TRIG — команда датчику
pinMode(ECHO_PIN, INPUT); // ECHO — відповідь датчика
digitalWrite(TRIG_PIN, LOW);
Serial.begin(115200); // Така сама швидкість у моніторі
}
void loop() {
float cm = readDistanceCm();
if (cm < 0) {
Serial.println("No echo");
} else {
Serial.print("Distance: ");
Serial.print(cm, 1);
Serial.println(" cm");
}
delay(READ_MS);
}
Крок 6: код · 1/1
Це одна програма. Частини коду читаємо по черзі.
#include <Arduino.h>
constbyte TRIG_PIN = 7;
constbyte ECHO_PIN = 6;
constunsignedlong READ_MS = 500; // Пауза між показамиfloat readDistanceCm() {
digitalWrite(TRIG_PIN, LOW); // Готуємо короткий імпульс
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH); // Запускаємо вимірювання
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
unsignedlong echoUs = pulseIn(ECHO_PIN, HIGH, 25000UL);
float cm = echoUs / 58.0; // Шлях туди й назад уже врахованийif (echoUs == 0 || cm < 2 || cm > 400) {
return -1; // Немає надійного вимірювання
}
return cm;
}
void setup() {
pinMode(TRIG_PIN, OUTPUT); // TRIG — команда датчику
pinMode(ECHO_PIN, INPUT); // ECHO — відповідь датчика
digitalWrite(TRIG_PIN, LOW);
Serial.begin(115200); // Така сама швидкість у моніторі
}
void loop() {
float cm = readDistanceCm();
if (cm < 0) {
Serial.println("No echo");
} else {
Serial.print("Distance: ");
Serial.print(cm, 1);
Serial.println(" cm");
}
delay(READ_MS);
}
На справжній схемі поверни картон убік або прибери його.
Простеж покази.
Якщо звук усе ще відбивається від стіни — це інше вимірювання, а не помилка.
Коли відлуння не отримано вчасно або показ поза 2–400 см, бачиш No echo. -1 — внутрішня позначка помилки. Wokwi-повзунок 2–400 см не відтворює всі фізичні причини втрати відлуння.
Що можна змінити
READ_MS лиш 500. Не замінюй No echo на 0 cm — це змінило б зміст показу.
Крок 7: повний код
Заміни весь скетч. Потім завантаж його в Uno або перезапусти Wokwi.
#include <Arduino.h>
constbyte TRIG_PIN = 7;
constbyte ECHO_PIN = 6;
constunsignedlong READ_MS = 500; // Пауза між показамиfloat readDistanceCm() {
digitalWrite(TRIG_PIN, LOW); // Готуємо короткий імпульс
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH); // Запускаємо вимірювання
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
unsignedlong echoUs = pulseIn(ECHO_PIN, HIGH, 25000UL);
float cm = echoUs / 58.0; // Шлях туди й назад уже врахованийif (echoUs == 0 || cm < 2 || cm > 400) {
return -1; // Немає надійного вимірювання
}
return cm;
}
void setup() {
pinMode(TRIG_PIN, OUTPUT); // TRIG — команда датчику
pinMode(ECHO_PIN, INPUT); // ECHO — відповідь датчика
digitalWrite(TRIG_PIN, LOW);
Serial.begin(115200); // Така сама швидкість у моніторі
}
void loop() {
float cm = readDistanceCm();
if (cm < 0) {
Serial.println("No echo");
} else {
Serial.print("Distance: ");
Serial.print(cm, 1);
Serial.println(" cm");
}
delay(READ_MS);
}
Крок 7: код · 1/1
Це одна програма. Частини коду читаємо по черзі.
#include <Arduino.h>
constbyte TRIG_PIN = 7;
constbyte ECHO_PIN = 6;
constunsignedlong READ_MS = 500; // Пауза між показамиfloat readDistanceCm() {
digitalWrite(TRIG_PIN, LOW); // Готуємо короткий імпульс
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH); // Запускаємо вимірювання
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
unsignedlong echoUs = pulseIn(ECHO_PIN, HIGH, 25000UL);
float cm = echoUs / 58.0; // Шлях туди й назад уже врахованийif (echoUs == 0 || cm < 2 || cm > 400) {
return -1; // Немає надійного вимірювання
}
return cm;
}
void setup() {
pinMode(TRIG_PIN, OUTPUT); // TRIG — команда датчику
pinMode(ECHO_PIN, INPUT); // ECHO — відповідь датчика
digitalWrite(TRIG_PIN, LOW);
Serial.begin(115200); // Така сама швидкість у моніторі
}
void loop() {
float cm = readDistanceCm();
if (cm < 0) {
Serial.println("No echo");
} else {
Serial.print("Distance: ");
Serial.print(cm, 1);
Serial.println(" cm");
}
delay(READ_MS);
}
Приблизно раз на секунду з’являється новий підписаний рядок. Якщо символи незрозумілі — звір 115200; якщо порожньо — плату, порт, кабель даних і завантаження.
Що можна змінити
READ_MS — 1000. Порівняй, що змінюється: частота рядків, а не сама одиниця вимірювання.
Крок 8: повний код
Заміни весь скетч. Потім завантаж його в Uno або перезапусти Wokwi.
#include <Arduino.h>
constbyte TRIG_PIN = 7;
constbyte ECHO_PIN = 6;
constunsignedlong READ_MS = 500; // Пауза між показамиfloat readDistanceCm() {
digitalWrite(TRIG_PIN, LOW); // Готуємо короткий імпульс
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH); // Запускаємо вимірювання
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
unsignedlong echoUs = pulseIn(ECHO_PIN, HIGH, 25000UL);
float cm = echoUs / 58.0; // Шлях туди й назад уже врахованийif (echoUs == 0 || cm < 2 || cm > 400) {
return -1; // Немає надійного вимірювання
}
return cm;
}
void setup() {
pinMode(TRIG_PIN, OUTPUT); // TRIG — команда датчику
pinMode(ECHO_PIN, INPUT); // ECHO — відповідь датчика
digitalWrite(TRIG_PIN, LOW);
Serial.begin(115200); // Така сама швидкість у моніторі
}
void loop() {
float cm = readDistanceCm();
if (cm < 0) {
Serial.println("No echo");
} else {
Serial.print("Distance: ");
Serial.print(cm, 1);
Serial.println(" cm");
}
delay(READ_MS);
}
Крок 8: код · 1/1
Це одна програма. Частини коду читаємо по черзі.
#include <Arduino.h>
constbyte TRIG_PIN = 7;
constbyte ECHO_PIN = 6;
constunsignedlong READ_MS = 500; // Пауза між показамиfloat readDistanceCm() {
digitalWrite(TRIG_PIN, LOW); // Готуємо короткий імпульс
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH); // Запускаємо вимірювання
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
unsignedlong echoUs = pulseIn(ECHO_PIN, HIGH, 25000UL);
float cm = echoUs / 58.0; // Шлях туди й назад уже врахованийif (echoUs == 0 || cm < 2 || cm > 400) {
return -1; // Немає надійного вимірювання
}
return cm;
}
void setup() {
pinMode(TRIG_PIN, OUTPUT); // TRIG — команда датчику
pinMode(ECHO_PIN, INPUT); // ECHO — відповідь датчика
digitalWrite(TRIG_PIN, LOW);
Serial.begin(115200); // Така сама швидкість у моніторі
}
void loop() {
float cm = readDistanceCm();
if (cm < 0) {
Serial.println("No echo");
} else {
Serial.print("Distance: ");
Serial.print(cm, 1);
Serial.println(" cm");
}
delay(READ_MS);
}