Часы на Arduino Nano с RTC DS1307 — точное время на 7-сегментном дисплее
Компоненты и материалы
| Arduino Nano R3 | ×1 |
| Модуль RTC на базе DS1307 (с батарейкой CR2032) | ×1 |
| 4-разрядный 7-сегментный индикатор (общий анод) | ×1 |
| Сдвиговые регистры 74HC595 | ×2 |
| Женские разъемы (однорядные) | ×3 |
| Монтажная плата (с дорожками как на breadboard) | ×1 |
| Перемычки | ×25 |
| Мужские разъемы 40 пинов | ×1 |
Необходимые инструменты
- Паяльник
- Мультиметр (проверка пайки, тока, прозвонка)
Программное обеспечение
- Arduino IDE
- Fritzing (для проектирования схемы)
О проекте
Простые и легко собираемые цифровые часы на базе RTC DS1307. Отображают время на 4-разрядном 7-сегментном дисплее. Код легко модифицируется для добавления будильника — достаточно фантазии. Проект создан как этап к более сложным задачам и как красивый гаджет для комнаты.
Описан каждый нюанс, включая проблемы при пайке на печатную плату и их решения.
Шаг 1: Компоненты
Модуль RTC DS1307
Чип DS1307 сохраняет время при отключении питания. Прост в интерфейсе с Arduino, много библиотек. Связь по I2C: SDA — A4, SCL — A5. Пин DS не используется.
Недостаток: чувствителен к дрейфу времени из-за температуры. Не так точен, как хотелось бы.
Важно: правильно подключайте GND и Vcc. На модуле Vcc находится перед GND. При обратной полярности чип сильно нагревается. При первом включении держите палец на батарейке — если греется, сразу отключайте.
Сдвиговый регистр 74HC595
Ключевой компонент благодаря мультиплексированию. Не бойтесь термина — это весело и полезно.
- 2 регистра 74HC595 (по 16 пинов)
- Первый — управление сегментами
- Второй — выбор активного разряда
- Быстрое переключение создает иллюзию одновременного свечения всех цифр
Примечание: попадались бракованные чипы (не работали Q0/Q1, Q3 закоротчен на землю, Q7 неисправен). Проверяйте мультиметром при пайке.
4-разрядный 7-сегментный дисплей (общий анод)
12 пинов, нумерация снизу слева против часовой стрелки. Нет двоеточия — использую точку второго разряда как мигающий разделитель.
Внимание: сегменты a-g не выстроены в линию. Обязательно используйте токоограничительные резисторы!
Подключение сдвиговых регистров к дисплею:
| Сегмент | Пин дисплея | Пин 595 |
|---|---|---|
| A | 11 | 15 (1-й 595) |
| B | 7 | 1 (1-й 595) |
| C | 4 | 2 (1-й 595) |
| D | 2 | 3 (1-й 595) |
| E | 1 | 4 (1-й 595) |
| F | 10 | 5 (1-й 595) |
| G | 5 | 6 (1-й 595) |
| Decimal | 3 | 7 (1-й 595) |
| D1 (разряд 1) | 12 | 15 (2-й 595) |
| D2 | 9 | 1 (2-й 595) |
| D3 | 8 | 2 (2-й 595) |
| D4 | 6 | 3 (2-й 595) |
Проект дешевый и простой, но требует терпения при пайке на ПП. На макетке собирается за 2 часа.
Код
Основной скетч часов (Arduino)
Использует библиотеки RTC и I2C (Wire). Для дисплея с общим анодом.
#include <Wire.h>
#include <EEPROM.h>
#include <RTClib.h>
RTC_DS1307 RTC;
int latchPin = 3; // pin 12 on 595
int dataPin = 4; // pin 14 on 595
int clockPin = 2; // pin 11 on 595
int shift = 256;
int units, tens, hundreds, thousands;
const int alarmHour = 17;
const int alarmMinute = 26;
void setup() {
Serial.begin(9600);
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(13, OUTPUT); // alarm LED
Wire.begin();
RTC.begin();
if (!RTC.isrunning()) {
RTC.adjust(DateTime(__DATE__, __TIME__));
}
}
void loop() {
DateTime now = RTC.now();
int HOUR = now.hour();
int MINUT = now.minute();
// Разбор часов на разряды
if (HOUR < 10) { hundreds = HOUR; thousands = 0; }
else { hundreds = HOUR % 10; thousands = HOUR / 10; }
if (MINUT <= 9) { units = MINUT; tens = 0; }
else { units = MINUT % 10; tens = MINUT / 10; }
// Вывод каждой цифры через мультиплексирование
// (функция displayDigit(позиция, значение) вынесена для краткости)
displayDigit(1, units); delay(1);
displayDigit(2, tens); delay(1);
displayDigit(3, hundreds); delay(1);
displayDigit(4, thousands); delay(1);
// Будильник на пине 13
if (HOUR == alarmHour && MINUT == alarmMinute) digitalWrite(13, HIGH);
else digitalWrite(13, LOW);
}
// Вспомогательная функция вывода цифры на указанный разряд
void displayDigit(int digit, int value) {
static const uint8_t seg[10] = {
0b11000000, // 0
0b11111001, // 1
0b10100100, // 2
0b10110000, // 3
0b10011001, // 4
0b10010010, // 5
0b10000010, // 6
0b11111000, // 7
0b10000000, // 8
0b10010000 // 9
};
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, ~seg[value]); // инверсия для общего анода
shiftOut(dataPin, clockPin, MSBFIRST, ~(1 << (digit + 3))); // выбор разряда на 2-м 595
digitalWrite(latchPin, HIGH);
}
Скетч установки времени (Arduino)
DS1307 склонен к дрейфу. Этот скетч позволяет установить точное время через Serial Monitor. Подключите RTC, загрузите скетч, откройте Serial Monitor, введите дату/время, затем загрузите основной скетч.
Полный код библиотеки RealTimeClockDS1307 и RTClib приведен в оригинале. Основные моменты:
- Создайте папку
libraries/RealTimeClockDS1307с файлами.h,.cpp,keywords.txt - Создайте папку
libraries/RTClibс файлами Adafruit RTClib - Установите через Arduino IDE: Sketch → Include Library → Add .ZIP Library
Схемы
Схема проекта в формате Fritzing: 7segmentClock.fzz
Производственный процесс
- Производство гладильных досок: дизайн, материалы и технологический процесс
- Кукушка: история, мастерство и современная эволюция
- Печатные платы: проектирование, производство и будущие тренды
- Конструкция и дизайн серфбордов: от полинезийских корней к современным инновациям
- Создание робота на Arduino и Raspberry Pi: пошаговое руководство
- RasPiRobot Board V2: Расширьте Raspberry Pi в мощный робот-контроллер
- Arduino POV-часы: сборка дисплея на эффекте сохранения образа
- Бесконечное зеркало-часы: элегантный дизайн и точное время
- Важность безупречной печатной платы
- Конфигурация двигателя: полное руководство по типам и особенностям