• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

esp8266 + RTC

DarkBeard

New member
Друзья!

Я поменял кучу модулей, библиотек, нашел только одно рабочее сочетание, но оно как сферический конь в вакууме - работает только в примере, в моем скетче вызывает падение системы.

Поделитесь опытом эксплуатации Часов в ESP!
 

IvanKurtti

New member
Друзья!

Я поменял кучу модулей, библиотек, нашел только одно рабочее сочетание, но оно как сферический конь в вакууме - работает только в примере, в моем скетче вызывает падение системы.

Поделитесь опытом эксплуатации Часов в ESP!
Да вроде не было проблем (пробовал 1302, 1307 и 3231).
Библиотеки конечно надо правильные подбирать.
Подключал по IIC, не забывай про подтяжку.
И главный пенёк в питании, резервного питания от 3В не будет хотя RTC работает без проблем.

Сам на ESP отказался от RTC в пользу NTP (всё равно в сети).

P.S. чуть не забыл (давно было) был затык в первоначальной настройке RTC, а потом уже модуль переставлял без проблем.
 
Последнее редактирование:

enjoynering

Well-known member
от себя добавлю о корявости софтовой реализации I2C протокола для arduino esp8266. особенно мне вот это момент нравится - после стопа посылать 10 раз непойми чего (в стандарте об этом ни слова)
Код:
  if(sendStop) twi_write_stop();
  i = 0;
  while(SDA_READ() == 0 && (i++) < 10){
    SCL_LOW();
    twi_delay(twi_dcount);
    SCL_HIGH();
    twi_delay(twi_dcount);
  }
  return 0;
находится сие по адресу, в функции "twi_writeTo". там еще много таких граблей. пожоже на I2C протокол для esp8266, авторы забили болт. может найдется специалист по I2C шине и наведет порядок?
 

DarkBeard

New member
В курсе что часы надо один раз инициализировать, а потом не надо?
Юрий, тут все зависит от библиотеки. В той что понравилась мне просто шла проверка на состояние, а в другой что работала, там все нужно делать вручную.
Home · Makuna/Rtc Wiki · GitHub - которая нравилась, но после перезагрузки:
1. Часы проходили не больше 30 секунд
2. не понятно откуда берет мою тайм зону. (я хотел, что бы часы в RTC были по GTM)

GitHub - MajicDesigns/MD_DS1307: DS1307 Real Time Clock Library - та которая работала, но при интеграции в мой скетчь все падает (у меня не одно устройство на шине I2C)
 

DarkBeard

New member
Да вроде не было проблем (пробовал 1302, 1307 и 3231).
Библиотеки конечно надо правильные подбирать.
Подключал по IIC, не забывай про подтяжку.
И главный пенёк в питании, резервного питания от 3В не будет хотя RTC работает без проблем.

Сам на ESP отказался от RTC в пользу NTP (всё равно в сети).

P.S. чуть не забыл (давно было) был затык в первоначальной настройке RTC, а потом уже модуль переставлял без проблем.
В том то и соль, что интернет у модуля есть редко.
Питание давал разное, в основном это батарейки, которые предусмотрены в модулях.
Смотрел питание на ноге микросхемы, оно далеко от минимального.
Специально взял аккумулятор 3.7v и впаял вместо батареи.
Подтяжка к шине есть на всех модулях.
 

enjoynering

Well-known member
поблема тут стандартная - это залипаие в низком сотоянии шины SDA. происходи это из-за того, что стандартная esp-шная wire.h работает не так как должна.
 

DarkBeard

New member
поблема тут стандартная - это залипаие в низком сотоянии шины SDA. происходи это из-за того, что стандартная esp-шная wire.h работает не так как должна.
Но почему только с часами проявляется? Все остальные 3 устройства (датчик температуры, расширитель цифровых выводов и дисплей работают нормально?
 

enjoynering

Well-known member
Потому что он работает от батареи...

Пока на шине один slave, все еще как-то работает, но стоит добавить еще устройств - esp8266 начинает виснуть и перегружаться. Потому что, когда wire.h не корректно завершает чтение, slave вешает SDA на замлю и ждет от мастера SCL чтоб передать оставшийся кусок байта. Либа wire.h об этом ничего не знает т.к. в ней нет нормальной проверки колизий и пытается передать на этот или следующий slave новое сообщение. Но все устройства молчат тк ничего не получают из-за того, что наш slave притянул SDA к земле и ждет завершения своей команды. Либа ничего не получив начинает растягивать SCL. Когда растягивать уже некуда, главный цикл встает колом. Через ~3 секунды, после остановки loop, срабатывает WDT и модуль перегружается. А теперь представим, что наш slave - это часы реального времени с батарейкой. Esp8266 перегрузился, а часы нет и все еще ждут когда модуль закончит с ними чтение, удерживая SDA. Через ~3 секунды опять сработает WDT и модуль снова перезагрузится. Круг замкнулся. Не поможет даже передергивание питания, тк наши часики то с батарейкой.

потом в место того чтоб решить проблему, разработчик впиндюрил этот костыль:
Код:
  if(sendStop) twi_write_stop();
  i = 0;
  while(SDA_READ() == 0 && (i++) < 10){
    SCL_LOW();
    twi_delay(twi_dcount);
    SCL_HIGH();
    twi_delay(twi_dcount);
  }
  return 0;
в надежде, что само рассосется, а оно не захотело. тогда он добавил еще один:
Код:
uint8_t twi_status(){      
    if (SCL_READ()==0)     return I2C_SCL_HELD_LOW;               //SCL held low by another device, no procedure available to recover
    int clockCount = 20;              

    while (SDA_READ()==0 && clockCount>0){                      //if SDA low, read the bits slaves have to sent to a max
        twi_read_bit();               
        if (SCL_READ()==0) return I2C_SCL_HELD_LOW_AFTER_READ;  //I2C bus error. SCL held low beyond slave clock stretch time
    }

    if (SDA_READ()==0)     return I2C_SDA_HELD_LOW;               //I2C bus error. SDA line held low by slave/another_master after n bits.

    if(!twi_write_start()) return I2C_SDA_HELD_LOW_AFTER_INIT;  //line busy. SDA again held low by another device. 2nd master?
    else                   return I2C_OK;                       //all ok
}
и он коряво работает. вот ждем новый.
 
Последнее редактирование:

Walentin

New member
от себя добавлю о корявости софтовой реализации I2C протокола для arduino esp8266. особенно мне вот это момент нравится - после стопа посылать 10 раз непойми чего (в стандарте об этом ни слова)
Код:
  if(sendStop) twi_write_stop();
  i = 0;
  while(SDA_READ() == 0 && (i++) < 10){
    SCL_LOW();
    twi_delay(twi_dcount);
    SCL_HIGH();
    twi_delay(twi_dcount);
  }
  return 0;
находится сие по адресу, в функции "twi_writeTo". там еще много таких граблей. пожоже на I2C протокол для esp8266, авторы забили болт. может найдется специалист по I2C шине и наведет порядок?
Здесь ожидание освобождения шины, как только СДА освободится, выход.
 

enjoynering

Well-known member
я то это понимаю - авторы дергают клок, 10 раз, вычитывая в пустоту непрочтенные куски даных, которые блиотека должна была прочесть и записать в буфер, но из-за свое кривости она этого не сделала.

к тому-же покажите мне дергание клока 10 раз после стопа в официальной документации на i2c шину? докуметация тут если что. так, что это саммый натуральный костыль.

обычно модеаторы очень быстро попровляют в своих ответах/коментариях неправльные посты, но тут они хранят молчание, потому что я прав. у esp8266 огромная проблема с реализацией i2c шины.
 
Последнее редактирование:

bstsoft

Member
@enjoynering
А вы уверены, что все устройства работают по стандарту и на 100% его соблюдают. Например я работаю напрямую с фискальными аппаратами и там пришлось городить такой же огород, чтения данных из аппарата. Он пока все не отдаст не реагирует на то что я ему говорю я не принял. Пришли новые аппараты так косяк в другом месте, я это развел разными таймаутами. Но вычитка осталась. Дурдом. Так что я думаю, автор просто поймал какие то косяки, на каком то оборудовании и обошел это. У всех своя правда.

А вот другое дело, что он не учел другие моменты WD и другое. Есть ли решения сброса порта i2C? На сколько я понял надо к примеру за 2 цикла, не получил ответ от устройства просто сказать не надо данных, сброс всех действий. Я так на COM порту делал. В i2C только въезжаю.

PS.Я сначала взял чужую либу для работы с 3231, но в конце концов пришлось переписать по своему. С датчиками ds18b20 тоже пришлось идти другим путем и проверять crc8.
 

enjoynering

Well-known member
понимете в чем дело - на мегах/stm (где i2c аппаратный) таких проблем нет: после стопа чип перестет слать данные, после старта начинает отправлять, недочитанных кусков нет , а если и есть то они все привильно рассасываются стопами и nack. Но как только возьмеш esp8266 то начинается "адь и израиль".

предпологаю фискальные аппараты отечественнго производства или китай?
 

Ivan.ua

New member
исправленная библиотека - enjoyneering/ESP8266-I2C-Driver
Действительно эта трабла уже достала. Только у меня это выражалось в том что надо было много раз дергать питание пока устройство не "подымится"
Обновил библиотеке, час экспериментов, полет нормальный))))
Спасибо за ссылку.
 

AlexandreVN

Member
Сверху Снизу