• Система автоматизации с открытым исходным кодом на базе 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
Сверху Снизу