Плеко / Робототехніка
Урок 06-03 · Крок 1 / 10

Відстань на LCD 1602

На першому рядку екрана — напис Distance:, на другому — відстань у сантиметрах.

  • Arduino Uno, USB-кабель, макетна плата й дроти.
  • HC-SR04, червоний LED, резистор 220 Ом і зумер зі схеми 06-02.
  • LCD 1602 та I²C-перехідник PCF8574.
  • Лінійка й плаский картон.

Залишаємо світлодіод і пищалку з 06-02. Додаємо екран, щоб бачити відстань числом.

Перед зміною схеми від’єднай живлення. У Wokwi зупини симуляцію. Справжню схему перевір разом з учителем перед підключенням USB.

Повний код і файли проєкту

До світлодіода й пищалки додаємо LCD 1602 із показом відстані.

#include <Arduino.h> // Команди Arduino.
#include <LiquidCrystal_I2C.h> // Керування LCD через I²C.

const byte TRIG_PIN = 7; // Вихід запуску датчика.
const byte ECHO_PIN = 6; // Вхід відповіді датчика.
const byte LED_PIN = 8; // Вихід світлодіода.
const byte BUZZER_PIN = 3; // Вихід зумера.
const byte LCD_ADDRESS = 0x27; // Адреса екрана у Wokwi; звір її для свого модуля.
LiquidCrystal_I2C lcd(LCD_ADDRESS, 16, 2); // Екран: 16 символів у кожному з 2 рядків.

float readDistanceCm() {
  digitalWrite(TRIG_PIN, LOW); // Готуємо вихід до нового імпульсу.
  delayMicroseconds(2); // Чекаємо 2 мікросекунди.
  digitalWrite(TRIG_PIN, HIGH); // Починаємо імпульс запуску.
  delayMicroseconds(10); // Тримаємо його 10 мікросекунд.
  digitalWrite(TRIG_PIN, LOW); // Завершуємо імпульс.

  unsigned long echoTime = pulseIn(ECHO_PIN, HIGH, 25000); // Чекаємо відповідь до 25 мс.
  float distanceCm = echoTime / 58.0; // Перетворюємо тривалість відповіді на сантиметри.

  if (echoTime == 0 || distanceCm < 2 || distanceCm > 400) {
    return -1; // Повідомляємо, що вимірювання не вдалося.
  }

  return distanceCm; // Повертаємо виміряну відстань.
}

void startSound() {
  digitalWrite(LED_PIN, HIGH); // Світлодіод світиться разом зі звуком.
  tone(BUZZER_PIN, 2000); // Вмикаємо звук із частотою 2000 Гц.
}

void stopSound() {
  digitalWrite(LED_PIN, LOW); // Світлодіод гасне разом зі звуком.
  noTone(BUZZER_PIN); // Вимикаємо звук.
}

void beep(int pauseMs) {
  startSound(); // Вмикаємо зумер.
  delay(80); // Сигнал звучить 80 мс.
  stopSound(); // Вимикаємо зумер.
  delay(pauseMs); // Чекаємо перед наступним вимірюванням.
}

void playDistanceSignal(float distanceCm) {

  if (distanceCm < 0) { // Датчик не зміг виміряти відстань.
    stopSound(); // Вимикаємо звук.
    delay(100); // Чекаємо перед повторною спробою.

  } else if (distanceCm > 100) { // Перешкода далі ніж 100 см.
    stopSound(); // Залишаємо тишу.
    delay(100); // Чекаємо перед наступним вимірюванням.

  } else if (distanceCm > 30) { // Перешкода в межах понад 30–100 см.
    beep(600); // Короткий сигнал, потім пауза 600 мс.

  } else if (distanceCm > 10) { // Перешкода в межах понад 10–30 см.
    beep(150); // Короткий сигнал, потім пауза 150 мс.

  } else { // Перешкода в межах 2–10 см.
    startSound(); // Звук залишається ввімкненим.
    delay(100); // Через 100 мс знову виміряємо відстань.
  }

}

void showDistance(float distanceCm) {
  lcd.setCursor(0, 1); // Ставимо курсор на початок другого рядка.
  lcd.print("                "); // Стираємо попередній показ 16 пробілами.
  lcd.setCursor(0, 1); // Повертаємо курсор на початок рядка.

  if (distanceCm < 0) { // Вимірювання не вдалося.
    lcd.print("No echo"); // Повідомляємо, що немає надійного відлуння.

  } else { // Датчик повернув відстань.
    lcd.print(distanceCm, 0); // Показуємо сантиметри без десяткових знаків.
    lcd.print(" cm"); // Додаємо одиницю вимірювання.
  }

}

void setup() {
  pinMode(LED_PIN, OUTPUT); // Керуємо світлодіодом.
  digitalWrite(BUZZER_PIN, LOW); // Готуємо вимкнений вихід зумера.
  pinMode(BUZZER_PIN, OUTPUT); // Керуємо зумером.
  stopSound(); // Починаємо без світла й звуку.
  pinMode(TRIG_PIN, OUTPUT); // Надсилаємо імпульс датчику.
  pinMode(ECHO_PIN, INPUT); // Приймаємо відповідь датчика.
  Serial.begin(115200); // Виводимо число для перевірки в монітор порту.
  lcd.init(); // Готуємо екран до роботи.
  lcd.backlight(); // Вмикаємо підсвічування.
  lcd.setCursor(0, 0); // Ставимо курсор на початок першого рядка.
  lcd.print("Distance:"); // Пишемо заголовок «Відстань».
}

void loop() {
  float distanceCm = readDistanceCm(); // 1. Вимірюємо відстань.
  Serial.println(distanceCm); // 2. Показуємо число в моніторі порту.
  showDistance(distanceCm); // 3. Оновлюємо другий рядок LCD.
  playDistanceSignal(distanceCm); // 4. Подаємо світловий і звуковий сигнал.
}

Wokwi потребує інтернету. Завантажений HTML-урок працює офлайн.