• Система автоматизации с открытым исходным кодом на базе 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);
....
 
Сверху Снизу