• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Часы реального времени DS3231: проблемы с переходом на новые пины в протоколе I2C

Cadil

New member
Сначала несколько слов о источнике этой проблемы. Собрал схему: NodeMCU CP2102, модуль часов реального времени DS3231 и цветной дисплей 1.44' SPI 128*128. Поскольку и часах и в экране для управления используются контакты протокола I2c - D1, D2 CP2102, то для избежания конфликта - переназначил контакты управления экраном, а часы подключил к D1, D2. Скетч в такой форме работает, но криво: для работы схемы приходится по несколько раз запускать модуль NodeMCU CP2102 (снимать/подавать питание).

Решил с помощью библиотеки SoftwareWire.h организовать управление часами с других пинов, а за экраном оставить D1, D2, с которыми модуль экрана работает стабильно.

Воспользовался инструкцией с github :
#include <Wire.h>
#include <RtcDS3231.h>
RtcDS3231<TwoWire> Rtc(Wire);
Если вы хотите использовать библиотеку SoftwareWire, вы можете заменить это и она будет работать.
#include <SoftwareWire.h>
#include <RtcDS3231.h>
SoftwareWire myWire(SDA, SCL); // replace with the pins you use
RtcDS3231<SoftwareWire> Rtc(myWire);


Сделал все по этой инструкции, но при компиляции скетча - ошибка: 'rtcObject' was not declared in this scope в строке: RtcDateTime currentTime = rtcObject.GetDateTime();
Скетч под спойлером:
//#include <Wire.h> //I2C library
//#include <RtcDS3231.h> //RTC library
//RtcDS3231<TwoWire> rtcObject(Wire); //Uncomment for version 2.0.0 of the rtc library

#include <SoftwareWire.h>
#include <RtcDS3231.h>
SoftwareWire myWire(0, 2); // replace with the pins you use
RtcDS3231<SoftwareWire> Rtc(myWire);

void setup() {

Serial.begin(115200); //Starts serial connection
rtcObject.Begin(); //Starts I2C

RtcDateTime currentTime = RtcDateTime(18, 06, 25, 11, 49, 0); //define date and time object
rtcObject.SetDateTime(currentTime); //configure the RTC with object

}

void loop() {

RtcDateTime currentTime = rtcObject.GetDateTime(); //get the time from the RTC

char str[20]; //declare a string as an array of chars

sprintf(str, "%d/%d/%d %d:%d:%d", //%d allows to print an integer to the string
currentTime.Year(), //get year method
currentTime.Month(), //get month method
currentTime.Day(), //get day method
currentTime.Hour(), //get hour method
currentTime.Minute(), //get minute method
currentTime.Second() //get second method
);

Serial.println(str); //print the string to the serial port

delay(5000); //5 seconds delay

}

Как задекларировать в этом скетче rtcObject?

 
Последнее редактирование:

Cadil

New member
посмотрите внимательно на 3 и 8 строки
Да, я видел это несоответствие, когда открывал новую тему.
Если записать 8-ю строку в виде RtcDS3231<SoftwareWire> rtcObject(myWire); то - ошибка компиляции для Node MCU:
D:\Users\VB\Documents\Arduino\libraries\SoftwareWire-master\SoftwareWire.cpp: In constructor 'SoftwareWire::SoftwareWire(uint8_t, uint8_t, boolean, boolean)':
D:\Users\VB\Documents\Arduino\libraries\SoftwareWire-master\SoftwareWire.cpp:132:16: error: cannot convert 'volatile uint32_t* {aka volatile unsigned int*}' to 'volatile uint8_t* {aka volatile unsigned char*}' in assignment ...

По-моему, надо грамотно задать RtcDS3231<TwoWire> (3 строка), но я не знаю как.
 
Последнее редактирование:

Cadil

New member
Нашел пример, в котором описан мой случай. Редактор при компиляции примера выводит похожую ошибку:
error: cast from 'volatile uint8_t* {aka volatile unsigned char*}' to 'uint16_t {aka short unsigned int}' loses precision [-fpermissive]

Решил проверить этот пример для Arduino Pro Mini. Скетч успешно компилируется.

Стал очевидным ответ: библиотека SoftwareWire разработана скорее всего для Arduino и не учитывает каких-то тонкостей работы с ESP8266!
 
Последнее редактирование:

Алексей.

Active member
Cadil, Как ни странно но почему то у меня работает нодамсу на том коде который закомментированн в вашем примере
Код:
#include <Wire.h>
#include <RtcDS3231.h>
#define RTC_SDA 2   // D4  gpio2
#define RTC_SCL 0   // D3  gpio0
RtcDS3231<TwoWire> _rtc(Wire); 
void setup() {
  Wire.begin(RTC_SDA, RTC_SCL);
ардуина 1.8.5
есп коре 2.4.1
rtc by Makuna 2.0.2
 

Cadil

New member
Wire.begin(RTC_SDA, RTC_SCL);
Сильный ход! Успехов!

У меня заработал следующий вариант Вашего решения:
Код:
#include <Wire.h>
#include <RtcDS3231.h>
#define RTC_SDA 2   // D4  gpio2
#define RTC_SCL 0   // D3  gpio0
//RtcDS3231<TwoWire> _rtc(Wire);
RtcDS3231<TwoWire> rtcObject(Wire);

void setup() {
  Wire.begin(RTC_SDA, RTC_SCL);
....
 
Сверху Снизу