Часы реального времени — модуль, который хранит текущую дату и не сбрасывает её при отключении питания благодаря встроенной батарейке. Вы могли слышать о часах на основе чипа DS1307. Этот чип отличается крайне низкой точностью хода часов. Отставание на один час в сутки — это слишком. Рекомендую использовать модуль на основе высокоточного чипа DS3231, который снабжён термометром для корректирования хода часов в зависимости от температуры. Точность хода часов этого чипа находится на уровне хороших наручных часов и составляет 2ppm при температуре окружающей среды 0°-40°. При этом, модуль совместим со всеми библиотеками, написанными для модуля на основе чипа DS1307. Статья рассказывает о подключении модуля к Arduino и взаимодействии с ними с помощью библиотеки Time. Купить такой модуль у проверенного мной продавца вы можете здесь.
Подключение часов реального времени
Часы подключаются по протоколу I2C всего двумя проводами. Необходимо дополнительно подтянуть выводы, к которым подключаются часы к рельсе питания с помощью резисторов 2 КОм. Выводы часов выглядят так:
Выводы 32К и SQW можно игнорировать. Их назначение не рассматривается в этой статье. SCL и SDA — это выводы интерфейса I2C. Их и нужно подключать к контроллеру. VCC и GND — +5 В и земля соответственно.
SCL и SDA на разных платах расположены на разных выводах:
Uno, Nano | A4 (SDA), A5 (SCL) |
Mega2560 | 20 (SDA), 21 (SCL) |
Leonardo | 2 (SDA), 3 (SCL) |
Вывод SDA часов подключается к выводу SDA контроллера. SDL часов, соответственно, к SDL контроллера. После подключения проводов, должна получиться такая картина:
Работать с модулем часов реального времени удобней всего с помощью библиотеки. Наиболее удобная в этом плане, так и называется: Time (англ. время).
Библиотека является «обёрткой» для другой популярной библиотеки для работы с модулем часов: DS1307RTC. Несмотря на то, что библиотека разработана для чипа DS1307, она прекрасно работает и с DS3231, так как протоколы взаимодействия совместимы.
Скачайте обе библиотеки.
С официального сайта:
Time: http://www.pjrc.com/teensy/td_libs_Time.html
DS1307RTC: http://www.pjrc.com/teensy/td_libs_DS1307RTC.html
После скачивания, поместите содержимое архивов в папку libraries, которая находится в папке со средой разработки Arduino. Запустите среду Arduino IDE и откройте стандартный пример библиотеки: Примеры->Time->TimeRTC
Или просто скопируйте этот код:
#include <Time.h> #include <Wire.h> #include <DS1307RTC.h> void setup() { Serial.begin(9600); while (!Serial) ; // wait until Arduino Serial Monitor opens setSyncProvider(RTC.get); // the function to get the time from the RTC if(timeStatus()!= timeSet) Serial.println("Unable to sync with the RTC"); else Serial.println("RTC has set the system time"); } void loop() { if (timeStatus() == timeSet) { digitalClockDisplay(); } else { Serial.println("The time has not been set. Please run the Time"); Serial.println("TimeRTCSet example, or DS1307RTC SetTime example."); Serial.println(); delay(4000); } delay(1000); } void digitalClockDisplay(){ // digital clock display of the time Serial.print(hour()); printDigits(minute()); printDigits(second()); Serial.print(" "); Serial.print(day()); Serial.print(" "); Serial.print(month()); Serial.print(" "); Serial.print(year()); Serial.println(); } void printDigits(int digits){ // utility function for digital clock display: prints preceding colon and leading 0 Serial.print(":"); if(digits < 10) Serial.print('0'); Serial.print(digits); }
После загрузки скетча в плату запустите монитор порта (Сервис->монитор порта). Вы увидите сообщения от библиотеки. Отображаемое время будет неверным, либо библиотека вовсе пожалуется на не настроенные часы. Для настройки часов загрузите в плату пример из библиотеки DS1307RTC «SetTime» (Примеры->DS1307RTC->SetTime). Загрузите этот пример в плату. После загрузки часы окажутся настроенными на время компиляции скетча. Задержка между компиляцией и полной загрузкой составит совсем немного, чего окажется достаточно для точно настроенных часов. Но если вы отключите и заново подключите питание платы, даже через несколько часов, время в часах всё равно будет заново установлено на время компиляции и окажется неверным. Поэтому, используйте этот пример только для настройки, после настройки отключите часы или загрузите в плату другой скетч.
Если вы не можете или не хотите использовать этот пример, загрузите в плату такой код:
//Подключаем библиотеки: #include #include #include void setup() { setSyncProvider(RTC.get); //Устанавливаем время в формате: //Часы, минуты, секунды, день, месяц, год setTime(12,10,0,18,5,2016); //Применяем: RTC.set(now()); } void loop() { delay(100); }
Указанный пример установит часы на 12:10:00 18 мая 2016 года. Измените соответствующую строку для правильной установки времени.
Более подробно о работе с библиотекой можно узнать на сайте автора библиотеки.
Напоминаю, модуль часов реального времени у проверенного продавца вы можете заказать здесь. Полный список товаров, которые я заказал и протестировал здесь.