Перейти к содержимому
Constell Shop
Цифровая рулетка 3D

Инструкции к проектам

Цифровая рулетка

Ультразвуковой датчик измеряет расстояние, а OLED-экран показывает его в сантиметрах. Собирается за вечер и реально пригождается дома.

Сложность
Легко
Время
~60 min
Детали
деталей: 5
Шаг за шагом
шагов: 4
  • Работать с дисплеем по I²C
  • Измерять расстояние ультразвуком и сглаживать результат
  • Собирать на макетной плате

Детали

Ещё понадобится

  • — Компьютер и Arduino IDE (бесплатно на arduino.cc)
  • — USB-кабель для UNO (вариант UNO SMD «+ USB-кабель»)
  • — Небольшая крестовая отвёртка

Шаг за шагом

  1. 01

    Соберите на макетке

    Вставьте HC-SR04 и OLED в макетку. Выведите 5V и GND от UNO на шины питания — оба модуля питаются от них.

  2. 02

    Подключите

    OLED: SDA → A4, SCL → A5. HC-SR04: TRIG → D12, ECHO → D11.

  3. 03

    Установите библиотеки

    В Arduino IDE откройте «Library Manager» и установите «Adafruit SSD1306» (он предложит и «Adafruit GFX» — согласитесь).

  4. 04

    Загрузите и берите с собой

    Загрузите код — на экране появится расстояние. Рулетка питается через USB-порт UNO: отключите её от компьютера и подключите кабель к любому пауэрбанку — и она работает где угодно.

Подключение

  • Питание (+)
  • Земля (−)
  • Сигнальный пин
  • Шина I²C / SPI
OLED ⟷ UNOпроводов: 4
  1. OLEDVCC→UNO5V
  2. OLEDGND→UNOGND
  3. OLEDSDA→UNOA4
  4. OLEDSCL→UNOA5
HC-SR04 ⟷ UNOпроводов: 4
  1. HC-SR04VCC→UNO5V
  2. HC-SR04GND→UNOGND
  3. HC-SR04TRIG→UNOD12
  4. HC-SR04ECHO→UNOD11
USB-кабель ⟷ Компьютер или пауэрбанкпроводов: 1
  1. USB-кабель→Компьютер или пауэрбанк

Код

sketch.ino
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Adafruit_SSD1306 oled(128, 64, &Wire, -1);
const int TRIG = 12, ECHO = 11;

long readCm() {
  digitalWrite(TRIG, LOW);  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH); delayMicroseconds(10);
  digitalWrite(TRIG, LOW);
  long us = pulseIn(ECHO, HIGH, 25000);
  return us ? us / 58 : -1;
}

// медиана пяти замеров: одно случайное эхо не испортит результат
long measure() {
  long r[5];
  for (int i = 0; i < 5; i++) { r[i] = readCm(); delay(15); }
  for (int i = 0; i < 4; i++)
    for (int j = i + 1; j < 5; j++)
      if (r[j] < r[i]) { long t = r[i]; r[i] = r[j]; r[j] = t; }
  return r[2];
}

void setup() {
  pinMode(TRIG, OUTPUT); pinMode(ECHO, INPUT);
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);   // если экран не горит, попробуйте 0x3D
  oled.setTextColor(SSD1306_WHITE);
}

void loop() {
  long cm = measure();
  oled.clearDisplay();
  oled.setTextSize(1); oled.setCursor(0, 0);
  oled.print("Constell tape");
  oled.setTextSize(3); oled.setCursor(0, 22);
  if (cm < 2 || cm > 400) oled.print("---");
  else { oled.print(cm); oled.setTextSize(2); oled.print(" cm"); }
  oled.display();
  delay(150);
}

Если что-то не работает

  • Экран не загорается: попробуйте адрес 0x3D вместо 0x3C; проверьте SDA/SCL на A4/A5.
  • Показания скачут: направляйте датчик перпендикулярно поверхности; ближе 2 см и дальше 4 м он не меряет.
  • Не работает от пауэрбанка: некоторые отключаются при малом токе — попробуйте другой.

Что дальше

  • Добавьте кнопку, чтобы «замораживать» измерение
  • Считайте площадь комнаты по двум замерам