Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Часы на Arduino Nano с RTC DS1307 — точное время на 7-сегментном дисплее

Компоненты и материалы

Arduino Nano R3 ×1
Модуль RTC на базе DS1307 (с батарейкой CR2032) ×1
4-разрядный 7-сегментный индикатор (общий анод) ×1
Сдвиговые регистры 74HC595 ×2
Женские разъемы (однорядные) ×3
Монтажная плата (с дорожками как на breadboard) ×1
Перемычки ×25
Мужские разъемы 40 пинов ×1

Необходимые инструменты

Программное обеспечение

О проекте

Простые и легко собираемые цифровые часы на базе RTC DS1307. Отображают время на 4-разрядном 7-сегментном дисплее. Код легко модифицируется для добавления будильника — достаточно фантазии. Проект создан как этап к более сложным задачам и как красивый гаджет для комнаты.

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

Шаг 1: Компоненты

Модуль RTC DS1307

Чип DS1307 сохраняет время при отключении питания. Прост в интерфейсе с Arduino, много библиотек. Связь по I2C: SDA — A4, SCL — A5. Пин DS не используется.

Недостаток: чувствителен к дрейфу времени из-за температуры. Не так точен, как хотелось бы.

Важно: правильно подключайте GND и Vcc. На модуле Vcc находится перед GND. При обратной полярности чип сильно нагревается. При первом включении держите палец на батарейке — если греется, сразу отключайте.

Сдвиговый регистр 74HC595

Ключевой компонент благодаря мультиплексированию. Не бойтесь термина — это весело и полезно.

Примечание: попадались бракованные чипы (не работали Q0/Q1, Q3 закоротчен на землю, Q7 неисправен). Проверяйте мультиметром при пайке.

4-разрядный 7-сегментный дисплей (общий анод)

12 пинов, нумерация снизу слева против часовой стрелки. Нет двоеточия — использую точку второго разряда как мигающий разделитель.

Внимание: сегменты a-g не выстроены в линию. Обязательно используйте токоограничительные резисторы!

Подключение сдвиговых регистров к дисплею:

СегментПин дисплеяПин 595
A1115 (1-й 595)
B71 (1-й 595)
C42 (1-й 595)
D23 (1-й 595)
E14 (1-й 595)
F105 (1-й 595)
G56 (1-й 595)
Decimal37 (1-й 595)
D1 (разряд 1)1215 (2-й 595)
D291 (2-й 595)
D382 (2-й 595)
D463 (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 приведен в оригинале. Основные моменты:

Схемы

Схема проекта в формате Fritzing: 7segmentClock.fzz

Производственный процесс

  1. Производство гладильных досок: дизайн, материалы и технологический процесс
  2. Кукушка: история, мастерство и современная эволюция
  3. Печатные платы: проектирование, производство и будущие тренды
  4. Конструкция и дизайн серфбордов: от полинезийских корней к современным инновациям
  5. Создание робота на Arduino и Raspberry Pi: пошаговое руководство
  6. RasPiRobot Board V2: Расширьте Raspberry Pi в мощный робот-контроллер
  7. Arduino POV-часы: сборка дисплея на эффекте сохранения образа
  8. Бесконечное зеркало-часы: элегантный дизайн и точное время
  9. Важность безупречной печатной платы
  10. Конфигурация двигателя: полное руководство по типам и особенностям