Подключение часов DS3231 к Arduino
Модуль часов реального времени
DS3231 к Arduino Uno и Nano: SDA на A4, SCL на A5, питание 5 В (микросхема работает от 2,3 до 5,5 В).
Схема подключения часов DS3231 к Arduino
| DS3231 | Arduino Uno |
|---|---|
| SCL | A5 |
| SDA | A4 |
| VCC | 5V |
| GND | GND |
Схема из примера «Arduino Uno: часы реального времени».
Выводы DS3231
| Вывод | Назначение |
|---|---|
| SCL | тактовая линия I2C |
| SDA | линия данных I2C |
| SQW | выход меандра или сигнал будильника (прерывание); для часов не нужен |
| VCC | питание 3,3–5 В |
| GND | общий провод |
Код для Arduino
#include <Wire.h>
#include <RTClib.h>
// Часы DS3231 на шине I2C — у Uno это A4 и A5.
//
// Зачем отдельная микросхема, когда есть millis(). millis() считает от
// включения платы: после сброса он снова ноль, а после отключения
// питания плата не знает даже, какой сегодня год. DS3231 держит время
// сама, от батарейки, годами — и уходит примерно на минуту в год
// против нескольких минут в сутки у самодельного счётчика на кварце.
//
// Установка времени идёт один раз. Строка __DATE__ и __TIME__ — это
// момент СБОРКИ скетча, а не текущее время: после первой прошивки
// строку с adjust полагается закомментировать, иначе каждая заливка
// будет откатывать часы на момент компиляции.
RTC_DS3231 rtc;
void setup() {
Serial.begin(9600);
if (!rtc.begin()) {
Serial.println(F("часы не отозвались: проверьте A4 и A5"));
return;
}
// Только при первой прошивке или после замены батарейки.
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
Serial.println(F("время выставлено по моменту сборки"));
}
}
void loop() {
DateTime now = rtc.now();
// Ведущие нули руками: библиотека печатает 9, а часам нужно 09.
Serial.print(now.hour());
Serial.print(':');
if (now.minute() < 10) Serial.print('0');
Serial.print(now.minute());
Serial.print(':');
if (now.second() < 10) Serial.print('0');
Serial.print(now.second());
Serial.print(F(" температура: "));
Serial.println(rtc.getTemperature(), 1);
delay(1000);
}
Скетч можно править и запускать в симуляторе без платы и установки среды.
Что учесть на Arduino
- Адрес 0x68. Если на шине ещё MPU6050, адрес одного из двух меняют.
- Время в часы записывают один раз,
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))), и потом строку убирают: иначе после каждой перезагрузки время откатывается ко времени компиляции.
В железе
На популярном модуле ZS-042 стоит цепь зарядки батарейки (резистор 200 Ом и диод). Для обычной CR2032 это вредно: её нельзя заряжать. Либо выпаивают резистор, либо ставят аккумулятор LIR2032.
Частые ошибки при подключении к Arduino
- Вызывать
rtc.adjust()в каждомsetup(): после сброса платы часы показывают время сборки скетча. - Перепутать A4 и A5: библиотека не находит часы и сообщает, что RTC не обнаружены.
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)))в каждомsetup()— часы при каждом старте сбрасываются на время сборки. Устанавливайте время один раз или по флагуrtc.lostPower().- Тот же адрес 0x68, что у MPU6050: два таких модуля на одной шине конфликтуют. У MPU6050 переключите адрес на 0x69 (вывод AD0 к питанию).
- Обычная CR2032 на модуле с зарядкой — батарейка вздувается.
- Время хранится без часового пояса: храните UTC и переводите при выводе, иначе переход на летнее время (где он есть) ломает расчёты.
Ещё по теме
Другие детали для Arduino
HC-SR04DHT22 (AM2302)BME280SSD1306 OLED 0,96″LCD 1602 с I2CMAX7219TM1637Модуль релеKY-040Клавиатура 4×4HX711ФоторезисторМодуль microSDRGB-светодиодСервопривод SG9074HC595Шаговый двигательКнопкаПотенциометрПьезопищалкаСветодиодПолзунковый переключательHC-SR501TTP223Датчик влажности почвыMQ-2LM35Джойстик KY-023DHT11HTU21D