Теоретически - да. Но я давно уже юзаю модифицированную, поэтому не помню, как там устроено в штатной. Вобщем, суть в том, чтобы немного обождать на ините до начала дрыганья ногами по SPI.
отлетел один блок питания. Если от компа питать то отработало 23 часа, потом решил внести обновления,добавил датчик БМЕ280. От провода отказывается работать. 3 часа поработала и отлетела, что там произошло - хз. Буду опять ставить с компом и ждать пока отлетит...
2 оборудования. Одно отлетело через 3 часа. второе продолжает работать, оба крутятся в одной сети и коннектятся к СКЛ на диджитал оушн.
Как добиться стабильности? Вообще реально что бы ардуино все время получала настройки из интернета, записывало данные в СКЛ и работало 24-7-365 ?
Суть задачи - получать настройки ардуино в режиме онлайн, и выполнять действия. Пример:
Хочу что бы каждые 2 часа поливал цветок, потом смотрю что это мало и в СКЛ меняю значение на 1 час и ардуино считывает каждые 10 секунд настройки и перестраивается в зависимости от настроек.
Ладно, еще пару нервов спущу и буду заказывать проект... мне нужна стабильность как у вас на скрине =) я походу - мартышка безлапая. Каждый раз код смотрю, все идеально, но не работает, значит не идеально =(
Китайскую просто не жалко, она как подопытный кролик)))
У мну эти подопытные кролики перезаливаются по десятку раз на дню, и шо я имею вам сказать: вполне себе нормальные кролики, работают - аж свист и волосы назад :)
Ладно, еще пару нервов спущу и буду заказывать проект... мне нужна стабильность как у вас на скрине =) я походу - мартышка безлапая. Каждый раз код смотрю, все идеально, но не работает, значит не идеально =(
Код - это даже не половина дела, пмсм. Там ещё и схемотехника выплывает, как минимум. Можно написать код, оттестить его на макетке с китайскими модулями, а потом, на первой версии платы - оно не взлетит, потому что... (тут тысяча причин).
Ну я не так глубоко внедряюсь. У меня задача - бесперебойное управление 24/7/365. Но правда все соединения делаю так: припаиваю к ноге на плате ардуино, вставляю в ваговский переходник и туда напихиваю провода от кулеров, датчиков и тд. Т.к. были случаи отхода провода (даже один раз ножка на проводе сломалась,задолбался искать косяк, а там просто лапка оторвалась) поэтому теперь все только припаиваю.
У меня пока на тестах 1 датчик влажности + температура + 4 реле.
Сейчас пока борюсь с записью в СКЛ и получением времени из интернета(со стабильностью). Когда это поборю, начну вешать датчики. Сейчас в СКЛ пишутся нулевые показатели, после включения датчиков, значения поменяются а "тело" ардуинки уже будет стабильным)))
а что никто не пишет, что строчка 10 из кода в сообщении#27 - это тихий ужас? Может если строчки 10-14 по нормальному переписать - система получше работать начнет, тем более что оно именно в этом месте и спотыкается?
Ну, мало ли что там ужас... Это дело личное. Да и я в стрингах не разбираюсь, советовать не буду. Память не течет, а внешний вид - забота автора - ему с ним жить.
а что никто не пишет, что строчка 10 из кода в сообщении#27 - это тихий ужас? Может если строчки 10-14 по нормальному переписать - система получше работать начнет, тем более что оно именно в этом месте и спотыкается?
Строго говоря, там вообще все строчки без макроса F(), поэтому перерасход оперативки - имеет место быть, конечно.
Ну, мало ли что там ужас... Это дело личное. Да и я в стрингах не разбираюсь, советовать не буду. Память не течет, а внешний вид - забота автора - ему с ним жить.
Память то не течет, но отправляется ли в query вся строка? - ведь если память фрагментирована, в ней может не найтись достаточного места для этой длинной строки и операции с ней просто не пройдут.
А ведь тут так - сначала в строчке 10 выделяется место под статичную часть строки. Потом к ней прибавляется mac, для чего, насколько я понимаю, место в памяти выдедяется заново. Потом нам нужно выделить место под символьный буфер того же размера. А потом еще скопировать в него первоначальную строку - и я не удивлюсь, если тут еще требуется дополнительная память.
Что будет делать библиотека String, если на каком-то этапе память выделить не удасться? - вот нашел в StacOverflow пример, где "лишняя" часть строки просто отбрасывается. (кстати, пример тоже работы с либой Ethernet).
Ну а дальше все понятно- в SQL Execute улетает некорректный query и оно зависает. Поскольку весь эффект замешан на фрагментации, то проявляться он будет не сразу, а спустя много часов - и совершенно случайным образом.
Евгений Петрович предлагал ему проверять память, выделяемую под string.
Но по отчетам у него там 4кб памяти свободной. Должно хватать. Теоретически.
Да, рекомендацию-то я видел - а вот отчета по ней что-то не нашел :) Ну и потом - наличие 4 Кб памяти не отменяет вероятности тех проблем, что я описал. Там только строчки 10-14, навскидку, отжирают 1.5К "кучи". И еще неизвестно, как с этим запросом обращается SQL_Cursor
Сервер не локальный. Скл нужен для записи данных с интервалом. Тем самым я вижу работу оборудования и могу строить графики по полученным данным. В дальнейшем из любой точки мира смогу следить и корректировать работу оборудования
по переменной в которой длинный селект : если отрезать часть запроса и сделать execute то скл вернёт ошибку не правильного запроса. Тк таблица имеет всего 5 значений то даже если будет выбирать всю таблицу(не представляю что это возможно) то ничего не зависнет.
проверку на выделение памяти я поставил и после этого на этом моменте уже не вылетает!
сейчас пока проблемы с реальным временем. Как поборю — буду тестировать дальше! Вам спасибо за советы, без них как без пинка, зато потихоньку код становится лучше :)
А как иначе длинный селект с двумя таблицами можно засунуть в execute типа char?
что бы не выделять память сначала под ботинок типа стринг а потом выделять место под чар длинной в ботинок типа стринг. Маленький намек и я пойду читать как это сделать =))) Спасибо! :P
Я бы сделал так - СКЛ оставил бы только на сервере, например на локальной малинке, как было вначале. Датчики сгруппировал бы в 2-3 группы, к каждой поставил бы по простенькой Ардуине, типа Нано. Наны передают данные на малинку через NRF24 или HC-12, а обратно получают команды. А уже малинка получает данные и складывает их в локальный СКЛ.
Система получается простой, дешевой, надежной. И никакого интернета между ардуинами (ну не для этого они), никаких диких СКЛ запросов.
А насчет СКЛ DIYMan прав. Запрос можно переписать раза в три короче. Выбрать короткие имена таблиц и полей. Исключить возможность NULL. чтобы на него не надо было проверять. Свести все в одну таблицу и избавится от LEFT JOIN/ Не знаю. что там у вас в базе, но практически уверен, что все эти данные можно хранить в одной линейной базе без доп таблиц и представлений.
И, кстати, реальное время тоже ардуине ни к чему. Записывайте Timestamp методами CКЛ, когда помещаете запись в базу.
Спасибо большое за Советы! Реальное время нужно что бы в определённое время включать оборудование. Пример: чайник на 07:30 каждое утро а таймштамп я использую и так при занесении температуры в базу, вижу автоматом когда сделана запись
Пока переписал получение настроек из СКЛ - при запуске ардуино. Убрал из лупа. Поставил луп вместо 10 секунд на 60 секунд. Ну и переписал строчку селекта, пока она выглядит так:
String queryDefault = "SELECT c.isActive,IFNULL(p.light_timer_start,0),IFNULL(p.hum_min,0),IFNULL(p.hum_max,0),IFNULL(t.done,1),IFNULL(p.t_min_day,0),IFNULL(p.t_max_day,0),IFNULL(p.t_min_night,0),IFNULL(p.t_max_night,0),IFNULL(p.light_timer_stop,0) FROM G.c as c LEFT JOIN G.p ON c.mac=p.mac LEFT JOIN G.t ON c.mac=t.mac WHERE c.mac='" + mac + "'";
До этого выглядело так:
String queryDefault = "SELECT clients.isActive as isActive, IFNULL(properties.light_timer_start,0) as light_timer_start,IFNULL(properties.humidity_min,0) as humidity_min,IFNULL(properties.humidity_max,0) as humidity_max,IFNULL(tasks.done,1) as done,IFNULL(properties.t_min_day,0) as t_min_day,IFNULL(properties.t_max_day,0) as t_max_day,IFNULL(properties.t_min_night,0) as t_min_night,IFNULL(properties.t_max_night,0) as t_max_night, IFNULL(properties.light_timer_stop,0) as light_timer_stop FROM u0497129_grower.clients as clients LEFT JOIN u0497129_grower.properties ON clients.mac = properties.mac LEFT JOIN u0497129_grower.tasks ON clients.mac = tasks.mac WHERE clients.mac = '" + mac + "'";
Теперь в лупе один селект раз в 60 секунд на поиск задачи. Такого формата :
String queryDefault = "SELECT IFNULL(t.done,1) FROM G.t WHERE t.mac='" + mac + "'";
И только если есть задача, тогда разово вступает в силу верхний селект и ардуино получает все настройки по новой.
2) исполнительную часть(обращение к скл,запросы,обработка результата) перенес на сервер. Ардуино делает запрос и получает ответ с данными. Динамическая память упала с 32% до 17%.
3) При неудачном подключении к EthernetClient (сервер) идет обновление сессии на роутере (заметил что сессия кончается и ардуино просто перестает работать). Добавил обновление сессии. Для жесткости, поставил на роутере обновление сессии раз в 5 минут что бы рповерять оборудование в жестких условиях =)
4) Время получает с сервера вместе с основными параметрами каждые 30 секунд.
5) Каждый час пишет данные с ардуино в СКЛ.
6) Стоило ввести в скл время старта ардуино, как обнаружилась перезагрузка оборудования(пару раз за все время). Поставил стабилизатор с акумом, от скачков напряжения. Есть подозрение что это были скачки напряжения, либо отключение электричества в квартире.
Работают две ардуинки, уже 1 день и 12 часов. Проблем нет. Буду держать до 2 недель, что бы наверняка!
В общем, проблема исчерпана, всем огромное спасибо за помощь!
3) При неудачном подключении к EthernetClient (сервер) идет обновление сессии на роутере (заметил что сессия кончается и ардуино просто перестает работать). Добавил обновление сессии. Для жесткости, поставил на роутере обновление сессии раз в 5 минут что бы рповерять оборудование в жестких условиях =)
Работают две ардуинки, уже 1 день и 12 часов. Проблем нет. Буду держать до 2 недель, что бы наверняка!
О какой сессии идет речь в п.3?
И, да, моя ENC28J60 легко могла повеситься на третью неделю ;)
Обновление аренды. Я заметил что у меня часто до суток не доживала ардуинка. Я около 3 недель искоренял из кода злые стринги и прочий мусор, который влиял на память. Потом, когда настраивал третью ардуинку на роутере, заметил что аренда у моей первой ардуины кончается через 30 минут ( а аренда стояла 24 часа)
Через 30 минут ардуино перестала работать и я связал это с арендами на роутере. При подключении к серверу, если подключение сорвалось (а оно может сорваться если сервер в дауне либо интернета нет на ардуино) то вызывается функция maintain() которая возвращает обновилась аренда или нет. А для жесткости поставил аренду на сервере на 5 минут (каждые 5 минут нужно запрашивать обновление).
Собственно, могу отключить эту функцию, оставить аренду на роутере 5 минут и проверить, вылетает или нет. Просто пока не хочется отключать оборудование,т.к. проверяю на длительность работы =)
p.s. но обновление аренды в сериал у меня выводит, что обновилась аренда и пишет айпишник...
maintain() - это периодически вызываемая функция. Не надо дожидаться, пока что-то там оборвется - просто каждые... Ну, минут 5 (или какая у вас критичность) ее дергайте, она обменяется пакетами с DHCP, тот продлит lease.
Если некуда процессорное время девать, то ставьте, конечно. Она, внутри себя еще какие-то фокусы с периодичностью проверки производит. Впритирку периодичность вызова maintain() к времени аренды не стоит делать, а внутри его - с разумной частотой.
--------------
You can call this function as often as you want, it will only re-request a DHCP lease when needed (returning 0 in all other cases). The easiest way is to just call it on every loop() invocation, but less often is also fine.
Я юзаю библиотеку Ethernet
там инит такой:
Попробовать туда засунуть делей 300 ?
Теоретически - да. Но я давно уже юзаю модифицированную, поэтому не помню, как там устроено в штатной. Вобщем, суть в том, чтобы немного обождать на ините до начала дрыганья ногами по SPI.
Короче, это ардуино - это п****ц какой то...
отлетел один блок питания. Если от компа питать то отработало 23 часа, потом решил внести обновления,добавил датчик БМЕ280. От провода отказывается работать. 3 часа поработала и отлетела, что там произошло - хз. Буду опять ставить с компом и ждать пока отлетит...
2 оборудования. Одно отлетело через 3 часа. второе продолжает работать, оба крутятся в одной сети и коннектятся к СКЛ на диджитал оушн.
Как добиться стабильности? Вообще реально что бы ардуино все время получала настройки из интернета, записывало данные в СКЛ и работало 24-7-365 ?
Суть задачи - получать настройки ардуино в режиме онлайн, и выполнять действия. Пример:
Хочу что бы каждые 2 часа поливал цветок, потом смотрю что это мало и в СКЛ меняю значение на 1 час и ардуино считывает каждые 10 секунд настройки и перестраивается в зависимости от настроек.
Короче, это ардуино - это п****ц какой то...
Это, наверное, потому, что китайская :)
Как добиться стабильности?
Сделать по уму.
Вообще реально что бы ардуино все время получала настройки из интернета, записывало данные в СКЛ и работало 24-7-365 ?
Реально.
У меня одна китайская. Вторая качественная. Я бы даже сказал, что китайская пока более качественнее работает =)
Как добиться стабильности? Вообще реально что бы ардуино все время получала настройки из интернета, записывало данные в СКЛ и работало 24-7-365 ?
У меня одна китайская. Вторая качественная. Я бы даже сказал, что китайская пока более качественнее работает =)
Однозначно - эти фразы стоит запомнить :)
Китайскую просто не жалко, она как подопытный кролик)))
Ладно, еще пару нервов спущу и буду заказывать проект... мне нужна стабильность как у вас на скрине =) я походу - мартышка безлапая. Каждый раз код смотрю, все идеально, но не работает, значит не идеально =(
Китайскую просто не жалко, она как подопытный кролик)))
У мну эти подопытные кролики перезаливаются по десятку раз на дню, и шо я имею вам сказать: вполне себе нормальные кролики, работают - аж свист и волосы назад :)
Ладно, еще пару нервов спущу и буду заказывать проект... мне нужна стабильность как у вас на скрине =) я походу - мартышка безлапая. Каждый раз код смотрю, все идеально, но не работает, значит не идеально =(
Код - это даже не половина дела, пмсм. Там ещё и схемотехника выплывает, как минимум. Можно написать код, оттестить его на макетке с китайскими модулями, а потом, на первой версии платы - оно не взлетит, потому что... (тут тысяча причин).
Будете смеяться, но у меня даже не ЛУТ. Макетка и снизу проводочками дорожки. Ну, один шлейф IDC на сетевой модуль.
Ну, один шлейф IDC на сетевой модуль.
Он решает :))))))
Ну я не так глубоко внедряюсь. У меня задача - бесперебойное управление 24/7/365. Но правда все соединения делаю так: припаиваю к ноге на плате ардуино, вставляю в ваговский переходник и туда напихиваю провода от кулеров, датчиков и тд. Т.к. были случаи отхода провода (даже один раз ножка на проводе сломалась,задолбался искать косяк, а там просто лапка оторвалась) поэтому теперь все только припаиваю.
У меня пока на тестах 1 датчик влажности + температура + 4 реле.
Сейчас пока борюсь с записью в СКЛ и получением времени из интернета(со стабильностью). Когда это поборю, начну вешать датчики. Сейчас в СКЛ пишутся нулевые показатели, после включения датчиков, значения поменяются а "тело" ардуинки уже будет стабильным)))
А в вашем проекте данные пишутся в СКЛ?
Ну, для бесперебойной работы всякие там гирлянды соединителей - зло.
Дело, конечно, ваше, но я бы хотя бы на таком развелся (я так понимаю, что на Uno развлекаетесь): https://ru.aliexpress.com/item/-/32861703807.html
В конечном итоге они пишутся в SQL - Zabbix бэкэндом имеет MySQL, PostgreSql и еще там всякое.
я на меге балуюсь + эзернет шилд + сверху плата ставится и там цифровых выходов 30 штук (надеюсь что будет куча разных датчиков) =))))
макетка хорошее решение - делаешь под конкретный проект. Но не думаю что это решит текущие проблемы, как говорится : тот же х** только вид сбоку))))
а что никто не пишет, что строчка 10 из кода в сообщении#27 - это тихий ужас? Может если строчки 10-14 по нормальному переписать - система получше работать начнет, тем более что оно именно в этом месте и спотыкается?
Ну, мало ли что там ужас... Это дело личное. Да и я в стрингах не разбираюсь, советовать не буду. Память не течет, а внешний вид - забота автора - ему с ним жить.
а что никто не пишет, что строчка 10 из кода в сообщении#27 - это тихий ужас? Может если строчки 10-14 по нормальному переписать - система получше работать начнет, тем более что оно именно в этом месте и спотыкается?
Строго говоря, там вообще все строчки без макроса F(), поэтому перерасход оперативки - имеет место быть, конечно.
Ну, мало ли что там ужас... Это дело личное. Да и я в стрингах не разбираюсь, советовать не буду. Память не течет, а внешний вид - забота автора - ему с ним жить.
Память то не течет, но отправляется ли в query вся строка? - ведь если память фрагментирована, в ней может не найтись достаточного места для этой длинной строки и операции с ней просто не пройдут.
А ведь тут так - сначала в строчке 10 выделяется место под статичную часть строки. Потом к ней прибавляется mac, для чего, насколько я понимаю, место в памяти выдедяется заново. Потом нам нужно выделить место под символьный буфер того же размера. А потом еще скопировать в него первоначальную строку - и я не удивлюсь, если тут еще требуется дополнительная память.
Что будет делать библиотека String, если на каком-то этапе память выделить не удасться? - вот нашел в StacOverflow пример, где "лишняя" часть строки просто отбрасывается. (кстати, пример тоже работы с либой Ethernet).
Может и у ТС что-то похожее??
https://stackoverflow.com/questions/17972523/are-there-limits-on-string-length-in-arduino
Ну а дальше все понятно- в SQL Execute улетает некорректный query и оно зависает. Поскольку весь эффект замешан на фрагментации, то проявляться он будет не сразу, а спустя много часов - и совершенно случайным образом.
Евгений Петрович предлагал ему проверять память, выделяемую под string.
Но по отчетам у него там 4кб памяти свободной. Должно хватать. Теоретически.
Евгений Петрович предлагал ему проверять память, выделяемую под string.
Но по отчетам у него там 4кб памяти свободной. Должно хватать. Теоретически.
Да, рекомендацию-то я видел - а вот отчета по ней что-то не нашел :) Ну и потом - наличие 4 Кб памяти не отменяет вероятности тех проблем, что я описал. Там только строчки 10-14, навскидку, отжирают 1.5К "кучи". И еще неизвестно, как с этим запросом обращается SQL_Cursor
Объем памяти под fetched rows меня тоже смущают, но тут уж дело топикстартера с ним разбираться. Не сидеть же с ним рядом в отладке.
Объем памяти под fetched rows меня тоже смущают, но тут уж дело топикстартера с ним разбираться. Не сидеть же с ним рядом в отладке.
да я вообще удивляюсь, зачем показания датчиков отправлять на локальный сервер - в виде СКЛ по TCP-IP ? - неужели чо попроще нельзя взять...
Пианист играет, как умеет...
Сервер не локальный. Скл нужен для записи данных с интервалом. Тем самым я вижу работу оборудования и могу строить графики по полученным данным. В дальнейшем из любой точки мира смогу следить и корректировать работу оборудования
по переменной в которой длинный селект : если отрезать часть запроса и сделать execute то скл вернёт ошибку не правильного запроса. Тк таблица имеет всего 5 значений то даже если будет выбирать всю таблицу(не представляю что это возможно) то ничего не зависнет.
проверку на выделение памяти я поставил и после этого на этом моменте уже не вылетает!
сейчас пока проблемы с реальным временем. Как поборю — буду тестировать дальше! Вам спасибо за советы, без них как без пинка, зато потихоньку код становится лучше :)
Спасибо! Буду думать как переписать. Тут же от обратного — знал бы что не так, исправил. Знал бы как исправить — переписал. Я же написал как умею ...
А как иначе длинный селект с двумя таблицами можно засунуть в execute типа char?
что бы не выделять память сначала под ботинок типа стринг а потом выделять место под чар длинной в ботинок типа стринг. Маленький намек и я пойду читать как это сделать =))) Спасибо! :P
У стринга есть метод, отдающий указатель на char, например.
по переменной в которой длинный селект : если отрезать часть запроса и сделать execute то скл вернёт ошибку не правильного запроса.
Что мешает скостить длину запроса, юзая хранимки? https://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-stored-procedures.html
воу! это интересно! спасибо)))))))
Главное - года через 3-4 не забыть, где и какие части системы раскиданы ;)
Да это верно. Нужно ,как закончу,в начале скетча написать что где... Спасибо
Я бы сделал так - СКЛ оставил бы только на сервере, например на локальной малинке, как было вначале. Датчики сгруппировал бы в 2-3 группы, к каждой поставил бы по простенькой Ардуине, типа Нано. Наны передают данные на малинку через NRF24 или HC-12, а обратно получают команды. А уже малинка получает данные и складывает их в локальный СКЛ.
Система получается простой, дешевой, надежной. И никакого интернета между ардуинами (ну не для этого они), никаких диких СКЛ запросов.
А насчет СКЛ DIYMan прав. Запрос можно переписать раза в три короче. Выбрать короткие имена таблиц и полей. Исключить возможность NULL. чтобы на него не надо было проверять. Свести все в одну таблицу и избавится от LEFT JOIN/ Не знаю. что там у вас в базе, но практически уверен, что все эти данные можно хранить в одной линейной базе без доп таблиц и представлений.
И, кстати, реальное время тоже ардуине ни к чему. Записывайте Timestamp методами CКЛ, когда помещаете запись в базу.
Спасибо большое за Советы! Реальное время нужно что бы в определённое время включать оборудование. Пример: чайник на 07:30 каждое утро а таймштамп я использую и так при занесении температуры в базу, вижу автоматом когда сделана запись
Спасибо большое за Советы! Реальное время нужно что бы в определённое время включать оборудование.
берите время с сервера.
И мой совет - выкиньте Ethernet вовсе
Спасибо!!
Пока переписал получение настроек из СКЛ - при запуске ардуино. Убрал из лупа. Поставил луп вместо 10 секунд на 60 секунд. Ну и переписал строчку селекта, пока она выглядит так:
До этого выглядело так:
Теперь в лупе один селект раз в 60 секунд на поиск задачи. Такого формата :
И только если есть задача, тогда разово вступает в силу верхний селект и ардуино получает все настройки по новой.
Буду тестировать, надежда умирает последней))))))
Всем привет)
В общем, сделал так:
1) Вместо малины теперь сервер на диджитал оушн.
2) исполнительную часть(обращение к скл,запросы,обработка результата) перенес на сервер. Ардуино делает запрос и получает ответ с данными. Динамическая память упала с 32% до 17%.
3) При неудачном подключении к EthernetClient (сервер) идет обновление сессии на роутере (заметил что сессия кончается и ардуино просто перестает работать). Добавил обновление сессии. Для жесткости, поставил на роутере обновление сессии раз в 5 минут что бы рповерять оборудование в жестких условиях =)
4) Время получает с сервера вместе с основными параметрами каждые 30 секунд.
5) Каждый час пишет данные с ардуино в СКЛ.
6) Стоило ввести в скл время старта ардуино, как обнаружилась перезагрузка оборудования(пару раз за все время). Поставил стабилизатор с акумом, от скачков напряжения. Есть подозрение что это были скачки напряжения, либо отключение электричества в квартире.
Работают две ардуинки, уже 1 день и 12 часов. Проблем нет. Буду держать до 2 недель, что бы наверняка!
В общем, проблема исчерпана, всем огромное спасибо за помощь!
3) При неудачном подключении к EthernetClient (сервер) идет обновление сессии на роутере (заметил что сессия кончается и ардуино просто перестает работать). Добавил обновление сессии. Для жесткости, поставил на роутере обновление сессии раз в 5 минут что бы рповерять оборудование в жестких условиях =)
Работают две ардуинки, уже 1 день и 12 часов. Проблем нет. Буду держать до 2 недель, что бы наверняка!
О какой сессии идет речь в п.3?
И, да, моя ENC28J60 легко могла повеситься на третью неделю ;)
Обновление аренды. Я заметил что у меня часто до суток не доживала ардуинка. Я около 3 недель искоренял из кода злые стринги и прочий мусор, который влиял на память. Потом, когда настраивал третью ардуинку на роутере, заметил что аренда у моей первой ардуины кончается через 30 минут ( а аренда стояла 24 часа)
Через 30 минут ардуино перестала работать и я связал это с арендами на роутере. При подключении к серверу, если подключение сорвалось (а оно может сорваться если сервер в дауне либо интернета нет на ардуино) то вызывается функция maintain() которая возвращает обновилась аренда или нет. А для жесткости поставил аренду на сервере на 5 минут (каждые 5 минут нужно запрашивать обновление).
Собственно, могу отключить эту функцию, оставить аренду на роутере 5 минут и проверить, вылетает или нет. Просто пока не хочется отключать оборудование,т.к. проверяю на длительность работы =)
p.s. но обновление аренды в сериал у меня выводит, что обновилась аренда и пишет айпишник...
maintain() - это периодически вызываемая функция. Не надо дожидаться, пока что-то там оборвется - просто каждые... Ну, минут 5 (или какая у вас критичность) ее дергайте, она обменяется пакетами с DHCP, тот продлит lease.
Понял,круто, спасибо! =)
А если в общем лупе поставить, каждые 30 секунд? не критично так часто ее вызывать?
Если некуда процессорное время девать, то ставьте, конечно. Она, внутри себя еще какие-то фокусы с периодичностью проверки производит. Впритирку периодичность вызова maintain() к времени аренды не стоит делать, а внутри его - с разумной частотой.
--------------
You can call this function as often as you want, it will only re-request a DHCP lease when needed (returning 0 in all other cases). The easiest way is to just call it on every loop() invocation, but less often is also fine.
--------------