3DИнструкции к проектам
Цифровая рулетка
Ультразвуковой датчик измеряет расстояние, а OLED-экран показывает его в сантиметрах. Собирается за вечер и реально пригождается дома.
- Сложность
- Легко
- Время
- ~60 min
- Детали
- деталей: 5
- Шаг за шагом
- шагов: 4
- Работать с дисплеем по I²C
- Измерять расстояние ультразвуком и сглаживать результат
- Собирать на макетной плате
Детали
Ещё понадобится
- — Компьютер и Arduino IDE (бесплатно на arduino.cc)
- — USB-кабель для UNO (вариант UNO SMD «+ USB-кабель»)
- — Небольшая крестовая отвёртка
Шаг за шагом
- 01
Соберите на макетке
Вставьте HC-SR04 и OLED в макетку. Выведите 5V и GND от UNO на шины питания — оба модуля питаются от них.
- 02
Подключите
OLED: SDA → A4, SCL → A5. HC-SR04: TRIG → D12, ECHO → D11.
- 03
Установите библиотеки
В Arduino IDE откройте «Library Manager» и установите «Adafruit SSD1306» (он предложит и «Adafruit GFX» — согласитесь).
- 04
Загрузите и берите с собой
Загрузите код — на экране появится расстояние. Рулетка питается через USB-порт UNO: отключите её от компьютера и подключите кабель к любому пауэрбанку — и она работает где угодно.
Подключение
- Питание (+)
- Земля (−)
- Сигнальный пин
- Шина I²C / SPI
- OLEDVCC→UNO5V
- OLEDGND→UNOGND
- OLEDSDA→UNOA4
- OLEDSCL→UNOA5
- HC-SR04VCC→UNO5V
- HC-SR04GND→UNOGND
- HC-SR04TRIG→UNOD12
- HC-SR04ECHO→UNOD11
- 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 м он не меряет.
- Не работает от пауэрбанка: некоторые отключаются при малом токе — попробуйте другой.
Что дальше
- Добавьте кнопку, чтобы «замораживать» измерение
- Считайте площадь комнаты по двум замерам

