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

26-02-2020, 16:19 4 комментариев
Сегодня хотим рассказать вам о том, как происходит подключение DS3231 к Arduino и что это за электронное устройство. Речь идет о модуле часов реального времени, который может выводить точное время и сохранять его даже при отключении питания (т.к. работает от батарейки). Прибор считают автономным не только по этой причине – он имеет внутренний кварц с термостабилизацией, а потому погрешность в цифрах при включении будет минимальна. Микросхема проста в сборке, бюджетна по стоимости, доступна для покупки в любом онлайн-магазине, ну и достаточно функциональна.

Последняя характеристика «намекает» нам на широкое применение датчика в современных проектах, блуждающих по Интернету (конструирование часов, будильников, реконструкция и создание систем сигнализации в «смарт»-технологиях и т.п.).

Для справки: RTC (real time clock, ЧРВ) — схема, предназначенная для учёта таких данных как дата, день недели, время и т.п.); является по сути системой, состоящей из элемента питания (внешнего или встроенного) и учитывающего механизма.

Технические параметры RTC-модуля:
  • напряжение питания: 3,3 или 5 V;
  • точность: ± 0.432 сек ∕ день;
  • поддерживаемый интерфейс: I2C;
  • диапазон рабочих температур −40…+85°C;
  • скорость передачи: -100-400 кГц;
  • интегрирован календарь (до 2100 года);
  • габариты: 38×22×15 мм;
  • вес: около 8 г.
Распиновка выводов:


Теперь попробуем подключить RTC модуль DS3231 к Ардуино. Нам понадобятся такие компоненты: плата расширения UNO, датчик часов, соединительные провода (перемычки), для соединения с ПК USB-кабель.

Для того, чтобы протестировать работоспособность упомянутой схемы, а также с целью установки часов и даты, напишем несложный программный скетч:
#include <Wire.h>

void setup() {
  Wire.begin(); // старт i2c
  Wire.beginTransmission(0x68); // начинаем обмен с DS3231 с i2c адресом 0x68
  byte arr[] = {0x00, 0x02, 0x30, 0x17, 0x03, 0x02, 0x01, 0x19};
  Wire.write(arr, 8); // записываем 8 байтов массива arr
  Wire.endTransmission(); // завершение передачи
}

void loop() {
// здесь не делаем ничего
}
Не забудьте проверить у себя в среде IDE наличие библиотеки Wire – если она отсутствует, обязательно скачайте ее из глобальной сети (Скетч > Добавить библиотеку!)

Для чтения значений температуры на часах зальем иные коды прошивки:
#include <Wire.h>
const byte DS3231 = 0x68; // I2C адрес таймера DS3231

void setup() {
  Wire.begin(); 
  Serial.begin(9600);
}

void loop() {
  Wire.beginTransmission(DS3231); // начинаем обмен с DS3231
  Wire.write(byte(0x00)); // записываем адрес регистра, с которого начинаются данные даты и времени
  Wire.endTransmission(); // завершаем передачу

  byte dateTime[7]; // 7 байтов для хранения даты и времени
  int i = 0; // индекс текущего элемента массива
  Wire.beginTransmission(DS3231); // начинаем обмен с DS3231
  Wire.requestFrom(DS3231, 7); // запрашиваем 7 байтов у DS3231
  while(Wire.available()) // пока есть данные от DS3231
  {
    dateTime[i] = Wire.read(); // читаем 1 байт и сохраняем в массив dateTime
    i+=1; // инкрементируем индекс элемента массива
  }
  Wire.endTransmission(); // завершаем передачу

  printDateTime(dateTime); // выводим дату и время
 
  Wire.beginTransmission(DS3231); // начинаем новый обмен с DS3231
  Wire.write(byte(0x11)); // записываем адрес регистра, с которого начинается температура
  Wire.endTransmission(); // завершаем передачу

  i = 0; // обнуляем счётчик элементов массива
  byte temp[2]; // 2 байта для хранения температуры
  Wire.beginTransmission(DS3231); // начинаем обмен с DS3231
  Wire.requestFrom(DS3231, 2); // запрашиваем 2 байта у DS3231
  while(Wire.available()) 
  {
    temp[i] = Wire.read();
    i+=1;
  }
  Wire.endTransmission();

  printTemp(temp); // выводим температуру
    
  delay(1000); // пауза на 1 сек
}

// выводит дату и время
void printDateTime(byte *dateTime) {
  if (dateTime[4]<10) Serial.print("0"); 
  Serial.print(dateTime[4], HEX); // выводим дату
  Serial.print(".");
  if (dateTime[5]<10) Serial.print("0"); 
  Serial.print(dateTime[5], HEX); // выводим месяц
  Serial.print(".20");
  Serial.print(dateTime[6], HEX); // выводим год
  Serial.print(" ");
  if (dateTime[2]<10) Serial.print("0"); 
  Serial.print(dateTime[2], HEX); // выводим час
  Serial.print(":");
  if (dateTime[1]<10) Serial.print("0"); 
  Serial.print(dateTime[1], HEX); // выводим минуты
  Serial.print(":");
  if (dateTime[0]<10) Serial.print("0"); 
  Serial.print(dateTime[0], HEX); // выводим секунды
}

// выводит температуру
void printTemp(byte *temp) {
  Serial.print("\t"); // символ табуляции для разделения между временем и температурой
  float temperature = getTemp(temp);
  Serial.print(temperature);
  Serial.println("oC"); // градусы Цельсия
}

// преобразует содержимое регистров 0x11 и 0x12 в значение температуры
// для подробностей см. datasheet на ds3231
float getTemp(byte *temp){
  float temperature = temp[0]; // целая часть
  temperature += (temp[1]*0.25/100); // дробная часть
  return temperature;
}
Результативность и отклик традиционно проверяем в мониторе последовательного порта.
На этом все! До новых встреч!
Поделись в социальных сетях:
О авторе
Калугин Антон

Программист микроконтроллеров с 8-ми летним стажем, работал в таких компаниях как IBM, ASUS, Microsoft.

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

Все статьи автора
Похожие новости

Сегодня поговорим о том, как воплотить в жизнь подключение FPM10A к Arduino, что это за модуль, где используется, каковы параметры его работы и т.д. Речь идет...

В статье вы познакомитесь с механизмом подключения часов реального времени DS1307 к Arduino. Этот модуль для обзора мы выбрали не случайно – он популярен,...

Сегодня говорим о том, как подключить модуль ZS-042 к Arduino. Такая периферия востребована во многих современных проектах, где есть необходимость учета...

В новом информационном обзоре рассматриваем GSM модуль SIM800L к Arduino. Почему выбрано именно это устройство? Во-первых, оно достаточно известно и популярно...

Для подключения RTC часов DS1302 понадобится немного вашего времени и терпения. В результате вы получите отличную хронометрическую систему для отслеживания и...

4 комментария
  1. Виктор UA6EM
    18 июня 2022 19:45 Виктор UA6EM

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

    replyОтветить
  2. Виктор UA6EM
    18 июня 2022 19:50 Виктор UA6EM

    По какой причине неверно измеряется температура?
    18.06.2022 19:48:43 255.62oC
    18.06.2022 19:48:44 255.62oC
    18.06.2022 19:48:45 255.62oC
    18.06.2022 19:48:46 255.62oC
    18.06.2022 19:48:47 255.62oC
    18.06.2022 19:48:48 255.62oC
    18.06.2022 19:48:49 255.62oC

    replyОтветить
  3. Виктор UA6EM
    18 июня 2022 19:54 Виктор UA6EM

    вопрос с неправильным отображением снят, оказался сам злобным буратино, модуль оказался на DS1307
    DS3231 все по фэншую )))
    18.06.2022 19:49:20 29.32oC
    18.06.2022 19:49:21 29.32oC
    18.06.2022 19:49:22 29.32oC
    18.06.2022 19:49:24 29.32oC
    18.06.2022 19:49:25 29.32oC
    18.06.2022 19:49:26 29.32oC

    Время не подводил года три на этом модуле )))

    replyОтветить
  4. Евгений
    9 января 2024 14:06 Евгений

    Виктор UA6EM, минусовая температура 255.62-256 = -0,38 С

    replyОтветить
Оставить комментарий