21.02.2026 14:33 Микроконтроллеры
Admin

Часы на Arduino с модулем реального времени DS1307 и LCD 16×2

Часы на Arduino с модулем реального времени DS1307 и LCD 16×2

Пошаговая сборка и настройка

В интернете можно найти множество схем часов на Arduino. Часто такие проекты используют I²C-адаптер для LCD-дисплея, чтобы сократить количество проводов. Это действительно удобно, однако добавляет в конструкцию дополнительную плату и ещё один промежуточный модуль.

В данном проекте дисплей подключается напрямую в 4-битном режиме — без дополнительных драйверов. Чем меньше компонентов и промежуточных плат используется в устройстве, тем проще конструкция и тем выше её надёжность.

Теоретически часы можно реализовать и без отдельного модуля времени — Arduino способна отсчитывать секунды программно. Однако при отключении питания время будет сбрасываться.

Поэтому используется модуль реального времени (RTCReal-Time Clock) DS1307. Он хранит дату и время независимо от Arduino благодаря встроенной батарейке.

В результате получается полноценное автономное устройство отображения времени, которое:

  • отображает текущее время,
  • отображает дату,
  • сохраняет данные при отключении питания,
  • позволяет установить дату и время через компьютер.

 

Необходимые компоненты

Для сборки понадобятся:

  • Arduino Uno (или совместимая плата),
  • модуль RTC DS1307,
  • LCD-дисплей 16×2,
  • макетная плата,
  • соединительные провода,
  • переменный резистор 10 кОм (для регулировки контраста),
  • резистор 1–2 кОм (для подсветки дисплея),

USB-кабель.

 

 

 

Модуль DS1307 оснащён батарейкой, благодаря которой время сохраняется даже при отключении питания Arduino.

 

Подключение компонентов

Перед подачей питания рекомендуется внимательно проверить соединения по монтажной и принципиальной схемам.

 

1. Подключение модуля DS1307

Модуль подключается по шине I²C:

  • SDA → A4
  • SCL → A5
  • VCC → 5V
  • GND → GND

Важно убедиться, что питание и земля подключены корректно, так как неправильное подключение может привести к нестабильной работе модуля.

 

2. Подключение LCD 16×2

Дисплей используется в 4-битном режиме.

Подключение сигнальных линий:

  • RS → 9
  • E → 8
  • D4 → 7
  • D5 → 6
  • D6 → 5
  • D7 → 4

Регулировка контраста:

  • крайние выводы переменного резистора → 5V и GND
  • средний вывод → VO дисплея

Контраст следует отрегулировать так, чтобы символы были чётко видны, но фон не был затемнён.

 

🔧 Резистор для подсветки LCD

LCD 16×2 имеет встроенную светодиодную подсветку.
В большинстве дисплеев для неё требуется токоограничивающий резистор.

В данной сборке используется резистор номиналом 2 кОм.

Подключение:

  • вывод A (LED+) → через резистор 2 кОм → 5V
  • вывод K (LED−) → GND

Резистор ограничивает ток через светодиоды подсветки и предотвращает их перегрев.

В некоторых версиях LCD 16×2 резистор уже встроен в модуль. Однако в универсальных дисплеях он может отсутствовать, поэтому внешний резистор обеспечивает безопасный режим работы.

 

Рекомендуется аккуратно развести питание по шинам макетной платы и минимизировать длину сигнальных проводов. Это уменьшает вероятность помех и повышает стабильность работы.

Ниже приведена принципиальная электрическая схема устройства, по которой можно проверить правильность соединений перед первым включением.

Подключение к компьютеру

Подключите Arduino к компьютеру через USB-кабель.

После подключения:

  1. Откройте Arduino IDE.
  2. Выберите:
  • Инструменты → Плата → Arduino Uno
  • Инструменты → Порт → соответствующий COM-порт

Создание нового скетча

Выберите:

Файл → New Sketch

Откроется пустое окно программы.

Удалите содержимое нового скетча.

Вставьте полный код проекта.

Полный код программы

#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(9, 8, 7, 6, 5, 4);

String inputString = "";
boolean stringComplete = false;

void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);
}

void loop() {
  tmElements_t tm;

  if (stringComplete) {
    tm.Day = (int(inputString[0]) - 48) * 10 + (int(inputString[1]) - 48);
    tm.Month = (int(inputString[3]) - 48) * 10 + (int(inputString[4]) - 48);
    tm.Year = CalendarYrToTm(
      (int(inputString[6]) - 48) * 1000 +
      (int(inputString[7]) - 48) * 100 +
      (int(inputString[8]) - 48) * 10 +
      (int(inputString[9]) - 48)
    );
    tm.Hour = (int(inputString[11]) - 48) * 10 + (int(inputString[12]) - 48);
    tm.Minute = (int(inputString[14]) - 48) * 10 + (int(inputString[15]) - 48);
    tm.Second = (int(inputString[17]) - 48) * 10 + (int(inputString[18]) - 48);

    RTC.write(tm);

    inputString = "";
    stringComplete = false;
  }

  if (RTC.read(tm)) {
    print2digits(tm.Hour, 0, 0);
    lcd.print(":");
    print2digits(tm.Minute, 3, 0);
    lcd.print(":");
    print2digits(tm.Second, 6, 0);

    print2digits(tm.Day, 0, 1);
    lcd.print("/");
    print2digits(tm.Month, 3, 1);
    lcd.print("/");
    lcd.print(tmYearToCalendar(tm.Year));
  }
  else {
    lcd.clear();
    lcd.setCursor(0, 0);

    if (RTC.chipPresent()) {
      lcd.print("DS1307 is stopped");
    } else {
      lcd.print("DS1307 read error");
    }

    delay(5000);
  }

  delay(1000);
}

void print2digits(int number, int col, int row) {
  lcd.setCursor(col, row);
  if (number >= 0 && number < 10) {
    lcd.print("0");
  }
  lcd.print(number);
}

void serialEvent() {
  while (Serial.available()) {
    char inChar = (char)Serial.read();
    inputString += inChar;

    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}

Сохраните файл.

4. Проверка компиляции

Нажмите кнопку Проверить (галочка).

Если всё в порядке — внизу появится сообщение об успешной компиляции.

Если появится ошибка вида:

DS1307RTC.h: No such file or directory

значит библиотека не установлена.

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

Перейдите в:

Скетч → Подключить библиотеку → Управление библиотеками

В строке поиска найдите и установите библиотеки:

  • DS1307RTC
  • Time

После установки повторите проверку компиляции.

 

6. Загрузка прошивки

Нажмите кнопку:

Загрузить на плату

После завершения появится сообщение:

«Загрузка завершена».

 

7. Установка времени

Теперь необходимо установить текущее время.

Откройте:

Инструменты → Монитор порта

Установите скорость:

9600 baud

В поле ввода введите дату и время строго в формате:

DD/MM/YYYY HH:MM:SS

Пример:

21/02/2026 12:09:04

Нажмите Enter.

Arduino передаст данные модулю RTC, и время будет записано во внутреннюю память DS1307.

После этого модуль будет хранить время автономно, даже при отключении питания. Повторная установка требуется только при замене батарейки или полном сбросе модуля.

 

Результат

Через секунду на дисплее появится установленное время.

·         Первая строка — текущее время

·         Вторая строка — текущая дата

Обновление дисплея происходит раз в секунду, однако сам модуль RTC отсчитывает время независимо от задержек в программе.
Если модуль не отвечает, на экране будет выведено сообщение об ошибке.

 

Практические замечания

  • Используйте короткие провода.
  • Разделяйте питание и сигнальные линии.
  • Проверяйте полярность подключения.
  • Если время сбрасывается — проверьте батарейку RTC.

 

Развитие проекта

Базовую конструкцию можно расширить:

  • добавить кнопки для установки времени без компьютера,
  • добавить датчик температуры (например, DS18B20),
  • реализовать будильник,
  • добавить автоматическую регулировку подсветки,
  • поместить устройство в корпус,
  • использовать более точный модуль DS3231.

Этот проект может стать основой для метеостанции или информационного дисплея.

 

Продолжение

🔧 Раздел «Устройства» — разбор реальных приборов и схем.
📘 Раздел «Обучение» — последовательные материалы по основам электроники.
💬 Форум — обсуждения, вопросы и обмен опытом.

Практика — лучший способ развивать понимание.

 

Войдите, чтобы поставить оценку. Просмотры: 10
Войдите, чтобы обсуждать на форуме.