Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

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

Тема в разделе "Раздел для начинающих", создана пользователем Cadil, 27 июн 2018.

  1. Cadil

    Cadil Новичок

    Сообщения:
    156
    Симпатии:
    2
    Сначала несколько слов о источнике этой проблемы. Собрал схему: 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?

     
    Последнее редактирование: 27 июн 2018
  2. Юрий Ботов

    Юрий Ботов Moderator Команда форума

    Сообщения:
    1.050
    Симпатии:
    175
    посмотрите внимательно на 3 и 8 строки
     
  3. Cadil

    Cadil Новичок

    Сообщения:
    156
    Симпатии:
    2
    Да, я видел это несоответствие, когда открывал новую тему.
    Если записать 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 строка), но я не знаю как.
     
    Последнее редактирование: 28 июн 2018
  4. Cadil

    Cadil Новичок

    Сообщения:
    156
    Симпатии:
    2
    Нашел пример, в котором описан мой случай. Редактор при компиляции примера выводит похожую ошибку:
    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!
     
    Последнее редактирование: 28 июн 2018
  5. Алексей.

    Алексей. Авторитетный участник сообщества

    Сообщения:
    534
    Симпатии:
    62
    Cadil, Как ни странно но почему то у меня работает нодамсу на том коде который закомментированн в вашем примере
    Код (C):
    1.  
    2. #include <Wire.h>
    3. #include <RtcDS3231.h>
    4. #define RTC_SDA 2   // D4  gpio2
    5. #define RTC_SCL 0   // D3  gpio0
    6. RtcDS3231<TwoWire> _rtc(Wire);
    7. void setup() {
    8.   Wire.begin(RTC_SDA, RTC_SCL);
    9.  
    ардуина 1.8.5
    есп коре 2.4.1
    rtc by Makuna 2.0.2
     
    Cadil нравится это.
  6. Cadil

    Cadil Новичок

    Сообщения:
    156
    Симпатии:
    2
    Сильный ход! Успехов!

    У меня заработал следующий вариант Вашего решения:
    Код (C):
    1. #include <Wire.h>
    2. #include <RtcDS3231.h>
    3. #define RTC_SDA 2   // D4  gpio2
    4. #define RTC_SCL 0   // D3  gpio0
    5. //RtcDS3231<TwoWire> _rtc(Wire);
    6. RtcDS3231<TwoWire> rtcObject(Wire);
    7.  
    8. void setup() {
    9.   Wire.begin(RTC_SDA, RTC_SCL);
    10. ....
     

Поделиться этой страницей