Часы на модуль tiny rtc i2c. Tiny RTC I2C Modules – часы, точный генератор, микросхема памяти. Микросхема долговременной памяти

Часы на модуль tiny rtc i2c. Tiny RTC I2C Modules – часы, точный генератор, микросхема памяти. Микросхема долговременной памяти

09.03.2023

Часы реального времени - модуль, который хранит текущую дату и не сбрасывает её при отключении питания благодаря встроенной батарейке. Вы могли слышать о часах на основе чипа 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, так как протоколы взаимодействия совместимы.

Скачайте обе библиотеки.

После скачивания, поместите содержимое архивов в папку libraries, которая находится в папке со средой разработки Arduino. Запустите среду Arduino IDE и откройте стандартный пример библиотеки: Примеры->Time->TimeRTC
Или просто скопируйте этот код:

#include #include #include 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); }

#include

#include

#include

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). Загрузите этот пример в плату. После загрузки часы окажутся настроенными на время компиляции скетча . Задержка между компиляцией и полной загрузкой составит совсем немного, чего окажется достаточно для точно настроенных часов. Но если вы отключите и заново подключите питание платы, даже через несколько часов, время в часах всё равно будет заново установлено на время компиляции и окажется неверным. Поэтому, используйте этот пример только для настройки, после настройки отключите часы или загрузите в плату другой скетч.

DS1307 это небольшой модуль, предназначенный для подсчета времени. Собранный на базе микросхемы DS1307ZN с реализацией питания от литиевой батарейки (LIR2032), что позволяет работать автономно в течение длительного времени. Также на модуле, установлена энергонезависимая память EEPROM объемом 32 Кбайт (AT24C32). Микросхема AT24C32 и DS1307ZN связаны обшей шиной интерфейсом I2C.

Технические параметры

Напряжение питания: 5В
Рабочая температура: – 40℃ … + 85℃
Память: 56 байт (энергонезависимая)
Батарейка: LIR2032 (автоматическое определение источника питания)
Интерфейса: I2C
Габариты: 28мм х 25мм х 8 мм

Общие сведения

Использовании модуля DS1307 зачастую очень оправдано, например, когда данные считываются редко, интервалом более недели, использовать собственные ресурсы контроллера, неоправданно или невозможно. Обеспечивание бесперебойное питание, например платы Arduino, на длительный срок дорого, даже при использовании батареи.
Благодаря собственной памяти и автономностью, можно регистрировать события, (при автономном питании) например изменение температуры и так далее, данные сохраняются в памяти их можно считать из памяти модуля. Так что модуль DS1307 часто используют, когда контроллерам Arduino необходимо знать точное время, для запуска какого то события и так далее.

Обмен данными с другими устройствами осуществляется по интерфейсу I2C с выводов SCL и SDA. Конденсаторы С1 и С2 необходимы для снижения помех по линию питания. Чтобы обеспечить надлежащего уровня сигналов SCL и SDA установлены резисторы R2 и R3 (подтянуты к питанию). Для проверки работоспособности модуля, на вывод 7 микросхему DS1307Z, подается сигнал SQ, прямоугольной формы с частотой 1 Гц. Элементы R4, R5, R6, VD1 необходимы для подзарядку литиевой батарейки. Так же, на плате предусмотрено посадочное место (U1), для установки датчика температуры DS18B20 (при необходимости можно впаять его), считывать показания, можно с вывода DS, который подтянут к пиатнию, через резистор R1 сопротивлением 3.3 кОм. Принципиальную схему и назначение контактов можно посмотреть на рисунках ниже.

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

Первая группа контактов:
DS: вывод DS18B20 (1-wire)


VCC: «+» питание модуля
GND: «-» питание модуля

Вторая группа контактов:
SQ: вход 1 МГц
DS: вывод DS18B20 (1-wire)
SCL: линия тактирования (Serial CLock)
SDA: линия данных (Serial Dфta)
VCC: «+» питание модуля
GND:«-» питание модуля
BAT:

Подзарядка батареи
Как описывал ваше модуль может заряжать батарею, реализовано это, с помощью компонентов R4, R5, R6 и диода D1. Но, данная схема имеет недостаток, через резистор R4 и R6 происходит разряд батареи (как подметил пользователь ALEXEY, совсем не большой). Так как модуль потребляем незначительный ток, можно удалить цепь питания, для этого убираем R4, R5, R6 и VD1, вместо R6 поставим перемычку (после удаления компонентов, можно использовать обычную батарейку CR2032).

Подключение DS1307 к Arduino

Необходимые детали:
Arduino UNO R3 x 1 шт.
Провод DuPont, 2,54 мм, 20 см x 1 шт.
Кабель USB 2.0 A-B x 1 шт.
Часы реального времени RTC DS1307 x 1 шт.

Подключение:
Для подключения часы реального времени DS1307, необходимо впаять впаять штыревые разъемы в первую группу контактов. Далее, подключаем провода SCL (DS1307) к выводу 4 (Arduino UNO) и SDA (DS1307) к выводу 5 (Arduino UNO), осталось подключить питания VCC к +5V и GND к GND. Кстати, в различных платах Arduino вывода интерфейса I2C отличаются, назначение каждого можно посмотреть ниже.

Установка времени DS1307
Первым делом, необходимо скачать и установить библиотеку «DS1307RTC» и «TimeLib» в среду разработки IDE Arduino, далее необходимо настроить время, открываем пример из библиотеки DS1307RTC «Файл» —> «Примеры» —> «DS1307RTC» —> «SetTime» или копируем код снизу.

// Подключаем библиотеку DS1307RTC const char *monthName = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; tmElements_t tm; void setup() { bool parse=false; bool config=false; // get the date and time the compiler was run if (getDate(__DATE__) && getTime(__TIME__)) { parse = true; // and configure the RTC with this info if (RTC.write(tm)) { config = true; } } Serial.begin(9600); while (!Serial) ; // wait for Arduino Serial Monitor delay(200); if (parse && config) { Serial.print("DS1307 configured Time="); Serial.print(__TIME__); Serial.print(", Date="); Serial.println(__DATE__); } else if (parse) { Serial.println("DS1307 Communication Error:-{"); Serial.println("Please check your circuitry"); } else { Serial.print("Could not parse info from the compiler, Time=\""); Serial.print(__TIME__); Serial.print("\", Date=\""); Serial.print(__DATE__); Serial.println("\""); } } void loop() { } bool getTime(const char *str) { int Hour, Min, Sec; if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false; tm.Hour = Hour; tm.Minute = Min; tm.Second = Sec; return true; } bool getDate(const char *str) { char Month; int Day, Year; uint8_t monthIndex; if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false; for (monthIndex = 0; monthIndex < 12; monthIndex++) { if (strcmp(Month, monthName) == 0) break; } if (monthIndex >= 12) return false; tm.Day = Day; tm.Month = monthIndex + 1; tm.Year = CalendarYrToTm(Year); return true; }

Загружаем данную скетч в контроллер Arduino (время берется с ОС), открываем «Мониторинг порта»

Программа
В библиотеке есть еще один пример, открыть его можно DS1307RTC «Файл» —> «Примеры» —> «DS1307RTC» —> «ReadTest»

/* Тестирование производилось на Arduino IDE 1.6.12 Дата тестирования 23.11.2016г. */ #include // Подключаем библиотеку Wire #include // Подключаем библиотеку TimeLib #include // Подключаем библиотеку DS1307RTC void setup() { Serial.begin(9600); // Устанавливаем скорость передачи данных while (!Serial) ; // Ожидаем подключение последовательного порта. Нужно только для Leonardo delay(200); // Ждем 200 мкс Serial.println("DS1307RTC Read Test"); // Выводим данные на последовательный порт Serial.println("-------------------"); // Выводим данные на последовательный порт } void loop() { tmElements_t tm; if (RTC.read(tm)) { Serial.print("Ok, Time = "); print2digits(tm.Hour); Serial.write(":"); print2digits(tm.Minute); Serial.write(":"); print2digits(tm.Second); Serial.print(", Date (D/M/Y) = "); Serial.print(tm.Day); Serial.write("/"); Serial.print(tm.Month); Serial.write("/"); Serial.print(tmYearToCalendar(tm.Year)); Serial.println(); } else { if (RTC.chipPresent()) { Serial.println("The DS1307 is stopped. Please run the SetTime"); Serial.println("example to initialize the time and begin running."); Serial.println(); } else { Serial.println("DS1307 read error! Please check the circuitry."); Serial.println(); } delay(9000); } delay(1000); } void print2digits(int number) { if (number >= 0 && number < 10) { Serial.write("0"); } Serial.print(number); }

Загружаем данную код в контроллер Arduino, открываем «Мониторинг порта»

Все, что вам нужно сделать, так это сконфигурировать RTC-чип в соответствии с текущей датой и временем … и сегодняшний проект поможет вам это сделать!

Проект

RTCSetup состоит из двух элементов:

  • графический интерфейс пользователя (GUI), написанный на языке C# и запущенный на ПК
  • скетч, запущенный на Arduino, к которому подключен модуль RTC

Графический интерфейс пользователя и скетч соединены по последовательному интерфейсу с помощью несложного протокола. Исходный код для них доступен в моем хранилище данных Github.

Arduino и часы реального времени

Для связи с чипом DS1307 я выбрал библиотеку RTClib хранилища Adafruit. Данный чип наиболее часто используется в модулях RTC энтузиастами со всего мира. Соединение между ИС и Arduino устанавливается с помощью шины I2 C :

На рисунке показано соединение, организованное с помощью “новых” выводов I2C платы Arduino Uno; естественно вы можете использовать выводы A4 и A5.

Скетч Arduino получает команды от ПК, выполняет их и посылает назад ответный сигнал.

Протокол

Как я указал ранее, для связи между графическим интерфейсом пользователя и Arduino используется несложный протокол, созданный с помощью только 4-х команд :

Команда: ##

Первая команда, отправленная после установления соединения, используется ПК для подтверждения “совместимости” модуля, подключенного к последовательному порту. Arduino должен ответить командой "!! "

Команда: ? V

Данная команда используется для получения версии скетча. Arduino отвечает строковым параметром, определенным как константа в начале скетча :

#define VERSION "1.0"

Команда: ? T

Данная команда, используемая для получения фактической даты и времени, считывается из модуля RTC. Плата Arduino отвечает строковым параметром в формате: dd/ MM/ yyyy hh: mm: ss .

Команда: ! TddMMyyyyhhmmss

Данная команда используется для установки времени RTC. Arduino отвечает командой "OK" .

Графический интерфейс пользователя (GUI)

Графический интерфейс пользователя, разработанный на C#, общается с Arduino по вышеуказанному протоколу и выполняет три функции:

  • устанавливает текущую дату и время
  • устанавливает требуемую дату и время, которые определяет пользователь
  • получает и отображает фактическую дату и время модуля RTC.

Сначала вам необходимо выбрать последовательный порт Arduino для установки соединения и нажать кнопку CONNECT. Если соединение установлено (команды ## и?V), тогда в строке состояния будет отображаться версия скетча.

В первом окне будет показано фактическое время ПК . После нажатия правой кнопки мыши (на красной стрелке) вы сможете сконфигурировать модуль RTC с данным временем:

С помощью кнопки с зеленой стрелкой вы сможете получить фактическое время, хранимое в модуле RTC:

И, наконец, с помощью выпадающего списка даты в центре, вы сможете выбрать требуемое значение даты и времени, и затем отправить эти значения в модуль RTC:

Технические данные

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

Сегодня мы попробуем с помощью библиотеки HAL поработать с шиной I2C .

Заранее определимся, что по данной шине мы подключим микросхему часов реального времени DS3231 .

Сначала немного поговорим о самой шине I2C.

По данной шине я очень много рассказывал в серии частей по МК AVR , поэтому здесь будем знакомиться более коротко, чтобы не повторяться.

Шина I2C — это шина, управляемая по двум проводам и по определённому протоколу.

Первый провод — SDA (Serial DAta)) , а второй — SCL (Serial CLock) . Данные в основном передаются по проводу SDA. Второй провод в основном для тактирования,

Передача всегда начинается с формирования ведущим устройством условия СТАРТ на данной шине. Оно формируется формированием отрицательного фронта на шине SDA, а затем отрицательного фронта на шине SCL

В конце любой полной посылки генерируеся условие СТОП , которое, наоборот, сначала требует положительного фронта на SCL, а затем на SDA.

На шину I2C можно теоретически навешать до 127 устойств за счёт того, что у каждого устройства существует свой 7-битный адрес, который после условия СТОП Мастер (ведущий) передает в шину. И на этот адрес уже откликается только то SLAVE (ведомое) устройство, адрес которого был передан. После адреса передаётся бит. определяющий каким именно образом мы собираемся общаться с ведомым устройством, то есть читать данные мы с него будем или в него писать. Дальше уже Мастер ждёт подтверждение от ведомого, ведомый должен опустить шину SDA на низкий уровень, и, если это передача, то начинает соответствующим образом данные передавать, а если приём, то принимать.

Как именно и в каком порядке побайтно и побитно осуществляется приём и передача, мы, как правило, смотрим уже в технической документации на устройство, которое мы подключаем. Там могут быть ещё адреса ячеек памяти и регистров, они могут быть 16 и 8 битные и много ещё чего.

Также стоит упомянуть о том, что провода данной шины, можно сказать, висят в воздухе, так как используется открытый коллектор, и их, поэтому, необходимо подтянуть к шине питания через резистор сопротивлением 4,7 — 10 килоом. Также можно это сделать и программно. Причем данного номинала мы должны придерживаться не на каждом устройстве, если их несколько, а на всей шине. То есть, если мы подключили 10 устройств с разными адресами, то подтягивающие резисторы мы оставим только на одном из них, а на остальных придётся их выпаять, чтобы они не параллелились.

Преждем чем перейти именно к разбору микросхемы 3231, мы ещё должны знать, как именно организована шина I2C на нашем контроллере.

Во первых, частота передачи данных или битрейт поддерживается контроллером 100 кГц и 400 кГц. Какую именно выбирать, мы уже решаем исходя из возможностей подключаемого девайза и из наших требований к передаче данных.

Ну и конечно же стоит подчеркнуть, что шина I2C организована само собой у нашего контроллера STM32F4 аппаратно, причём их там несколько.

Вот блок-схема

Здесь мы видим наши провода SDA и SCL, также существуют регистры, которые мы настраиваем для работы, регистр данных, адресный регистр, также регистр двойного адреса, который поддерживает уже 16-битный адрес, два управляющих регистра — CR1 и CR2, регистры статуса — SR1 и SR2, а также регистр, задающий частоту передачи данных или скорость.

Но, так как мы собрались использовать библиотеку HAL, то нам не придется париться по поводу программирования битов данных регистров и когда именно заносить в регистр адреса и данных те самые данные, и данное бремя библиотека HAL обещает взять на себя.

Поэтому нам необходимо и достаточно лишь только знать, какие именно функции нам и как использовать из этой самой библиотеки.

Поэтому откроем руководство пользователя именно библиотеки HAL и найдём необходимые нам функции, все они нам не нужны. Их ведь очень и очень много. Разберём только те, которые мы будем использовать в нашем заниятии. Остальные будем разбирать в других уроках, а может вообще не будем разбирать, а будем только пользоваться.

Тем более нам нет смысла рассматривать функции инициализации и деинициализации, так как этим всем занимается кодогенератор Cube MX и, как показала практика, вполне справляется.

А функции, которые нам потребуются в сегодняшнем занятии, мы разберём по мере их написания в коде.

Теперь, собственно, микросхема DS3231. Данная микросхема — это часы реального времени, разработанные компанией Dallas , как я считаю, являющейся самой распространённой у пользователей подобных микросхем.

Данные часы реального времени работают подобно предшественнику DS1307, только очень сильно усовершенствованы. Кварцевый резонатор уже находится внутри и поэтому мы уже его не припаиваем, также здесь реализована очень хорошая термокомпенсация, поэтому точность данных часов просто удивляет. Хотя и есть здесь ещё регистр для поправки хода, но я им никогда не пользовался, так как и без него микросхема обеспечивает прекрасную точность хода.

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

Ну и так же как и все современные RTC, у данной микросхемы очень хорошо организована энергонезависимость от внешних источников. Для этого есть два контакта для подключения резервной литиевой батареи на 3,7 вольт, которая обеспечивает продолжение хода часов при отключении питания. Малое энергопотребление в режиме питания от баттареи обеспечивается тем, что почти весь фукнционал кроме хода часов не работает.

Скорость обмена данными поддерживается данной микросхемой и 100 кГц и 400 кГц.

Теперь про регистры микросхемы. Это о том, что именно может хранить в себе данная микросхема

Вот их сколько, этих регистров.

00h — секунды. Секунды хранятся в двоично-десятичном виде. То есть в младших 4 битах хранятся единицы секунд, а в более старших трёх — десятки.

01h — минуты. Хранятся аналогично.

02h — более универсальный регистр. Здесь хранятся часы. В четырех младших битах — единицы чаов, в следующих более старших двух — десятки, в следующем 6 бите — флаг того, после полудня сейчас время или до полудня, в 7 бите — режим хранения — 12- часовой или 24-часовой.

03h — день недели. Хранится в младших 3 битах, остальные биты не используются.

04h — здесь хранится день месяца, также в двоично-десятичном формате. В четыреё малдших битах — единицы, в двух следующих постарше — десятки, следующий бит не используется.

05h — номер месяца в году — хранится в двоично-десятичном формате точно также, как и часы. Самый последний бит автоматически установится, когда закончатся последние сутки века и начнётся следующий век. Смех да и только. Я думаю в нём можно хранить единицу, она будет говорить о том что у нас на дворе 21 век.

06h — номер года, причём не полный четырёхзначный, а только двузначный. В младших четырех битах — единицы, в старших — десятки. А какой век подразумевать, можно хранить в 7 бите месяца.

Вот этими семью регистрами мы и будем пользоваться. Дальше идут регистры будильников, а последние два регистра — это температура, измеряемая на термодатчике, который установлен в микросхему. По идее, можно данным регистром воспользоваться, чтобы выводить показания температуры, хотя это и температура микросхемы. Но термокомпенсация так устроена, что если вдруг микросхема начнет греться, то в ней начнут работать технологии, предотвращающие это, и она остынет. Я пробовал считывать данный регистр, и. в принципе это была температура окружающего воздуха.

Также существуют ещё два регистра управления и статусов. В рамках данного занятия мы ими пользоваться не будем, но техническую документацию на микросхему я прикреплю на странице внизу и вы, скачав её, можете почитать и воспользоваться битами данных регистров.

Теперь, собственно, передача данных:

Это передача данных.

Сначала СТАРТ, затем 7-битный адрес, затем 0, который означает, что мы будем писать в данную микросхему, затем бит подтверждение, затем адрес регистра, которые мы рассмотрели только что выше, опять подтверждение, зтем сами данные, причем можно передавать сразу несколько. Подтверждения ждём после каждого переданного байта, а в конце условие СТОП. Так что мы спокойно можем при установке времени, передать сразу байты всех семи регистров, передав перед этим байт самого первого из них, то есть 0x00.

Теперь чтение

Вообще, это документация для самого ведущего устройства, у ведомого немного не так.

Перед тем как воспользоваться этой диаграммой, мы сначала делаем СТАРТ, затем адрес устройства, затем бит записи, именно записи, затем адрес регистра, затем повторный СТАРТ, затем опять адрес устройсва, затем бит чтения или 1, затем уже ждём данные с подтверждениями, а чёрточка над буквой A после последнего принятого байта означает, что мы подтверждения не ждем или ждём условия «Нет подтверждения», то есть шина SDA установится в высокое состояние и в конце СТОП.

Вот так. Конечно библиотека HAL лишит нас удовольствия поиграться с данными алгоритмами приема и передачи, так как она это будет делать сама. Но, я думаю, мы уже наигрались с этим в уроках по AVR и с микросхемой EEPROM и с микросхемой DS1307.

Вот типовая схема подключения данной микросхемы к контроллеру

Здесь мы видим, что восемь ножем соединяются с корпусом, также есть ножки SDA и SCL, ножки питания VCC и GND, RST для перезагрузки микросхемы, мы данной ножкой не пользуемся. Ещё есть ножка для подключения батарейки VBAT, выход SQW для того, чтобы мы могли брать импульсы определенной частоты с данной микросхемы для какой-нибудь синхронизации, мы эту ножку как правила используем для мигания двоеточия. Также частотой на данной ножке можно управлять определенными битами в определенном регистре. А также ещё выход 32 кГц.

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

Адрес у нас получается 0b1101000 . Соответственно, в функциях мы его будем использовать в сдвинутом на 1 бит влево состоянии, то есть сразу с прицепленным нулём. означающим запись, причем в функциях. предназначенных для чтения мы также будем использовать бит 0, а функция там сама всё как надо сдвинет, так уж они устроены, эти функции HAL. То есть адрес у нас будет 0xD0 .

Вот схема подключения (нажмите на картинку для увеличения изображения)

Здесь несколько другая микросхема, но подключение ничем не отличается. Просто не нашел я именно такую микросхему в программе-редакторе электронных схем.

Также ещё скажу, что у меня не просто микросхема, а именно готовый модуль, причем сразу с батарейкой и со всеми выведенными наружу контактами, ссылка на продавца есть под видеоверсией урока в описании.

Модуль выглядит вот так

Точно также как и раньше проект создаем из предыдущего. Новый проект называется MYDS3231

Запускаем его в Cube. Включаем там шину I2C1 вот таким вот образом

Мы также увидим справа в виртуальном контроллере. что у нас появились задействованные ножки портов

Купил я на Aliexpress плату Tiny RTC I2C Modules за 30 рублей.


Очень полезным девайсом оказалась плата Tiny RTC I2C Modules. Как только представлю картину с подключением на макетной плате двух микросхем с обвязкой, то становится немного не по себе от количества ненадежных соединений. Плату Tiny RTC I2C Modules очень удобно использовать для работы с микросхемой ds1307Z часов реального времени с последовательным интерфейсом I2C, микросхемой памяти 24С32 с последовательным интерфейсом I2C, возможностью установить датчик температуры ds18b20. Так же можно получить точные прямоугольные импульсы c 7-го вывода микросхемы ds1307Z, на разъёме он отмечен буквами SQ. На схеме платы Tiny RTC I2C Modules трудно увидеть, что седьмой вывод микросхемы ds1307Z соединен с седьмым контактом разъёма Р1.
Схема платы Tiny RTC I2C Modules:


Перед покупкой я поискал информацию в сети интернет. Узнал, что плата изготовлялась для работы литиевым аккумулятором, который трудно купить. Покупатели платы Tiny RTC I2C Modules устанавливали в плату вместо аккумулятора литиевую батарею, и плата работала неправильно. Микросхема потребляет очень мало энергии, поэтому плату вполне можно использовать с литиевой батареей. Для этого надо выпаять с платы Tiny RTC I2C Modules следующие радиодетали: диод D1, резистор R4, а в место R6 запаять перемычку. Я удалил еще и резистор R7, ознакомившись с типовой схемой включения микросхемы ds1307.


Типовая схема включения микросхемы ds1307:


Подробнее о доработке платы Tiny RTC I2C Modules вы можете узнать из видео, записанного и опубликованного в сети товарищем Алексеем Букреевым.
Даташит на микросхему ds1307:
Я соединил плату Arduino Pro Mini с платой Tiny RTC I2C Modules и плату Arduino Pro Mini с платой USB serial adapter CH340G.




Запускаем код для определения адресов микросхем ds1307 и 24С32. Код опубликован на странице:
http://adatum.ru/skaner-shiny-i2c-dlya-arduino.html
Сам код:
#include String stringOne; void setup() { Wire.begin(); Serial.begin(9600); while (!Serial); } void loop() { byte error, address; int nDevices; Serial.println("Scanning..."); nDevices = 0; for(address = 1; address < 127; address++) { Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { String stringOne = String(address, HEX); Serial.print("0x"); Serial.print(stringOne); Serial.print(" - "); if(stringOne=="0A") Serial.println(""Motor Driver""); if(stringOne=="0F") Serial.println(""Motor Driver""); if(stringOne=="1D") Serial.println(""ADXL345 Input 3-Axis Digital Accelerometer""); if(stringOne=="1E") Serial.println(""HMC5883 3-Axis Digital Compass""); if(stringOne=="5A") Serial.println(""Touch Sensor""); if(stringOne=="5B") Serial.println(""Touch Sensor""); if(stringOne=="5C") Serial.println(""BH1750FVI digital Light Sensor" OR "Touch Sensor"); if(stringOne=="5D") Serial.println(""Touch Sensor""); if(stringOne=="20") Serial.println(""PCF8574 8-Bit I/O Expander" OR "LCM1602 LCD Adapter" "); if(stringOne=="21") Serial.println(""PCF8574 8-Bit I/O Expander""); if(stringOne=="22") Serial.println(""PCF8574 8-Bit I/O Expander""); if(stringOne=="23") Serial.println(""PCF8574 8-Bit I/O Expander" OR "BH1750FVI digital Light Sensor""); if(stringOne=="24") Serial.println(""PCF8574 8-Bit I/O Expander""); if(stringOne=="25") Serial.println(""PCF8574 8-Bit I/O Expander""); if(stringOne=="26") Serial.println(""PCF8574 8-Bit I/O Expander""); if(stringOne=="27") Serial.println(""PCF8574 8-Bit I/O Expander" OR "LCM1602 LCD Adapter ""); if(stringOne=="39") Serial.println(""TSL2561 Ambient Light Sensor""); if(stringOne=="40") Serial.println(""BMP180 barometric pressure sensor""); if(stringOne=="48") Serial.println(""ADS1115 Module 16-Bit""); if(stringOne=="49") Serial.println(""ADS1115 Module 16-Bit" OR "SPI-to-UART""); if(stringOne=="4A") Serial.println(""ADS1115 Module 16-Bit""); if(stringOne=="4B") Serial.println(""ADS1115 Module 16-Bit""); if(stringOne=="50") Serial.println(""AT24C32 EEPROM""); if(stringOne=="53") Serial.println(""ADXL345 Input 3-Axis Digital Accelerometer""); if(stringOne=="68") Serial.println(""DS3231 real-time clock""); if(stringOne=="7A") Serial.println(""LCD OLED 128x64""); if(stringOne=="76") Serial.println(""BMP280 barometric pressure sensor""); if(stringOne=="77") Serial.println(""BMP180 barometric pressure sensor" OR "BMP280 barometric pressure sensor""); if(stringOne=="78") Serial.println(""LCD OLED 128x64""); nDevices++; } else if (error==4) { Serial.print("Unknow error at address 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); } } if (nDevices == 0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); delay(5000); }

После запуска Arduino IDE, выбора модели платы arduino, установки последовательного порта (com31 у меня), а скопировал выше - расположенный код в окно с заменой текста. Запустил компиляцию, при этом Arduino IDE попросит сохранить папку скетча. Нажимаем на сохранение, и Arduino IDE выполнит компиляцию. Запишем программу в плату arduino и в мониторе последовательного порта увидим следующее:


Итак, мы убедились в правильности подключения плат.
Теперь для работы с микросхемой реального времени (ds1307) надо установить библиотеку «Универсальная библиотека iarduino_RTC.zip»
Файл: Универсальная библиотека iarduino_RTC.zip:
После установки библиотеки и перезагрузки Arduino IDE запускаем пример gettime:

© 2024 beasthackerz.ru - Браузеры. Аудио. Жесткий диск. Программы. Локальная сеть. Windows