Приветствую однополчан! Играюсь с Node MCU v3 esp 12e и в одном проекте возникла необходимость подключить к нему часы реального времени. Приобрел модуль RTC DS1307. По мануалу i2c-ноги у Node MCU это D1(GPIO5) и D2(GPIO4). Ну я и подключаю к ним. Ни одна библиотека эти часы не видит. Ни один скетч - ничего. И wire (ом) переназначал ноги, и питание давал от другой платы - ничего не помогает. Подключил часы к ардуино уно китайцу - часы работают. Обратно на еспешку кидаю - не видны. Может кто сталкивался?
Код можно взять любой из любой библиотеки. Ну к примеру вот этот https://yadi.sk/i/NH9QvDyM3R2P3K из библиотеки RTC by Makuna. Стоит его выкладывать? - много букв будет в сообщении. Вот монитор порта https://yadi.sk/i/FIzX_dD23R2PN4 Если отключить RTC модуль - все тоже самое, те же нереальные данные по времени. Та же история с любым скетчем.
ну у меня сих библиотек нет.... а чтобы вставить код вставляете его в теги кода, а теги кода в теги спойлера
Спойлер: Код Код (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); }
Код (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); }
Выдает ошибку: ну и еще пару подобных ошибок. Если строку myWire.begin(4,5); закомментировать, выдает лишь одну ошибку
А Вы уверены, что 5 вольтовые часы будут нормально общаться с 3 вольтовыми gpio ESP? И еще. Если не сильны в английском - используйте гуглопереводчик. В сообщении об ошибке указана строка ошибки и ее причина.
Рекомендую отказаться от этой библиотеки и работать через wire.h И да, 5 вольт. я для этого случая базу под nodeMCU поставил, там есть 5 вольт Только отписался в теме "Гля чаво". Код туда пришпилю наверное не раньше понедельника