WeMosD1R1 зависает в неопределенный момент.

Dimych70
Offline
Зарегистрирован: 03.02.2022

Народ, всем привет.
Есть WeMosD1R1, на ней часы реального времени на DS1307, датчик BMP\BME280, два датчика AHT10 и модуль для SD-карты. Вот такой. Все устройства на I2C кроме модуля SD-карты. Так вот, все вроде бы хорошо. Но как-то в неопределенный момент все зависает. Для отвисания иногда достаточно перезагрузки кнопкой на WeMos, иногда это не помогает, надо вынуть из USB(пока пишу скетч, от USB порта компа питается), иногда это не помогает. Но тогда если SD-карту пошерудить в гнезде модуля вынув из USB, а потом воткнув, запускается. Я по началу думал, чтьо памяти не хватает. Почистил все строковые переменные, стало значительно реже зависать (вроде бы). Да и еще, если после зависания открыть монитор порта, то видно, что не находятся устройства на i2c. В общем пока грешу на AHT10 (может библиотека кривая, уже 2 попробовал, да и сдохло 2 модуля, после чего я перевел их на 3,3 вольта, хотя брал на Али под 5 вольт модули) и на модуль SD-карты. Если решения не найду, попробую другой модуль подключить, у меня есть для полноценной SD-карты, а не для мини как этот.
Народ, может еще на что посоветуете обратить внимание. Скетч большой, в нескольких файлах, пока не решаюсь его выкладывать.

Да иногда она не виснет, но датчики начинаю казать чушь и часы показывают 165:165:85. Т.е. Web интерфейс работает, данные на карту тоже вроде пишутся, а вот все что на i2c просто в ауте!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Dimych70 пишет:

Для отвисания иногда достаточно перезагрузки кнопкой на WeMos, иногда это не помогает, надо вынуть из USB(пока пишу скетч, от USB порта компа питается), иногда это не помогает. Но тогда если SD-карту пошерудить в гнезде модуля вынув из USB, а потом воткнув, запускается.

Симптомы характерные для плохих контактов.

Dimych70
Offline
Зарегистрирован: 03.02.2022

Сначала, когда на макет (брэдборде) было, я так и думал. Но сейчас пришли заказаные мной на JLCPCB платы. Качество надо сказать отменное. И датчики я не этой китайской фигней припаял (провод такой тонкий многоцветный, у которого изоляция от паяльника отходит, но ни хрена не паяются эти провода), а нашим МГТФ-ом. В общем если где теперь и может контакт барахлить, так только в модуле SD-карты. Т.е. сама карта хреново контачит с модулем. Ну я хочу запаять модуль для большой карты, а ту что есть через переходник подключить. Благо их как грязи по всем углам валяется.

bwn
Offline
Зарегистрирован: 25.08.2014

Раз утверждаете, что плохого контакта быть не может, следующий вопрос - у вас датчики или китайские модули с обвязкой? Если модули, то снимали ли лишние подтягивающие резисторы на I2C?

Dimych70
Offline
Зарегистрирован: 03.02.2022

Китайские модули стандартные. На Алиэкспрессе купленые. Подтяжка I2C у меня точно на часах сделана. Этот блок я всегда сам паяю, а там 2 резистора на 10кОм на каждый сигнал. Может их снять надо, т.к. на датчиках они есть? Но правда у меня дома (в квартире) уже с год работает метеостанция с часами. Там тоже часы на DS1307 самодельные, модуль BMP/BME280 на i2c. Не сбит совсем.

bwn
Offline
Зарегистрирован: 25.08.2014

По нормальному можно оставить на 2-3х, при 4к7 это будет ~1,56к, у вас на данный момент их 5, посчитайте сами.

Dimych70
Offline
Зарегистрирован: 03.02.2022

А есть минимальная величина? Максимальная я так понимаю 4,7кОм.

sadman41
Offline
Зарегистрирован: 19.10.2016

Минимальная - это скоко МК сумеет перетянуть на землю, не погорев.

1.8к встречал.

Dimych70
Offline
Зарегистрирован: 03.02.2022

Спасибо! Попробую поэкспериментировать. Мне тут еще на другом форуме библиотеку для AHT10 посоветовали поменять. Тоже поэкспериментирую.

Feofan
Offline
Зарегистрирован: 28.05.2017

Dimych70 пишет:

А есть минимальная величина? Максимальная я так понимаю 4,7кОм.

Влияние номинала подтягивающих резисторов на сигнал шины I2C

Texas Instruments Incorporated I2C Bus Pullup Resistor Calculation

Dimych70
Offline
Зарегистрирован: 03.02.2022

Сейчас поковырялся в схемах и устройствах. https://elchupanibrei.livejournal.com/53764.html Вот это мои датчики. Как-то странно. На схемах значатся 4,7кОм, а сборка резисторная стоит на 4 по 10кОм. 103 это ведь 10кОм? Я не ошибаюсь. Ну и даже черт с ними. На часх у меня стоят по 10кОм. (когда-то давно такую схему часов нашел и всегда так делаю). Если на остальных 3 датчиках по 4,7, то общее сопротивление 6кЩь получается. Если я не ошибаюсь. Или я не о том?

b707
Offline
Зарегистрирован: 26.05.2017

Dimych70 пишет:

Если на остальных 3 датчиках по 4,7, то общее сопротивление 6кЩь получается. Если я не ошибаюсь. Или я не о том?

если хотя бы один из параллельных резисторов 4.7 - общее уже никак не может быть 6 :)

Dimych70
Offline
Зарегистрирован: 03.02.2022

Не, не так. Ошибочка. Ща посчитаю правильно.

1,35кОм получилось.

А если убрать мои 10кОм с часов, то получится как раз 1,56 кОм. Ну чтож, попробую сегодня-завтра.

bwn
Offline
Зарегистрирован: 25.08.2014

Да не надо расчеты воспринимать буквально. Оставьте там где сдуть тяжело, на одном-двух и попробуйте.

Dimych70
Offline
Зарегистрирован: 03.02.2022

Таки с AHT10 тяжело. Там резисторная сборка 4 по 10кОм. BME280 не знаю, нет перед глазами. Ну для начала с часов сниму. там я сам паял, знаю что к чему.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Dimych70 пишет:

А есть минимальная величина? Максимальная я так понимаю 4,7кОм.

Я использовал и 10к.

А минимальную надо смотреть в дэйташите. У меня что-то отложилось - 1.8к при 5 В. При 3.3, думаю, можно немного меньше.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Выломать кусачками. Или ещё как. Ну всему же есть предел, пусть подтяжка только в одном месте будет. Просчёт разработчика али?

Dimych70
Offline
Зарегистрирован: 03.02.2022

Не получится выломать. Выламывать надо 2, а там резисторные сборки по 4 штуки. На BMP/BME280 тоже такая же сборка. С часов я снял, не помогло.

Да и получается, что там не по 4,7 стоят, а по 10. А 4 в параллель по 10 это 2,5 кОм. А т.к. я сейчас снял с часов, то и вообще 3 по 10 в паралолель 3,3 кОм. Т.е. норм. Значит надо копать либо библиотеку, завтра попробую ту что мне на форуме esp8266 использовать, ну а потом буду менять модуль SD-карты.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Тогда попробуй в линию резисторы добавить, прям в разрыв. Начни с 1кОм. Возможно поможет «дышать» линии. Если вообще в этом дело.

bwn
Offline
Зарегистрирован: 25.08.2014

Переходите к следующему этапу - оставляем один модуль, тестируем, подключаем следующий, и смотрим на котором заколбасит. Это опять, не рецепт, а метода. Результат не гарантируется.

P/S И схему со скетчем все таки приложите.

Dimych70
Offline
Зарегистрирован: 03.02.2022

Да, думал об этом. Вот сначала библиотеку другую попробую, потом модуль SD-карты сменю, а потом по одному подключать буду. Но AHT10 уже 2 новых поставил на днях. Старые два у меня сдохли, как выше написал.

SergeiL
SergeiL аватар
Offline
Зарегистрирован: 05.11.2018

А после зависание в монитор порта совсем ничего не сыплется?
Я с зависающими на глухо ESP не сталкивался совсем, обычно watchdog срабатывает и перезапускает ESP.
А SD card reader как подключен, на какие GPIO?

Не могут подключения датчиков и SD-card влиять на GPIO которые должны быть подтянуты при старте к +3,3В (GPIO0, GPIO2) и GND (GPIO15)?
Зависание может быть в случае, если срабатывает watchdog, а ESP сваливается в загрузку, например.

Dimych70
Offline
Зарегистрирован: 03.02.2022

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

Начал уже экспериментировать. Убрал оба AHT10. Сейчас скетч подкорректирую и буду смотреть.

Logik
Offline
Зарегистрирован: 05.08.2014

А МК у тебя не греется часом? Если не - ищи неконтакт.

Dimych70
Offline
Зарегистрирован: 03.02.2022

Да нет вроде. Да уж не знаю где неконтакт искать. Всё впаяно в плату. Конечно эти гребенки, что к ардуинкам прилагаются паяются ну оооочень хреново. Но я их уже по 2-3 раза пропаял. Вот сейчас отпаял 2 датчика AHT10, жду результатов.

SergeiL
SergeiL аватар
Offline
Зарегистрирован: 05.11.2018

Странно конечно. В ESP watchdog должен отрабатывать. Когда он рестартует ESP в мониторе порта обычно видны рестарты.
А со стороны сети она на пинги отвечает после зависания?

Мне не понятно почему ни ресет ни отключение питания на 100% не восстанавливают работу до первоначального уровня.
Ладно еще ресет, может что то не сбрасывается.
Но отключение питание точно должно сбрасывать все.
При отключении питания все подключенные устройства обесточиваются, или что то может остаться под питанием?
И все таки, что и на какие пины подключено?

Dimych70
Offline
Зарегистрирован: 03.02.2022

Она как бы не до конца зависает. Просто начинает левые данные по все i2c гнать, начиная с часов, кажущих 165:165:85 и все датчики доже фигню кажут Кто за 100, а кто 0,6, когда на самом деле 26 скажем температура.

SergeiL
SergeiL аватар
Offline
Зарегистрирован: 05.11.2018

Если гонит некорректные данные, то очень похоже на испорченную память.  

Но, после ресета, и уж точно после снятия питания память инициализируется заново. По идее, должна восстанавливаться корректная работа.

А этого не происходит судя по вашей информации. Это то и не понятно.

 

Dimych70
Offline
Зарегистрирован: 03.02.2022

Испорченная память где?

Ну вот потестирую, посмотрю. Пока с 12 часов полет нормальный. Но этого мало. Надо пару дней подождать.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

видимо в стек залезает

bwn
Offline
Зарегистрирован: 25.08.2014

ua6em пишет:

видимо в стек залезает

Просьбу предоставить скетч и схему автор упрямо игнорит.((((

Dimych70
Offline
Зарегистрирован: 03.02.2022

Сутки прошли, зависаний нет. Я конечно еще день-два подожду, но все-таки получается, что дело в AHT10 датчиках. Попробую библиотеку, что мне на форуме esp8266 посоветовали завтра.

sadman41
Offline
Зарегистрирован: 19.10.2016

Подвесь обратно, но не опрашивай. Или вместо них другие I2C модули поставь, но не опрашивай.

Dimych70
Offline
Зарегистрирован: 03.02.2022

sadman41 пишет:

Подвесь обратно, но не опрашивай. Или вместо них другие I2C модули поставь, но не опрашивай.

Это идея! Спасибо за мысль! Так мы выясним причина в железе или ПО.

Dimych70
Offline
Зарегистрирован: 03.02.2022

Ну вот я тут как дневник веду. 2 суток с припаяными датчиками без прописывания их в скетч. Датчики определяются. Зависаний не было.

Ну сейчас значит начну с библиотеками играть.

Dimych70
Offline
Зарегистрирован: 03.02.2022

Ну вот. 4 часа прошло и зависло. Точнее чушь казать стало. Время 165:165:85 и показания датчиков билиберда.

Dimych70
Offline
Зарегистрирован: 03.02.2022

В общем я так понимаю, что памяти чтоль не хватает и он начинает сбоить. ПРи чем если датчяики просто иницииируются и при инициации один раз собирает данные, то дальше работает без проблем. Но вот если хотя бы на одном датчике раз в секунду снимать температуру, то система виснет, точнее что-то случается с wire я так понимаю и все устройства на i2c начинают выдавать билиберду.

Dimych70
Offline
Зарегистрирован: 03.02.2022

Не знаю читает ли кто еще мои писульки.

В общем не причину нашел, а когда возникает зависание. Короче как я и писал у меня 3 датчика: два AHT10 и BMP\BPE280. (С последним проблем нет.) На WEB морде с помощью WebSocet идет отображение данных с датчиков и времени каждую секунду. Так вот при сборе данных с AHT10 ежесекундно система зависает. В базу на флешке же данные пишутся раз в 10 минут. Я убрал запрос AHT10 ежесекундный и включил их раз в 10 минут. Со вчерашнего дня зависаний не было. Я конечно могу поэкспериментировать и собирать с них данные каждые 2 секунды или 3, 4. Но это не правильно. Но с другой стороны сбор данных идет стандартными из библиотеки процедурами. Вот так скажем:

float t2;

char* GettIn2(){
    t2 = aht1038.readTemperature();
    dtostrf(t2, 4, 1, temperatureString2);
    return temperatureString2;
}

Даже не знаю куда ковырять. Попробую библиотеку от BME280 взять посмотреть. Там же в принципе все одно и то же.

kalapanga
Offline
Зарегистрирован: 23.10.2016

Dimych70 пишет:

Но с другой стороны сбор данных идет стандартными из библиотеки процедурами. Вот так скажем:

float t2;

char* GettIn2(){
    t2 = aht1038.readTemperature();
    dtostrf(t2, 4, 1, temperatureString2);
    return temperatureString2;
}

Оговорюсь сразу - я не знаю причину Ваших проблем. Но примеры Вы приводите плохо. Вот кто здесь такая "temperatureString2". Может как раз она размера неправильного?

Dimych70
Offline
Зарегистрирован: 03.02.2022

Ну вроде как функцию dtostrf не я придумывал.

Формат функции следующий

dtostrf(floatvar, StringLengthIncDecimalPoint, numVarsAfterDecimal, charbuf);

Copy

где:

floatvar - преобразуемая переменная типа float;

StringLengthIncDecimalPoint - длина получаемого символьного значения;

numVarsAfterDecimal - количество символов после запятой;

charbuf - символьный массив для сохранения результата преобразования 

Ну а переменная типа char.

Собственно эта функция в том же назначении у меня уже больше года работает в домашней метеостанции и прекрасно выдает данные с датчика BMP/BME280. Да и в этом устройстве с этого датчика все без проблем работает.

Вот так все будет ясно:

float t2;
char temperatureString2[5];

char* GettIn2(){
    t2 = aht1038.readTemperature();
    dtostrf(t2, 4, 1, temperatureString2);
    return temperatureString2;
}

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Теперь это хотя бы видно.

Dimych70
Offline
Зарегистрирован: 03.02.2022

Вы меня ввели в сомнения. Хватит ли 5? Масиив char ведь задается число предполагаемых символов +1? Так?

А у меня ну наверное при -11,6 скажем градусов будет перебор? Ну пока все датчики в комнате и средний показатель 25,5. Т.е. подходит. Единственное когда глючит, он выдает 255,0. Это значение вроде не подходит, но он его записывает в базу. Ну и собственно он уже висит можно сказать в это время, т.к. выдает билиберду и с датчиков и часовю

kalapanga
Offline
Зарегистрирован: 23.10.2016

Вот только что хотел добавить, что для минусовых может не влезть. Там же ещё под нулевой символ место нужно. 255.0 соответственно уже тоже не входит. Добавьте, чтоб не думалось.

Dimych70
Offline
Зарегистрирован: 03.02.2022

Да, сейчас добавлю. Но кажется причина не в этом. Как я уже говорил, у меня уже больше года дома метеостанция работает. Основа оттуда. Здесь только дисплей другой будет и датчики вот эти добавились. Но там точно съедает ниже -10, ну скажем -12,7 влезть уже не должно, а работает.

sadman41
Offline
Зарегистрирован: 19.10.2016

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

А то, что переполнение массива не подвешивается систему - это не показатель. Может и годами работать при определённых условиях.

Dimych70
Offline
Зарегистрирован: 03.02.2022

А я вот подумал, может я не ту плату выбираю? Я выбрал Wemos D1R1. Куплена у меня вот такая. Сейчас попробовал поставить LOLIN(WEMOS) D1 R2 & mini. При прошивке все ОК, как и со старым вариантом.

Logik
Offline
Зарегистрирован: 05.08.2014

Весь тот зоопарк плат под ESP8266 только числом и маркировкой пинов различаются. Так что без разницы. Объем свободного ОЗУ через ESP.getFreeHeap()  проверяли?  Обычно снижение до 15-18КБ вызывает проблему. Но она должна бы ребутом убиратся. А вот перегрев - не уберется сразу. Я ставлю скорей на него.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

А может просто включить отладку ? Почитать причину перезагрузки. Да и вообще что значит зависает. Если не перегружается, а просто виснет, значит ошибка у вас в коде. Может вы не знаете, но всякие wifi, блютус и прочие задачи крутятся с использованием RTOS. Вы в долгих процедурах отдаете время параллельным потокам ? 

Dimych70
Offline
Зарегистрирован: 03.02.2022

brokly пишет:

А может просто включить отладку ? Почитать причину перезагрузки. Да и вообще что значит зависает. Если не перегружается, а просто виснет, значит ошибка у вас в коде. Может вы не знаете, но всякие wifi, блютус и прочие задачи крутятся с использованием RTOS. Вы в долгих процедурах отдаете время параллельным потокам ? 

Уточню. Оно само не виснет. WEB сервер работает, WebSoket работает, порт данные выдает. Не работает I2C. Часы кажут лажу и датчики тоже. На счет сброса кнопкой... в последниее время не сбрасывается. Ну точнее сбрасывается, но при загрузке сразу пишет, что ни одного устройства Wire не находит. После отключения питания или отключения от USB (если питается с компа), снова начинает загружатся и видит все устройства.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Мошт чо грееццо просто?

Dimych70
Offline
Зарегистрирован: 03.02.2022

BOOM пишет:

Мошт чо грееццо просто?

Инфракрасной камеры у меня нет. Пальцами щупаю, вроде всё холодное.

Ну и потом когда датчики висели припаяные, но в скетч никакие действия прописаны не были, Wire их видел и ничего не висло. Если б уж грелось что-то, то и тогда бы висло. Врядли греется от того, что я в скетче с них данные снимаю. При чем уже проверено, что если раз в 10 минут данные снимать, они не виснут. Щас тестирую интервал времени. На раз в 1 секунду висли, на раз в 2 секунды висли. Щас делаю раз в 3 секунды.