• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Node MCU v3 esp 12e не видит часы реального времени

osintaras

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

osintaras

New member
Код можно взять любой из любой библиотеки.
Ну к примеру вот этот 2017-12-27_16-15-02.png из библиотеки RTC by Makuna.
Вот монитор порта 2017-12-27_16-17-57.png
Если отключить RTC модуль - все тоже самое, те же нереальные данные по времени.
Та же история с любым скетчем.
 

gerkimuyda

New member
Сканер i2c устройств:
Код:
#include <Wire.h>
#include <Arduino.h>
long speed[] = { 50, 100, 200, 250, 400, 500, 800 };
const int speeds = sizeof(speed)/sizeof(speed[0]);
#define RESTORE_LATENCY  5 
bool delayFlag = false;
bool printAll = true;
bool header = true;
enum states { STOP, ONCE, CONT, HELP };
states state = STOP;
uint32_t startScan;
uint32_t stopScan;
void setup()  {
  Serial.begin(115200);
  Wire.begin();
  displayHelp();
}
void loop() {
  switch (getCommand()) {
    case 's':  state = ONCE; break;
    case 'c':  state = CONT; break;
    case 'd':  delayFlag = !delayFlag; Serial.print(F("<delay=")); Serial.println(delayFlag?F("5>"):F("0>")); break;
    case 'e':  break;
    case 'h':  header = !header; Serial.print(F("<header=")); Serial.println(header?F("yes>"):F("no>")); break;
    case '?':  state = HELP; break;
    case 'p':  printAll = !printAll; Serial.print(F("<print=")); Serial.println(printAll?F("all>"):F("found>")); break;
    case 'q':  state = HELP; break;
     default: break;
   }
  switch(state) {
    case ONCE: I2Cscan(); state = HELP; break;
    case CONT: I2Cscan(); delay(1000); break; 
    case HELP: displayHelp(); state = STOP; break;
    case STOP: break;
      default: break;
   }
}
char getCommand() {
  char c = '\0';
  if (Serial.available()) { c = Serial.read(); }
  return c;
}
void displayHelp() {
  Serial.println(F("\nArduino I2C Scanner - 0.1.03\n"));
  Serial.println(F("\ts = single scan"));
  Serial.println(F("\tc = continuous scan - 1 second delay"));
  Serial.println(F("\tq = quit continuous scan"));
  Serial.println(F("\td = toggle latency delay between successful tests."));
  Serial.println(F("\tp = toggle printAll - printFound."));
  Serial.println(F("\th = toggle header - noHeader."));
  Serial.println(F("\t? = help - this page"));
  Serial.println();
}
void I2Cscan() {
  startScan = millis();
  uint8_t count = 0;
  if (header) { Serial.print(F("TIME\tDEC\tHEX\t"));
    for (uint8_t s = 0; s < speeds; s++) {
      Serial.print(F("\t"));
      Serial.print(speed[s]);
     }
    Serial.println(F("\t[KHz]"));
    for (uint8_t s = 0; s < speeds + 5; s++) { Serial.print(F("--------")); }
    Serial.println();
   }
  for (uint8_t address = 8; address < 120; address++) {
    bool printLine = printAll;
    bool found[speeds];
    bool fnd = false;
    for (uint8_t s = 0; s < speeds ; s++) {
      Wire.beginTransmission (address);
      found[s] = (Wire.endTransmission () == 0);
      fnd |= found[s];
      if (fnd && delayFlag) delay(RESTORE_LATENCY);    // give device 5 millis
     }
    if (fnd) count++;
    printLine |= fnd;
    if (printLine) {
      Serial.print(millis());      Serial.print(F("\t"));
      Serial.print(address, DEC);  Serial.print(F("\t0x"));
      Serial.print(address, HEX);  Serial.print(F("\t"));
      for (uint8_t s = 0; s < speeds ; s++) { Serial.print(F("\t")); Serial.print(found[s]? F("V"):F(".")); }
      Serial.println();
     }
   }
  stopScan = millis();
  if (header) {
    Serial.println();
    Serial.print(count);
    Serial.print(F(" devices found in "));
    Serial.print(stopScan - startScan);
    Serial.println(F(" milliseconds."));
   }
}
 

osintaras

New member
Спасибо, друзья!
@gerkimuyda
Сканер i2c устройств:
0 devices found in 294 milliseconds.

@AndrF
Все прекрасно работает. Ножки - какие угодно. Библиотечку использую эту.
Не могли бы Вы написать конкретный пример подключения - какие контакты к каким ногам и скетч. А то судя по сканеру у меня в принципе ничего не видно.
 

AndrF

Active member
Ни в одной схеме не видел резисторов на ногах датчика... И к ардуино подключаю без резисторов и работает.
Скорей всего в этом и дело - резисторы подтяжки для линий шины I2C должны быть обязательно (4,7k к 3,3V). Там, куда вы ранее подключали, они, скорей всего уже стояли на плате Arduino. Потому у вас все и работало.
 

CodeNameHawk

Moderator
Команда форума

AndrF

Active member
Батарейку поставить не забыли?
Батарейка, в отличии от резисторов, все же не является обязательной.

Ну в чип я предпочитаю DS3231 - он термостабилизированный, так что часы заметно меньше убегают - гораздо реже можно делать синхронизацию.
 

CodeNameHawk

Moderator
Команда форума
Батарейка, в отличии от резисторов, все же не является обязательной.
Является или сама батарейка или необходимо подать питание на ногу, куда подключается батарейка.
 
Последнее редактирование:

osintaras

New member
Странно куда вы смотрели. DS1307 - Поиск в Google
В китайском модуле часов они стоят, а если сами собираете, резисторы нужны.
Батарейку поставить не забыли?
Так у меня и есть китайский модуль часов!
Батарейку поставил, но и без нее устройство должно было определиться.
Скорей всего в этом и дело - резисторы подтяжки для линий шины I2C должны быть обязательно (4,7k к 3,3V). Там, куда вы ранее подключали, они, скорей всего уже стояли на плате Arduino. Потому у вас все и работало.
К обоим контактам i2c дать 3.3 вольт через резистор? и почему 3.3, ведь DS1307 ест только 5 вольт?
 

osintaras

New member
Подтянул к обоим контактам 5 вольт через 10к резисторы (другие только на 1 к) - та же картина.
 

enjoynering

Well-known member
Первое - это резисторы подтяжки на 4.7кОм. Если используете готовый китайский RTC шилд, то там в 99% эти резисторы уже стоят.

Второе - стандартный I2C драйвер для esp8266 очень глючный. Советую воспользоваться этим - GitHub - enjoyneering/ESP8266-I2C-Driver: Bug fixes of native Arduino ESP8266 core I2C Driver
 

osintaras

New member
Первое - это резисторы подтяжки на 4.7кОм. Если используете готовый китайский RTC шилд, то там в 99% эти резисторы уже стоят.

Второе - стандартный I2C драйвер для esp8266 очень глючный. Советую воспользоваться этим - GitHub - enjoyneering/ESP8266-I2C-Driver: Bug fixes of native Arduino ESP8266 core I2C Driver
Спасибо за ответ! Заменил драйвер. Теперь время выдается не такое экзотическое, но все равно сканер i2c устройств не обнаруживает часы.

Но проблема решилась! Взял 5v с другой ардуины и все заработало (и со старыми с новыми драйверами i2c)! При этом землю оставил на node mcu. Видимо тока не хватает на node mcu для питания часов. Вероятно его не хватит и для питания других устройств. Не работал кардридер. Попробовал его подключить к выводу 5v или 3.3Vв на другой ардуине, оставив землю на node mcu - не заработало... Устройство вовсе не запускается...
 
Последнее редактирование:

osintaras

New member
Кардридер тоже заработал. Заменил sd-карту и кардридер заработал :)
 

AndrF

Active member
Является или сама батарейка или необходимо подать питание на ногу, куда подключается батарейка.
Не нужно на той ноге никакого питания, если есть основное. Я без батареек обычно отладку делаю, так что все давно и не раз проверено на практике.
 

CodeNameHawk

Moderator
Команда форума
Для начала прочитайте даташит, тогда не будете вводить в заблуждение других.
"Если Vcc падает ниже 1.25 * VBAT, DS1307 прерывает процесс доступа и сбрасывает счётчик адреса, причем в это время внешние сигналы не воспринимаются (чтобы предотвратить запись ошибочных данных)."
То, что какой то модуль у вас заработал без питания, ничего не меняет, мне попался такой, который без питания(на ноге VBAT) не работает. В некоторых модулях DS1307 стоит резисторный делитель, такой модуль работает без батарейки.
 

Вложения

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

AndrF

Active member
Честно говоря, старинные DS1307 я вообще не использовал. На фиг они нужны, если давно есть термостабилизированные DS3231? Все что были у меня прекрасно работают при неподключенной Vбат.
 

enjoynering

Well-known member
А смысл их без батареи использовать? Это как иметь бензопилу и пилить ей вручную.
 
Сверху Снизу