Модуль реального времени не работает с Node MCU v3 esp 12e

Тема в разделе "ESP8266, ESP32", создана пользователем Тарас Осин, 27 дек 2017.

  1. Приветствую однополчан!
    Играюсь с Node MCU v3 esp 12e и в одном проекте возникла необходимость подключить к нему часы реального времени. Приобрел модуль RTC DS1307.
    По мануалу i2c-ноги у Node MCU это D1(GPIO5) и D2(GPIO4). Ну я и подключаю к ним.
    Ни одна библиотека эти часы не видит. Ни один скетч - ничего.
    И wire (ом) переназначал ноги, и питание давал от другой платы - ничего не помогает.
    Подключил часы к ардуино уно китайцу - часы работают.
    Обратно на еспешку кидаю - не видны.
    Может кто сталкивался?
     
  2. NikitOS

    NikitOS Король шутов Администратор

    Ни кода, ничего...
     
  3. Код можно взять любой из любой библиотеки.
    Ну к примеру вот этот https://yadi.sk/i/NH9QvDyM3R2P3K из библиотеки RTC by Makuna. Стоит его выкладывать? - много букв будет в сообщении.
    Вот монитор порта https://yadi.sk/i/FIzX_dD23R2PN4
    Если отключить RTC модуль - все тоже самое, те же нереальные данные по времени.
    Та же история с любым скетчем.
     
  4. NikitOS

    NikitOS Король шутов Администратор

    ну у меня сих библиотек нет.... а чтобы вставить код вставляете его в теги кода, а теги кода в теги спойлера
     
  5. Код (C++):

    // CONNECTIONS:
    // DS1307 SDA --> SDA
    // DS1307 SCL --> SCL
    // DS1307 VCC --> 5v
    // DS1307 GND --> GND

    #define countof(a) (sizeof(a) / sizeof(a[0]))

    /* for software wire use below
    #include <SoftwareWire.h>  // must be included here so that Arduino library object file references work
    #include <RtcDS1307.h>

    SoftwareWire myWire(SDA, SCL);
    RtcDS1307<SoftwareWire> Rtc(myWire);
    for software wire use above */



    /* for normal hardware wire use below */
    #include <Wire.h> // must be included here so that Arduino library object file references work
    #include <RtcDS1307.h>
    RtcDS1307<TwoWire> Rtc(Wire);
    /* for normal hardware wire use above */


    const char data[] = "what time is it";

    void setup ()
    {
        Wire.begin(4,5);
        Serial.begin(115200);

        Serial.print("compiled: ");
        Serial.print(__DATE__);
        Serial.println(__TIME__);

        //--------RTC SETUP ------------
        // if you are using ESP-01 then uncomment the line below to reset the pins to
        // the available pins for SDA, SCL
        // Wire.begin(0, 2); // due to limited pins, use pin 0 and 2 for SDA, SCL
     
        Rtc.Begin();

        RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
        printDateTime(compiled);
        Serial.println();

        if (!Rtc.IsDateTimeValid())
        {
            Serial.println("RTC lost confidence in the DateTime!");
            Rtc.SetDateTime(compiled);
        }

        if (!Rtc.GetIsRunning())
        {
            Serial.println("RTC was not actively running, starting now");
            Rtc.SetIsRunning(true);
        }

        RtcDateTime now = Rtc.GetDateTime();
        if (now < compiled)
        {
            Serial.println("RTC is older than compile time!  (Updating DateTime)");
            Rtc.SetDateTime(compiled);
        }

        // never assume the Rtc was last configured by you, so
        // just clear them to your needed state
        Rtc.SetSquareWavePin(DS1307SquareWaveOut_Low);

    /* comment out on a second run to see that the info is stored long term */
        // Store something in memory on the RTC
        Rtc.SetMemory(0, 13);
        uint8_t written = Rtc.SetMemory(13, (const uint8_t*)data, sizeof(data) - 1); // remove the null terminator strings add
        Rtc.SetMemory(1, written);
    /* end of comment out section */
    }

    void loop ()
    {
        if (!Rtc.IsDateTimeValid())
        {
            // Common Cuases:
            //    1) the battery on the device is low or even missing and the power line was disconnected
            Serial.println("RTC lost confidence in the DateTime!");
        }

        RtcDateTime now = Rtc.GetDateTime();

        printDateTime(now);
        Serial.println();

        delay(5000);

        // read data

        // get the offset we stored our data from address zero
        uint8_t address = Rtc.GetMemory(0);
        if (address != 13)
        {
            Serial.println("address didn't match");
        }
        else
        {
            // get the size of the data from address 1
            uint8_t count = Rtc.GetMemory(1);
            uint8_t buff[20];

            // get our data from the address with the given size
            uint8_t gotten = Rtc.GetMemory(address, buff, count);

            if (gotten != count ||
                count != sizeof(data) - 1) // remove the extra null terminator strings add
            {
                Serial.print("something didn't match, count = ");
                Serial.print(count, DEC);
                Serial.print(", gotten = ");
                Serial.print(gotten, DEC);
                Serial.println();
            }
            Serial.print("data read (");
            Serial.print(gotten);
            Serial.print(") = \"");
            while (gotten > 0)
            {
                Serial.print((char)buff[count - gotten]);
                gotten--;
            }
            Serial.println("\"");
        }

     
        delay(5000);
    }



    void printDateTime(const RtcDateTime& dt)
    {
        char datestring[20];

        snprintf_P(datestring,
                countof(datestring),
                PSTR("%02u/%02u/%04u %02u:%02u:%02u"),
                dt.Month(),
                dt.Day(),
                dt.Year(),
                dt.Hour(),
                dt.Minute(),
                dt.Second() );
        Serial.print(datestring);
    }
     
     
  6. NikitOS

    NikitOS Король шутов Администратор

    Код (C++):
    // CONNECTIONS:
    // DS1307 SDA --> SDA
    // DS1307 SCL --> SCL
    // DS1307 VCC --> 5v
    // DS1307 GND --> GND

    #define countof(a) (sizeof(a) / sizeof(a[0]))

    // for software wire use below
    #include <SoftwareWire.h>  // must be included here so that Arduino library object file references work
    #include <RtcDS1307.h>

    SoftwareWire myWire(D1, D2);
    RtcDS1307<SoftwareWire> Rtc(myWire);


    /* for normal hardware wire use below
    #include <Wire.h> // must be included here so that Arduino library object file references work
    #include <RtcDS1307.h>
    RtcDS1307<TwoWire> Rtc(Wire);
    for normal hardware wire use above */



    const char data[] = "what time is it";

    void setup ()
    {
        myWire.begin(4,5);
        Serial.begin(115200);

        Serial.print("compiled: ");
        Serial.print(__DATE__);
        Serial.println(__TIME__);

        //--------RTC SETUP ------------
        // if you are using ESP-01 then uncomment the line below to reset the pins to
        // the available pins for SDA, SCL
        // Wire.begin(0, 2); // due to limited pins, use pin 0 and 2 for SDA, SCL
     
        Rtc.Begin();

        RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
        printDateTime(compiled);
        Serial.println();

        if (!Rtc.IsDateTimeValid())
        {
            Serial.println("RTC lost confidence in the DateTime!");
            Rtc.SetDateTime(compiled);
        }

        if (!Rtc.GetIsRunning())
        {
            Serial.println("RTC was not actively running, starting now");
            Rtc.SetIsRunning(true);
        }

        RtcDateTime now = Rtc.GetDateTime();
        if (now < compiled)
        {
            Serial.println("RTC is older than compile time!  (Updating DateTime)");
            Rtc.SetDateTime(compiled);
        }

        // never assume the Rtc was last configured by you, so
        // just clear them to your needed state
        Rtc.SetSquareWavePin(DS1307SquareWaveOut_Low);

    /* comment out on a second run to see that the info is stored long term */
        // Store something in memory on the RTC
        Rtc.SetMemory(0, 13);
        uint8_t written = Rtc.SetMemory(13, (const uint8_t*)data, sizeof(data) - 1); // remove the null terminator strings add
        Rtc.SetMemory(1, written);
    /* end of comment out section */
    }

    void loop ()
    {
        if (!Rtc.IsDateTimeValid())
        {
            // Common Cuases:
            //    1) the battery on the device is low or even missing and the power line was disconnected
            Serial.println("RTC lost confidence in the DateTime!");
        }

        RtcDateTime now = Rtc.GetDateTime();

        printDateTime(now);
        Serial.println();

        delay(5000);

        // read data

        // get the offset we stored our data from address zero
        uint8_t address = Rtc.GetMemory(0);
        if (address != 13)
        {
            Serial.println("address didn't match");
        }
        else
        {
            // get the size of the data from address 1
            uint8_t count = Rtc.GetMemory(1);
            uint8_t buff[20];

            // get our data from the address with the given size
            uint8_t gotten = Rtc.GetMemory(address, buff, count);

            if (gotten != count ||
                count != sizeof(data) - 1) // remove the extra null terminator strings add
            {
                Serial.print("something didn't match, count = ");
                Serial.print(count, DEC);
                Serial.print(", gotten = ");
                Serial.print(gotten, DEC);
                Serial.println();
            }
            Serial.print("data read (");
            Serial.print(gotten);
            Serial.print(") = \"");
            while (gotten > 0)
            {
                Serial.print((char)buff[count - gotten]);
                gotten--;
            }
            Serial.println("\"");
        }

     
        delay(5000);
    }



    void printDateTime(const RtcDateTime& dt)
    {
        char datestring[20];

        snprintf_P(datestring,
                countof(datestring),
                PSTR("%02u/%02u/%04u %02u:%02u:%02u"),
                dt.Month(),
                dt.Day(),
                dt.Year(),
                dt.Hour(),
                dt.Minute(),
                dt.Second() );
        Serial.print(datestring);
    }
     
     
  7. Выдает ошибку:

    ну и еще пару подобных ошибок.

    Если строку myWire.begin(4,5); закомментировать, выдает лишь одну ошибку
     
  8. NikitOS

    NikitOS Король шутов Администратор

    :confused::confused:
     
  9. alp69

    alp69 Форумчанин

    А Вы уверены, что 5 вольтовые часы будут нормально общаться с 3 вольтовыми gpio ESP?
    И еще. Если не сильны в английском - используйте гуглопереводчик. В сообщении об ошибке указана строка ошибки и ее причина.
     
    Последнее редактирование: 25 янв 2018
  10. newartem

    newartem Нуб

    Рекомендую отказаться от этой библиотеки и работать через wire.h
    И да, 5 вольт. я для этого случая базу под nodeMCU поставил, там есть 5 вольт
    Только отписался в теме "Гля чаво". Код туда пришпилю наверное не раньше понедельника