🛒
0 товаров
0 руб.

Интернет-магазин «Неглупый Дом»


🕰️ Проект: механические часы со стрелкой на шаговом двигателе и DS1302

Часы DS1302 и шаговый двигатель 28BYJ-48

DS1302 хранит точное время, а шаговый двигатель 28BYJ-48 раз в минуту довoрачивает настоящую физическую стрелку на нужный угол — необычные часы без обычного часового механизма.

Как это работает

DS1302 — это модуль часов реального времени (RTC) с собственной батарейкой, который продолжает отсчитывать время даже когда Arduino обесточена — в отличие от `millis()`, который обнуляется при каждом перезапуске платы. Плата периодически (раз в минуту) спрашивает у DS1302 текущее время и переводит его в угол поворота стрелки.

Шаговый двигатель 28BYJ-48 в этом проекте выступает заменой часовому механизму: вместо постоянного вращения он поворачивается на строго определённое число шагов, вычисленное как разница между текущей позицией стрелки (`currentPosition`) и позицией, соответствующей новому времени (`targetPosition`). Драйвер ULN2003 нужен потому, что сам Arduino не может напрямую выдать ток, достаточный для обмоток шагового двигателя — драйвер усиливает сигналы с цифровых пинов до нужного уровня.

Пошаговая сборка

Так как реализации данного модуля бывают разные, если у вас на плате нет тех контактов, которые указаны ниже — сориентируйтесь по названиям контактов на своей плате.

  1. Подключите DS1302: CLK → D5, DAT → D4, RST → D3, VCC → 5V, GND → GND.
  2. Подключите драйвер ULN2003 к шаговому двигателю 28BYJ-48 (обычно идут в комплекте друг с другом, разъём стандартный): IN1-IN4 драйвера → D8, D9, D10, D11.
  3. Закрепите стрелку на валу двигателя (через переходник или просто плотно насадив) — физически выставив её на 12:00 перед первым запуском.
  4. При первой прошивке один раз выполните команду установки текущего времени в DS1302 (обычно `Rtc.SetDateTime(...)` или через отдельный скетч-пример из библиотеки) — дальше модуль будет держать время сам от батарейки.

Скетч

// ВНИМАНИЕ: рекомендую отладить код через монитор порта, так как я языковая
// модель, а не специализированный кодер, и могу что-то упустить. Основу
// и идею я накидал, но проверьте под свою схему.

#include <ThreeWire.h>
#include <RtcDS1302.h>
#include <Stepper.h>

ThreeWire myWire(4, 5, 3); // DAT, CLK, RST
RtcDS1302<ThreeWire> Rtc(myWire);
const int stepsPerRevolution = 2048; // полный оборот 28BYJ-48 в полушаговом режиме
Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);
long currentPosition = 0; // текущая позиция стрелки в шагах от 12:00

void setup() {
  Serial.begin(9600);
  Rtc.Begin();
  myStepper.setSpeed(10); // скорость вращения, об/мин — не влияет на точность хода часов
}

void loop() {
  RtcDateTime now = Rtc.GetDateTime();
  int minuteOfHalfDay = (now.Hour() % 12) * 60 + now.Minute(); // минуты с полуночи/полудня, 0-719
  long targetPosition = map(minuteOfHalfDay, 0, 720, 0, stepsPerRevolution);

  long diff = targetPosition - currentPosition;
  if (diff != 0) {
    myStepper.step(diff);
    currentPosition = targetPosition;
    Serial.print("Время: ");
    Serial.print(now.Hour());
    Serial.print(":");
    Serial.println(now.Minute());
  }
  delay(60000); // проверка раз в минуту — для стрелочных часов этого достаточно
}

При первом запуске стрелку нужно вручную выставить на 12:00, а часы DS1302 выставить командой `Rtc.SetDateTime()` с текущим временем — дальше механизм держит синхронизацию сам.

Частые проблемы

Как улучшить проект

Товары по теме

Ещё модули для Arduino: Электронные модули.

← 🔢 ручной счётчик на энкодере KY-040 и TM1637🔌 умная розетка на ESP8266 с управлением чер… →

🎁 Купить весь комплект со скидкой 10%

Все 2 товара сразу в корзину: 296 ₽ 266 ₽ (экономия 30 ₽)

Скидка применяется автоматически при оформлении заказа, если в корзине именно этот комплект.

Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.

Корзина


Поиск



Пример: понижающий или DC-DC или mini360 или aw-023 или арт. OZ/WB/YA