Подключение DS3231 к NodeMCU (ESP8266)

В этой статье расскажу, как подключить часы реального времени DS3231 к плате NodeMCU (ESP8266-12E) и LCD1602. Для отслеживания времени будем использовать часы реального времени DS3231 (RTC), полученные данные будем отображать на LCD дисплей с использованию NodeMCU в качестве микроконтроллера.
Необходимые детали:
► Контроллер NodeMCU v.2 (ESP8266) x 1 шт.
► Провода DuPont, 2,54 мм, 20 см x 1 шт.
► LCD-дисплей 1602A
► Часы реального времени RTC DS3231
Подключение
Подробно о часах реального времени можно посмотреть в этой статье DS3231, так же есть статья о модуле LCD1602 и NodeMCU v.2. Ниже приведена схема подключения модуля DS3231 к плате NodeMCU (ESP8266) и LCD1602. Подключение очень просто, оба модуля DS3231 и LCD1602 работают по интерфейсу I2C, таким образом нам нужно всего два контакта для подключения. Подключаем вывод SDA с DS3231 и LCD1602 к выводу D2 NodeMCU и подключаем SCL с DS3231 и LCD1602 к выводу D1 NodeMCU. Напряжение 5В для модуля DS331 и LCD1602 берем с вывода Vin NodeMCU. Так же, можно использовать напряжение питания 3.3В, для модуля DS3231.

Установка библиотеки
Для этого примера, необходимо скачать и установить две библиотеки «LiquidCrystal_I2C» и «DS3231». Самый простой способ, это воспользоваться «Управление библиотеками…» в среде разработке Arduino IDE.

Затем в поле поиска набираем первую библиотеку «RTClib» и устанавливаем.

Теперь вводим « LiquidCrystal_I2C″ и так же устанавливаем ее.

Если у кого не получиться, библиотеки можно скачать в конце статьи.
Программа:
После сборки и установки библиотек, можно запускать среду разработки Arduino IDE. Первом делом, необходимо установить поддержку NodeMCU в среде разработке Arduino IDE, как это сделать можно посмотреть в этом обзоре . Теперь, когда все готово, скачиваем или копируем скетч и загружаем его в NodeMCU.
#include "Wire.h" // Подключаем библиотеку Wire
#include "RTClib.h" // Подключаем библиотеку RTClib
#include <LiquidCrystal_I2C.h> // Подключаем библиотеку LiquidCrystal_I2C
LiquidCrystal_I2C lcd(0x3F,16,2); // Задаем адрес и размер дисплея
RTC_DS3231 rtc; // Создаем объект rtc
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
void setup()
{
Serial.begin(9600); // Инициализация Serial Port
Serial.println("Serial OK"); // Отправка текста в Serial Port
Wire.begin(4, 5); // Выводы интерфейса I2C ESP8266
lcd.init(); // Инициализация lcd
lcd.backlight(); // Включаем подсветку
// Автоматическая установка времени при загрузке скетча
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// Ручная установка времени
// rtc.adjust(DateTime(2020, 03, 13, 14, 0, 0));
}
void loop() {
DateTime now = rtc.now();
Serial.print("now DateTime: "); // Отправка текста в Serial Port
Serial.print(now.year(), DEC); // Отправка в Serial Port год
Serial.print('/'); // Отправка текста в Serial Port
Serial.print(now.month(), DEC); // Отправка в Serial Port месяц
Serial.print('/'); // Отправка текста в Serial Port
Serial.print(now.day(), DEC); // Отправка в Serial Port дня
Serial.print(' '); // Отправка текста в Serial Port
Serial.print(now.hour(), DEC); // Отправка в Serial Port час
Serial.print(':'); // Отправка текста в Serial Port
Serial.print(now.minute(), DEC); // Отправка в Serial Port минуты
Serial.print(':'); // Отправка текста в Serial Port
Serial.print(now.second(), DEC); // Отправка в Serial Port секунды
Serial.print(" DOW: "); // Отправка текста в Serial Port
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]); // Отправка в Serial Port день недели
Serial.print(" - Temp: "); // Отправка текста в Serial Port
Serial.print(rtc.getTemperature()); // Отправка в Serial Port температуру
Serial.println(); // Новая строка
delay(1000);
lcd.clear(); // Очистка дисплея
lcd.setCursor(0, 0); // Устанавливаем курсор на 0 строку, ячейка 0
lcd.print("Date: "); // Выводим текст на LCD
lcd.setCursor(0, 1); // Устанавливаем курсор на 1 строку, ячейка 0
lcd.print("Time: "); // Выводим текст на LCD
lcd.setCursor(6, 0); // Устанавливаем курсор на 0 строку, ячейка 6
lcd.print(now.year(), DEC); // Отправка даты на LCD
lcd.print(":"); // Выводим текст на LCD
lcd.print(now.month(), DEC); // Отправка даты на LCD
lcd.print(":"); // Выводим текст на LCD
lcd.print(now.day(), DEC); // Отправка даты на LCD
lcd.setCursor(6, 1); // Устанавливаем курсор на 1 строку, ячейка 6
lcd.print(now.hour(), DEC); // Отправка времени на LCD
lcd.print(":"); // Выводим текст на LCD
lcd.print(now.minute(), DEC); // Отправка времени на LCD
lcd.print(":"); // Выводим текст на LCD
lcd.print(now.second(), DEC); // Отправка времени на LCD
}
Открыв мониторинг порта, можно увидеть данные. Описание скетча, можно посмотреть в комментариях.

Вот и все, пишите.
Ссылки
Скачать библиотеку RTClib v.1.4.0
Скачать библиотеку OneWire v.2.2
Скачать библиотеку LiquidCrystal_I2C
Драйвер CP2102
Купить на Aliexpress
Плата NodeMCU V2
Провода DuPont, 2,54 мм, 20 см
LCD-дисплей 1602A + I2C
Часы реального времени RTC DS3231
Купить в Самаре и области
Плата NodeMCU V2
Провода DuPont, 2,54 мм, 20 см
LCD-дисплей 1602A
Часы реального времени RTC DS3231

Доброго Времени суток) как не парадокс звучит, скажите а осуществимо подружить ESP, DS3231,lcd1602 таким образом, чтобы время синхронизировалось с NTP сервером? а при потерии соединения wi-fi часики шли от Ds3231? Очень признателен буду.
Павел здравствуйте. Тоже интересуюсь данным вопросом. Скажите у вас получилось?
А разве объект rtc не надо инициализировать в setup, как у вас без этого заработало?