Введение
Как микроконтроллеры отслеживают время и дату? Обычный микроконтроллер обладает функцией таймера, который стартует от нуля при подаче напряжения питания, а затем начинает считать. В мире Arduino мы можем использовать функцию , чтобы узнать, сколько прошло миллисекунд с того времени, когда было подано напряжение питания. Когда вы снимете и снова подадите питания, она начнет отсчет с самого начала. Это не очень удобно, когда дело доходит до работы с часами и датами.
Вот здесь и будет удобно использование микросхемы RTC (Real Time Clock, часов реального времени). Эта микросхема с батарейкой 3В или каким-либо другим источником питания следит за временем и датой. Часы/календарь обеспечивают информацию о секундах, минутах, часах, дне недели, дате, месяце и годе. Микросхема корректно работает с месяцами продолжительностью 30/31 день и с високосными годами. Связь осуществляется через шину I2C (шина I2C в данной статье не обсуждается).
Если напряжение на главной шине питания Vcc падает ниже напряжения на батарее Vbat, RTC автоматически переключается в режим низкого энергопотребления от резервной батареи. Резервная батарея – это обычно миниатюрная батарея (в виде «монетки», «таблетки») напряжением 3 вольта, подключенная между выводом 3 и корпусом. Таким образом, микросхема по-прежнему будет следить за временем и датой, и когда на основную схему будет подано питание, микроконтроллер получит текущие время и дату.
В этом проекте мы будем использовать DS1307. У этой микросхемы вывод 7 является выводом SQW/OUT (выходом прямоугольных импульсов). Вы можете использовать этот вывод для мигания светодиодом и оповещения микроконтроллера о необходимости фиксации времени. Мы будем делать и то, и другое. Ниже приведено объяснение работы с выводом SQW/OUT.
Для управления работой вывода SQW/OUT используется регистр управления DS1307.
Бит 7 | Бит 6 | Бит 5 | Бит 4 | Бит 3 | Бит 2 | Бит 1 | Бит 0 |
---|---|---|---|---|---|---|---|
OUT | SQWE | RS1 | RS0 |
- Бит 7: управление выходом (OUT)
- Этот бит управляет выходным уровнем вывода SQW/OUT, когда выход прямоугольных импульсов выключен. Если SQWE = 0, логический уровень на выводе SQW/OUT равен 1, если OUT = 1, и 0, если OUT = 0. Первоначально обычно этот бит равен 0.
- Бит 4: включение прямоугольных импульсов (SQWE)
- Этот бит, когда установлен в логическую 1, включает выходной генератор. Частота прямоугольных импульсов зависит от значений битов RS0 и RS1. Когда частота прямоугольных импульсов настроена на значение 1 Гц, часовые регистры обновляются во время спада прямоугольного импульса. Первоначально обычно этот бит равен 0.
- Биты 1 и 0: выбор частоты (RS)
- Эти биты управляют частотой выходных прямоугольных импульсов, когда выход прямоугольных импульсов включен. Следующая таблица перечисляет частоты прямоугольных импульсов, которые могут быть выбраны с помощью данных битов. Первоначально обычно эти биты равны 1.
RS1 | RS0 | Частота импульсов и уровень на выходе SQW/OUT | SQWE | OUT |
---|---|---|---|---|
1 Гц | 1 | x | ||
1 | 4,096 кГц | 1 | x | |
1 | 8,192 кГц | 1 | x | |
1 | 1 | 32,768 кГц | 1 | x |
x | x | |||
x | x | 1 | 1 |
Данная таблица поможет вам с частотой:
Частота импульсов | Бит 7 | Бит 6 | Бит 5 | Бит 4 | Бит 3 | Бит 2 | Бит 1 | Бит 0 |
---|---|---|---|---|---|---|---|---|
1 Гц | 1 | |||||||
4,096 кГц | 1 | 1 | ||||||
8,192 кГц | 1 | 1 | ||||||
32,768 кГц | 1 | 1 | 1 |
Если вы подключили светодиод и резистор к выводу 7 и хотите, чтобы светодиод мигал с частотой 1 Гц, то должны записать в регистр управления значение 0b00010000. Если вам нужны импульсы 4,096 кГц, то вы должны записать 0b000100001. В этом случае, чтобы увидеть импульсы вам понадобится осциллограф, так как светодиод будет мигать так быстро, что будет казаться, что он светится постоянно. Мы будем использовать импульсы с частотой 1 Гц.
Управление часами
Часы управляются с помощью TL1-минута, час-TL2 и TL3-режим. Кнопки часы и минуты используются в режиме часов для назначения часов и минут. В других режимах они имеют различные функции. Кнопка режима переключает между различными режимами, которых в общей сложности 8:
Режим 1-й — Часы
В этом режиме на дисплее отображается текущее время в формате «ЧЧ.ММ.СС». Кнопка часов используется для установки часов. Кнопка минут для установки минут. При ее нажатии происходит сброс секунд.
Режим 2-й — Включение перехода на летнее время и установки года
Здесь Вы можете включать и выключать автоматический переход между летним и зимним временем и установить год. Данные следующего формата «AC ‘RR» (АС – автоматическое время, пробел, последние две цифры года).
Режим 3-й — Таймер обратного отсчета
Это режим позволяет организовать обратный отсчет от заданного значения до нуля. По истечении этого времени раздастся звуковой сигнал и светится светодиод LED1. Звуковой сигнал может быть остановлен нажатием кнопки Режим. Данные следующего формата «ЧЧ.ММ.СС». Максимально возможное значение составляет 99.59.59 (почти 100 часов).
Режим 4-й – Комбинированный вывод информации
В этом режиме, попеременно показывается:
- текущее время в формате «ЧЧ.ММ.СС»
- дата в формате «AA.DD.MM.»
Каждый формат отображается в течение 1 секунды. В этом режиме используются кнопки Часов и Минут, для регулировки яркости дисплея (Часы-, Минуты+). Яркость изменяется логарифмически в 6 этапов: 1/1, 1/2, 1/4, 1/8, 1/16 и 1/32-й. По умолчанию установлено 1/2
Режим 5-й — Установка дня недели и режим работы будильника
В этом режиме можно установить день недели — с понедельника по воскресенье (отображается как пн, вт, ср, чт, пт, сб, вс), включать будильник и выбирать его режим работы. Данные следующего формата «AA AL._» (день недели, пробел, AL., Настройка будильника).
Кнопка часов устанавливает день недели. Кнопка минут используется для включения/выключения звукового сигнала будильника и выбора режима его работы: «AL._» = будильник не активный, «AL.1″ = будильник сигналит 1 раз (затем автоматически переходит в положение»AL._»), «AL.5» = сигнал будильника только в будние дни (пн-пт, кроме сб-вс), «AL.7» = будильник звонит каждый день
Режим 7-й — Секундомер
Секундомер позволяет измерять время с точностью 0,1 сек. Максимальное время измерения составляет 9.59.59.9 (почти 10 часов). Данные следующего формата «H.MM.SS.X». Кнопка минут используется для запуска и остановки секундомера. Кнопка часов используется для сброса.
Режим 8-й — Будильник
Этот режим используется для отображения и установить время будильника (ALARM). Данные следующего формата «HH.MM.AL». Кнопка Минуты устанавливает минуту будильника, кнопку Часы устанавливает час будильника.
Ниже приведена схема аналогичных часов, имеющие индикатор с общим катодом
Скачать прошивку с общим анодом (37,7 KiB, скачано: 1 465)
Скачать прошивку с общим катодом (29,9 KiB, скачано: 825)
http://danyk.cz
Тестер транзисторов / ESR-метр / генератор
Многофункциональный прибор для проверки транзисторов, диодов, тиристоров…
Подробнее
Схема проекта
Схема часов на Arduino и 4-х разрядном семисегментном индикаторе представлена на следующем рисунке.
В следующей таблице представлены необходимые соединения между модулем часов реального времени и платой Arduino Uno.
DS3231 | Arduino Uno |
VCC | 5V |
GND | GND |
SDA | A4 |
SCL | A5 |
В следующей таблице представлены необходимые соединения между регистром сдвига 74HC595 и платой Arduino Uno.
Регистр сдвига 74HC595 | Arduino Uno |
11-SH_CP (SRCLK) | 6 |
12-ST_CP (RCLK) | 5 |
14-DS (Data) | 4 |
13-OE(Latch) | GND |
8-GND | GND |
10-MR(SRCLR) | +5V |
16-VCC | +5V |
В следующей таблице представлены необходимые соединения между регистром сдвига 74HC595, 4-х разрядным семисегментным дисплей и платой Arduino Uno.
4-х разрядный семисегментный дисплей | Регистр сдвига 74HC595 | Arduino Uno |
A | Q0 | — |
B | Q1 | — |
C | Q2 | — |
D | Q3 | — |
E | Q4 | — |
F | Q5 | — |
G | Q6 | — |
D1 | — | 10 |
D2 | — | 11 |
D3 | — | 12 |
D4 | — | 9 |
Внешний вид собранной конструкции проекта показан на следующем рисунке.
Step 3: Get the Hardware Ready!
The components are soldered on dot matrix PCB as shown. I have used two 2*4 inch dot matrix PCBs. On one I have mounted seven segments, push buttons(SPST) and buzzer and on other the microcontroller’s IC base, capacitors, XTAL oscillator, resistors and RTC module from its back side is mounted as shown in images. The tow PCBs are stacked to each other through berg strips headers. Such arrangement makes the clock more compact. A micro USB port is attached to back PCB for powering it through a micro USB cable . Headers for serial UART interface is also added for uploading sketches and future firmware upgrades.
4-х разрядный семисегментный дисплей (4-Digit 7 Segment Display)
4-х разрядный семисегментный дисплей состоит из четырех семисегментных дисплеев, объединенных в единое устройство. Иногда говорят, что эти дисплеи “мультиплексированы вместе”, поэтому для управления ими можно использовать технологию мультиплексирования. Этот дисплей можно использовать для отображения цифр, а также некоторых букв. Дисплей можно использовать в обоих направлениях. 4 символа удобно использовать для изготовления электронных часов или счетчика от 0 до 9999.
На следующем рисунке показана внутренняя схема соединений 4-х разрядного семисегментного дисплея.
Каждый сегмент дисплея имеет собственный светодиод и им можно индивидуально управлять. Светодиоды таким образом скомпонованы в составе дисплея, что каждый из них освещает только свой сегмент (к которому он относится). Семисегментные дисплеи могут быть с общим катодом и общим анодом, как показано на следующем рисунке.
В семисегментном дисплее с общим катодом (ОК) отрицательные выводы всех светодиодов соединены вместе и образую общую землю. В схеме с общим анодом (ОА) положительные выводы всех светодиодов соединены вместе и они образуют общий вывод напряжения постоянного тока (VCC).
На нашем сайте есть достаточно подробные статьи про устройство семисегментных дисплеев и их программированию – они написаны для микроконтроллеров семейства AVR, но я думаю провести аналогию с Arduino вам будет не трудно:
- семисегментный светодиодный индикатор: описание, подключение к микроконтроллеру;
- перевод двоичного кода десятичного числа в код семисегментного индикатора. Программа вывода цифры на одноразрядный светодиодный индикатор;
- многоразрядный семисегментный индикатор: организация динамической индикации, алгоритм работы, программа индикации.
Также можно посмотреть статью о подключении семисегментного дисплея к микроконтроллеру AVR ATmega32.
Использование технологии мультиплексирования
Так каким образом мы можем на подобном 4-х символьном семисегментном дисплее отобразить, к примеру, число 1234? Это возможно сделать с использованием технологии мультиплексирования. Смысл этой технологии достаточно прост – в каждый момент времени мы отображаем только один символ (из 4-х возможных) на данном дисплее. Переключение между отображением всех 4-х символов происходит достаточно быстро – поэтому человеческий глаз воспринимает их непрерывно горящими.
Модуль DS3231 RTC
DS3231 — это модуль RTC. RTC расшифровывается как часы реального времени. Этот модуль используется для запоминания времени и даты, даже когда цепь не запитана. Он имеет резервную батарею CR2032 для работы модуля при отсутствии внешнего питания. В этот модуль также входит датчик температуры. Модуль можно использовать во встроенных проектах, таких как создание цифровых часов с индикатором температуры и т. Д. Вот несколько полезных проектов, в которых он используется:
- Автоматическая кормушка для домашних животных с использованием Arduino
- Взаимодействие модуля RTC (DS3231) с микроконтроллером PIC: цифровые часы
- Взаимодействие модуля RTC (DS3231) с MSP430: цифровые часы
- Часы реального времени ESP32 с использованием модуля DS3231
- Цифровые настенные часы на печатной плате с использованием микроконтроллера AVR Atmega16 и DS3231 RTC
Распиновка DS3231:
Имя контакта |
Использовать |
VCC |
Подключен к плюсу источника питания |
GND |
Подключен к земле |
ПДД |
Вывод последовательных данных (I2C) |
SCL |
Вывод последовательных часов (I2C) |
SQW |
Вывод прямоугольной волны |
32K |
Выход генератора 32K |
Особенности и характеристики:
- RTC считает секунды, минуты, часы и год
- Цифровой датчик температуры с точностью ± 3ºC
- Зарегистрироваться на старение
- Интерфейс I2C 400 кГц
- Низкое энергопотребление
- Резервная батарея CR2032 со сроком службы от двух до трех лет
- Рабочее напряжение: от 2,3 до 5,5 В
Характеристики часов
- формат отображения времени: часы, минуты;
- будильник с функцией повтора;
- простое управление с помощью 2 кнопок;
- поддержка работы от батарейки;
- напряжение питания: 7…12В / 0,2 A;
- размеры двух печатных плат: 60×21 мм, 58×44 мм.
Принципиальная схема часов показана на рисунке ниже. Схема часов должна быть запитана постоянным напряжением в диапазоне 7…12В. Это может быть любой блок питания с нагрузкой по току не менее 200 мА.
Диод VD1 (1N4007) защищает схему от неправильной полярности подключения входного питания. Внешнее входное напряжение подается на стабилизатор DA1 (), а конденсаторы C3…C7 выполняют роль фильтра питания.
Работой часов управляет микроконтроллер Atmega8, а в качестве часов реального времени применена микросхема типа PCF8583. Связь PCF8583 с микроконтроллером осуществляется через I2C интерфейс.
В качестве дисплея используется модульный четырехзначный семисегментный дисплей с общим анодом. Дисплей подключается непосредственно к выводам микроконтроллера через ограничительные резисторы R1…R12.
К разъему CON5 платы можно подключить зуммер с генератором, который будет выступать в качестве звукового сигнала будильника. К клеммам SA1 и SA2 печатной платы подключаются кнопки, которые служат для ввода настроек и обслуживания часов.
Программирование Arduino UNO для мультиплексирования семисегментного дисплея
Полный код и рабочее видео прилагаются в конце этого руководства. В разделе программирования будет объяснено, как время (часы и минуты) берутся из модуля RTC в 24-часовом формате, а затем преобразуются в соответствующий формат для отображения на 4-значном 7-сегментном дисплее.
Для связи модуля DS3231 RTC с Arduino UNO используется шина I2C Arduino UNO. Библиотека под названием
включен в программу для доступа к функциям, таким как установка и считывание времени, даты, данных температуры и т. д. Загрузите модуль DS3231 RTC Arduino Library. Поскольку модуль RTC использует интерфейс I2C,
библиотека также используется в программе.
В этой концепции часы и минуты сначала берутся из RTC, и они объединяются вместе, как 09:30 (21:30 pm), а затем отдельные цифры разделяются, как тысяча, сотня, десятки, единицы, а отдельные цифры преобразуются в двоичный формат, например 0 в 63 (0111111). Этот двоичный код отправляется в регистр сдвига, а затем из регистра сдвига в семисегментный, успешно отображая цифру 0 на семисегментном дисплее. Таким образом, четыре цифры мультиплексируются и отображаются часы и минуты.
Изначально включены необходимые библиотеки, такие как библиотека DS3231 и библиотека Wire (библиотека I2C).
#включают
#включают
Штифты определены для управления семью сегментами. Эти элементы управления будут играть важную роль в мультиплексировании дисплея.
#define latchPin 5 #define clockPin 6 #define dataPin 4 #define dot 2
Переменные объявлены для хранения преобразованного или необработанного результата, взятого из RTC.
int h; // Переменная объявлена для часа int m; // Переменная объявлена для минуты int тысяч; int сотни; int tens; int unit; bool h24; bool PM;
Затем объект класса DS3231 объявляется как RTC, чтобы упростить использование в следующих строках.
DS3231 RTC;
Поскольку модуль RTC взаимодействует с Arduino с помощью связи I2C. Итак, wire.begin () используется для запуска связи I2C в адресе RTC по умолчанию, поскольку других модулей I2C нет.
Wire.begin ();
Режим вывода определяется, будет ли GPIO работать как выход или вход.
pinMode (9, ВЫХОД); pinMode (10, ВЫХОД); pinMode (11, ВЫХОД); pinMode (12, ВЫХОД); pinMode (latchPin, ВЫХОД); pinMode (clockPin, ВЫХОД); pinMode (dataPin, ВЫХОД); pinMode (точка, ВЫХОД);
Цикл выполняется бесконечно и требует времени в часах и минутах от модуля RTC DS3231. «h24» указывает переменную 24-часового формата.
int h = RTC.getHour (h24, PM); int m = RTC.getMinute ();
Затем час и минута объединяются в одно число (например, если час равен 10, а мин равен 60, тогда число будет 10 * 100 = 1000 + 60 = 1060).
int число = h * 100 + m;
В отдельных цифрах от числа получаются (пример 1060- 1 тыс, 0 hundered, 1 десятые и 0 последняя цифра). Для разделения цифр используется оператор модуля. Например, в 1060, чтобы получить 1, тогда 1060/1000 = 1,06% 10 = 1). Таким образом, отдельные цифры хранятся в отдельных переменных.
int тысяч = число / 1000% 10; int сотни = число / 100% 10; int десятки = число / 10% 10; int unit = число% 10;
После этого определяется оператор switch case для каждой отдельной цифры для преобразования их в соответствующий формат (двоичный формат) и отправки через регистр сдвига для отображения в 7-сегментном формате. Например (1 цифра заменяется на 06 (0000 0110)). Таким образом, он отправляется через сдвиг, и 1 цифра отображается в 7-сегментном формате (0 для LOW, 1 для HIGH).
switch (t) { case 0: unit = 63; сломать; случай 1: unit = 06; сломать; случай 2: unit = 91; сломать; случай 3: unit = 79; сломать; случай 4: unit = 102; сломать; случай 5: unit = 109; сломать; случай 6: unit = 125; случай 7: unit = 07; сломать; случай 8: unit = 127; сломать; case 9: unit = 103; сломать; }
Затем отдельная цифра в двоичном формате отправляется через функцию shiftout с первым старшим битом, и соответствующий цифровой вывод становится ВЫСОКИМ, а контакт защелки становится ВЫСОКИМ.
digitalWrite (9, LOW); digitalWrite (latchPin, LOW); shiftOut (dataPin, clockPin, MSBFIRST, тысячи); digitalWrite (latchPin, HIGH); digitalWrite (9, ВЫСОКИЙ); задержка (5);
На этом закончен полный код. Большая часть объяснений функций дается в разделе комментариев к коду, рядом со строкой кода. Частота часов будет определять вид времени и качество мультиплексирования, то есть, если используются низкие часы, то можно увидеть мерцание, где, как если бы тактовая частота высока, такого мерцания не будет, и можно увидеть устойчивое время.
Обратите внимание, что для доступа к модулю RTC необходимо поддерживать напряжение на шине I2C. Чтобы дать какое-либо предложение или если у вас есть какие-либо сомнения, оставьте комментарий ниже
Step 1: Understand the Logic
I am using the DS3231 library to extract data from RTC module through I2C. The only problem I have faced is the number of GPIO’s. If we use seven segment display directly we will be requiring 36 GPIOs but we have only 20 GPIOs. To avoid this we will be taking advantage of persistence of vision of human eye. If any image is displayed too rapidly, our brain averages the image and makes it a complete one. So, to achieve this we need to short all corresponding anodes of seven segments (i.e. short all a to a, b to b and so on till g to g) and connect them to a gpio pin of microcontroller as shown in schematics. Use cathode of each segment as a chip select signal. Now if we want to display a number 1234, select segment first by providing logic low to its cathode and providing logic high to other remaining cathodes. Provide corresponding signals to anodes for displaying the particular number for some milliseconds. Repeat this process for other segment and put this in an iteration, thus continuous four digit number will be displayed if seen from bare eyes.Thus, by doing this we have reduced the number of GPIOs to 19 from 36.
Here, I have provided video which is shot in slow motion (960 fps) where we could able to understand its working in slow motion.
Step 2: Study the Circuit
I have used 16MHz crystal oscillator for providing clock signals to microcontroller ATmega328p. The reset pin is pulled high through a 10K resistor to avoid false reset. Four push button switches (SPST) are connected to corresponding GPIOs through the pull up resistors of 10k ohm each. Seven segment displays are interfaced as discussed earlier, also shown in schematics diagram. Each anode of seven segment display is connected in series with a 220 ohm resistor to limit current less than 20mA. The cathodes of each seven segment display are connected to separate GPIO of microcontroller. RTC module is interfaced through I2C, the corresponding SDA and SCL pins are connected to SDA and SCL of microcontroller. RTC module is provided with the same 5V supply through the micro USB cable. The buzzer is connected directly to a GPIO of microcontroller as it does not requires that much current (< 45mA).
Download the schematic in PDF format provided below.
Introduction: DIY Digital Clock Using ATmega328p, RTC DS3231 and Seven Segment Displays
By skurzekar1999Follow
About: Electronics enthusiast
More About skurzekar1999 »
Introduction: This is an user friendly tiny digital table clock where user can access all basic functions of clocks including setting alarms, viewing temperature, viewing date, setting date and time, etc. It has a buzzer for alarm and four push buttons (Menu, Left, Right, Cancel) for user interaction. It can be powered by a standard micro USB cable.
Its user interface is very simple. User can enter menu and then change the clock parameters (time, date, month, year, alarm, etc). The alarm parameters are stored in EEPROM of ATmega 328p so it dosen’t forget alarm even if the power cuts. Each and every part of clock is detachable as shown in figure. It also comes with serial UART interface headers for any future firmware upgrade.
ATmega328p provides 20 GPIOs (14 digital and 6 analog) but as we are using seven segment displays we will be requiring 28 (7*4) pins only for seven segment display alone. To avoid this issue we will be taking advantage of persistence of vision of human eye which I will discuss in later section.
Что необходимо
- компьютер с установленной Arduino IDE;
- плата Arduino;
- микросхема DS1307 или модуль RTC на ее основе;
- перемычки;
- макетная плата;
- комплектующие из списка элементов.
Вы можете заменить плату Arduino на контроллер Atmel, но убедитесь, что у него достаточно входных и выходных выводов и есть аппаратная реализация интерфейса I2C. Я использую ATMega168A-PU. Если вы будете использовать отдельный микроконтроллер, то вам понадобится программатор, например, AVR MKII ISP.
Предполагается, что читатель знаком с макетированием, программированием в Arduino IDE и имеет некоторые знания языка программирования C. Обе программы, приведенные ниже, не нуждаются в дополнительном разъяснении.
Модуль часов реального времени DS3231
Внешний вид данного модуля представлен на следующем рисунке.
Модуль предназначен для хранения времени и даты даже когда общее питание схемы выключено – для этой цели в его состав входит элемент питания CR2032. В состав модуля DS3231 входит также датчик температуры, поэтому его можно использовать в различных встраиваемых устройствах, например, в цифровых часах с индикатором температуры и т.д. Модуль работает по интерфейсу I2C. На нашем сайте вы можете посмотреть следующие проекты с использованием данного модуля:
- автоматический напоминатель приема лекарств на Arduino;
- автоматическая кормушка для животных на Arduino;
- логгер данных (температуры, влажности) на SD карту и компьютер с помощью Arduino.
Назначение контактов (распиновка) модуля DS3231 приведена в следующей таблице.
Наименование контакта | Назначение контакта |
VCC | напряжение питания |
GND | общий провод (земля) |
SDA | контакт последовательной передачи данных (I2C) |
SCL | контакт синхронизации (тактирования) (I2C) |
SQW | выход прямоугольного сигнала (программируемый меандр) |
32K | выход меандра с частотой 32.768кГц |
Теперь перейдем непосредственно к схеме нашего проекта.