Подключение 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;
}
Результативность и отклик традиционно проверяем в мониторе последовательного порта.На этом все! До новых встреч!
Сегодня поговорим о том, как воплотить в жизнь подключение FPM10A к Arduino, что это за модуль, где используется, каковы параметры его работы и т.д. Речь идет...
В статье вы познакомитесь с механизмом подключения часов реального времени DS1307 к Arduino. Этот модуль для обзора мы выбрали не случайно – он популярен,...
Сегодня говорим о том, как подключить модуль ZS-042 к Arduino. Такая периферия востребована во многих современных проектах, где есть необходимость учета...
В новом информационном обзоре рассматриваем GSM модуль SIM800L к Arduino. Почему выбрано именно это устройство? Во-первых, оно достаточно известно и популярно...
Для подключения RTC часов DS1302 понадобится немного вашего времени и терпения. В результате вы получите отличную хронометрическую систему для отслеживания и...