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

Світлодіод повідомляє про наближення

Наближай предмет до датчика: світлодіод спочатку вимкнений, потім блимає повільно, швидко й нарешті світиться постійно.

  • Arduino Uno та USB-кабель.
  • Макетна плата, датчик HC-SR04, дроти.
  • Червоний світлодіод і резистор 220 Ом.
  • Лінійка та плаский картон.

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

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

Наближаємо предмет: вимкнений LED → повільне блимання → швидке → постійне світло.

#include <Arduino.h> // Команди Arduino.

const byte TRIG_PIN = 7; // Вихід запуску датчика.
const byte ECHO_PIN = 6; // Вхід відповіді датчика.
const byte LED_PIN = 8; // Вихід світлодіода.

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 blinkOnce(int pauseMs) {
  digitalWrite(LED_PIN, HIGH); // Вмикаємо світлодіод.
  delay(80); // Світимо 80 мс.
  digitalWrite(LED_PIN, LOW); // Вимикаємо світлодіод.
  delay(pauseMs); // Чекаємо до наступного вимірювання.
}

void showDistance(float distanceCm) {

  if (distanceCm < 0) { // Вимірювання не вдалося.
    digitalWrite(LED_PIN, LOW); // Вимикаємо світлодіод.
    delay(100); // Чекаємо перед повторною спробою.

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

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

  } else if (distanceCm > 10) { // Понад 10 і до 30 см включно.
    blinkOnce(150); // Короткий спалах, коротка пауза.

  } else { // Від 2 до 10 см включно.
    digitalWrite(LED_PIN, HIGH); // Світлодіод світиться постійно.
    delay(100); // Через 100 мс знову виміряємо відстань.
  }

}

void setup() {
  pinMode(TRIG_PIN, OUTPUT); // Надсилаємо імпульс датчику.
  pinMode(ECHO_PIN, INPUT); // Приймаємо відповідь датчика.
  pinMode(LED_PIN, OUTPUT); // Керуємо світлодіодом.
  Serial.begin(115200); // Виводимо результати в монітор порту.
}

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

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