Оглавление:

Использование модулей часов реального времени DS1307 и DS3231 с Arduino: 3 шага
Использование модулей часов реального времени DS1307 и DS3231 с Arduino: 3 шага

Видео: Использование модулей часов реального времени DS1307 и DS3231 с Arduino: 3 шага

Видео: Использование модулей часов реального времени DS1307 и DS3231 с Arduino: 3 шага
Видео: Часы реального времени. Уроки Arduino 2024, Ноябрь
Anonim
Использование модулей часов реального времени DS1307 и DS3231 с Arduino
Использование модулей часов реального времени DS1307 и DS3231 с Arduino
Использование модулей часов реального времени DS1307 и DS3231 с Arduino
Использование модулей часов реального времени DS1307 и DS3231 с Arduino

Мы продолжаем получать запросы о том, как использовать модули часов реального времени DS1307 и DS3231 с Arduino из различных источников - так что это первая из двух частей руководства о том, как их использовать. Для этого руководства по Arduino у нас есть два модуля часов реального времени, один из которых основан на Maxim DS1307 (квадратный модуль) и DS3231 (прямоугольный модуль).

Между микросхемами модулей часов реального времени есть два основных отличия: точность отсчета времени. DS1307, используемый в первом модуле, работает очень хорошо, однако внешняя температура может влиять на частоту схемы генератора, который управляет внутренним счетчиком DS1307.

Это может показаться проблемой, однако обычно в результате часы отключаются примерно на пять минут в месяц. DS3231 намного более точен, поскольку у него есть внутренний генератор, на который не влияют внешние факторы - и, следовательно, точность составляет максимум несколько минут в год. Если у вас есть модуль DS1307 - не расстраивайтесь, это по-прежнему отличная плата, и она вам хорошо послужит. Для обоих модулей требуется резервная батарея.

Хорошая идея - купить новую батарею CR2032 и установить ее в модуль. Помимо отслеживания времени и даты, эти модули также имеют небольшую EEPROM, функцию сигнализации (только DS3231) и возможность генерировать прямоугольный сигнал различной частоты - все это будет предметом второго руководства.

Шаг 1: Подключение вашего модуля к Arduino

Оба модуля используют шину I2C, что упрощает подключение.

Сначала вам нужно будет определить, какие контакты на вашей Arduino или совместимых платах используются для шины I2C - они будут известны как SDA (или данные) и SCL (или часы). На Arduino Uno или совместимых платах эти контакты - это A4 и A5 для данных и часов; на Arduino Mega - контакты D20 и D21 для данных и часов; а если вы используете Pro Mini-совместимый, контакты - это A4 и A5. для данных и часов, которые параллельны основным контактам.

Модуль DS1307

Если у вас есть модуль DS1307, вам нужно будет припаять провода к плате или припаять некоторые встроенные контакты заголовка, чтобы вы могли использовать перемычки. Затем подключите выводы SCL и SDA к Arduino, а вывод Vcc - к выводу 5V, а GND - к GND.

Модуль DS3231

Подключить этот модуль очень просто, так как контакты разъема устанавливаются на плату на заводе. Вы можете просто снова подключить перемычки от SCL и SDA к Arduino и снова от контактов Vcc и GND модуля к 5V или 3.3. V и GND вашей платы. Однако они дублируются на другой стороне для пайки собственных проводов. Оба этих модуля имеют необходимые подтягивающие резисторы, поэтому вам не нужно добавлять свои собственные. Как и все устройства, подключенные к шине I2C, постарайтесь свести к минимуму длину проводов SDA и SCL.

Шаг 2: Считывание и запись времени из вашего модуля RTC

После того, как вы подключили модуль RTC. введите и загрузите следующий эскиз. Хотя примечания и функции в эскизе относятся только к DS3231, код также работает с DS1307.

#include "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // Преобразование обычных десятичных чисел в двоично-десятичный байт decToBcd (byte val) {return ((val / 10 * 16) + (val% 10)); } // Преобразование двоично-десятичного числа в обычное десятичное byte bcdToDec (byte val) {return ((val / 16 * 10) + (val% 16)); } void setup () {Wire.begin (); Serial.begin (9600); // здесь устанавливается начальное время: // DS3231 секунды, минуты, часы, день, число, месяц, год // setDS3231time (30, 42, 21, 4, 26, 11, 14); } void setDS3231time (байт-секунда, байтовая минута, байтовый час, байтовый деньOfWeek, байтовый деньOfMonth, байтовый месяц, байтовый год) {// устанавливает данные времени и даты в DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // устанавливаем следующий ввод для начала в регистре секунд Wire.write (decToBcd (second)); // устанавливаем секунды Wire.write (decToBcd (minute)); // устанавливаем минуты Wire.write (decToBcd (hour)); // устанавливаем часы Wire.write (decToBcd (dayOfWeek)); // устанавливаем день недели (1 = воскресенье, 7 = суббота) Wire.write (decToBcd (dayOfMonth)); // устанавливаем дату (от 1 до 31) Wire.write (decToBcd (month)); // установить месяц Wire.write (decToBcd (год)); // установить год (от 0 до 99) Wire.endTransmission (); } void readDS3231time (байт * секунда, байт * минута, байт * час, байт * dayOfWeek, байт * dayOfMonth, байт * месяц, байт * год) {Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // устанавливаем указатель регистра DS3231 на 00h Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); // запрашиваем семь байтов данных от DS3231, начиная с регистра 00h * second = bcdToDec (Wire.read () & 0x7f); * минута = bcdToDec (Wire.read ()); * час = bcdToDec (Wire.read () & 0x3f); * dayOfWeek = bcdToDec (Wire.read ()); * dayOfMonth = bcdToDec (Wire.read ()); * месяц = bcdToDec (Wire.read ()); * год = bcdToDec (Wire.read ()); } void displayTime () {байтовая секунда, минута, час, день недели, день месяца, месяц, год; // получение данных из DS3231 readDS3231time (& секунда, & минута, & час, & dayOfWeek, & dayOfMonth, & month, & year); // отправляем его на серийный монитор Serial.print (час, DEC); // преобразование байтовой переменной в десятичное число при отображении Serial.print (":"); если (минута <10) {Serial.print ("0"); } Serial.print (минута, DEC); Serial.print (":"); если (второй <10) {Serial.print ("0"); } Serial.print (второй, DEC); Serial.print (""); Serial.print (dayOfMonth, DEC); Serial.print ("/"); Serial.print (месяц, DEC); Serial.print ("/"); Serial.print (год, DEC); Serial.print ("День недели:"); переключатель (dayOfWeek) {случай 1: Serial.println ("Воскресенье"); перерыв; случай 2: Serial.println («Понедельник»); перерыв; случай 3: Serial.println («вторник»); перерыв; случай 4: Serial.println («среда»); перерыв; случай 5: Serial.println («четверг»); перерыв; случай 6: Serial.println («Пятница»); перерыв; case 7: Serial.println («суббота»); перерыв; }} недействительный цикл () {displayTime (); // отображаем данные часов реального времени на последовательном мониторе, delay (1000); // каждую секунду }

Кода может быть много, но он хорошо разбивается на управляемые части.

Сначала он включает библиотеку Wire, которая используется для связи по шине I2C, а затем определяет адрес шины для RTC как 0x68. За ними следуют две функции, которые преобразуют десятичные числа в двоично-десятичный код (двоично-десятичный код) и наоборот. Это необходимо, поскольку микросхемы RTC работают в двоично-десятичном формате, а не в десятичном.

Функция setDS3231time () используется для установки часов. Использовать его очень просто, просто вставьте значения от года до секунды, и RTC запустится с этого времени. Например, если вы хотите установить следующие дату и время - среда, 26 ноября 2014 г., 21:42 и 30 секунд - вы должны использовать:

setDS3231time (30, 42, 21, 4, 26, 11, 14);

Шаг 3:

Обратите внимание, что время установлено в 24-часовом формате, а четвертый параметр - «день недели». Это значение находится между 1 и 7, то есть с воскресенья по субботу соответственно. Эти параметры представляют собой байтовые значения, если вы подставляете свои собственные переменные.

После того, как вы запустите функцию, разумно добавить к ней префикс // и снова загрузить код, чтобы время не сбрасывалось после выключения питания или сброса микроконтроллера. Считывание времени из вашего RTC Так же просто, фактически за процессом можно аккуратно проследить внутри функции displayTime (). Вам нужно будет определить семь байтовых переменных для хранения данных из RTC, и затем они будут вставлены в функцию readDS3231time (). Например, если ваши переменные:

байт-секунда, минута, час, день недели, день месяца, месяц, год;

… Вы бы обновили их текущими данными из RTC, используя:

readDS3232time (& секунда, & минута, & час, & dayOfWeek, & dayOfMonth, & month, & year);

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

Просто чтобы проверить, что все работает, введите подходящее время и дату в демонстрационный скетч, загрузите его, закомментируйте функцию setDS3231time () и загрузите ее снова. Затем откройте монитор последовательного порта, и вы должны увидеть текущее время и дату.

С этого момента у вас есть программные инструменты для установки и получения данных из модуля часов реального времени, и мы надеемся, что вы понимаете, как использовать эти недорогие модули.

Вы можете узнать больше о конкретных ИС часов реального времени на сайте производителя - DS1307 и DS3231.

Этот пост предоставлен pmdway.com - все для производителей и любителей электроники с бесплатной доставкой по всему миру.

Рекомендуемые: