mega +ethernet shield + raspberry(mysql,php,apache,phpmyadmin)

nkYellOw
Offline
Зарегистрирован: 23.11.2015

Я юзаю библиотеку Ethernet

там инит такой:

void EthernetClass::init(uint8_t sspin)
{
	W5100.setSS(sspin);
}

Попробовать туда засунуть делей 300 ?

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

Теоретически - да. Но я давно уже юзаю модифицированную, поэтому не помню, как там устроено в штатной. Вобщем, суть в том, чтобы немного обождать на ините до начала дрыганья ногами по SPI.

nkYellOw
Offline
Зарегистрирован: 23.11.2015

Короче, это ардуино  - это п****ц какой то... 

отлетел один блок питания. Если от компа питать то отработало 23 часа, потом решил внести обновления,добавил датчик БМЕ280. От провода отказывается работать. 3 часа поработала и отлетела, что там произошло - хз. Буду опять ставить с компом и ждать пока отлетит...

2 оборудования. Одно отлетело через 3 часа. второе продолжает работать, оба крутятся в одной сети и коннектятся к СКЛ на диджитал оушн.

Как добиться стабильности? Вообще реально что бы ардуино все время получала настройки из интернета, записывало данные в СКЛ и работало 24-7-365 ?

Суть задачи - получать настройки ардуино в режиме онлайн, и выполнять действия. Пример:

Хочу что бы каждые 2 часа поливал цветок, потом смотрю что это мало и в СКЛ меняю значение на 1 час и ардуино считывает каждые 10 секунд настройки и перестраивается в зависимости от настроек.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

nkYellOw пишет:

Короче, это ардуино  - это п****ц какой то... 

Это, наверное, потому, что китайская :)

nkYellOw пишет:

Как добиться стабильности? 

Сделать по уму.

nkYellOw пишет:

Вообще реально что бы ардуино все время получала настройки из интернета, записывало данные в СКЛ и работало 24-7-365 ?

Реально.

 

nkYellOw
Offline
Зарегистрирован: 23.11.2015

У меня одна китайская. Вторая качественная. Я бы даже сказал, что китайская пока более качественнее работает =)

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

nkYellOw пишет:

Как добиться стабильности? Вообще реально что бы ардуино все время получала настройки из интернета, записывало данные в СКЛ и работало 24-7-365 ?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

nkYellOw пишет:

У меня одна китайская. Вторая качественная. Я бы даже сказал, что китайская пока более качественнее работает =)

Однозначно - эти фразы стоит запомнить :)

nkYellOw
Offline
Зарегистрирован: 23.11.2015

Китайскую просто не жалко, она как подопытный кролик)))

nkYellOw
Offline
Зарегистрирован: 23.11.2015

Ладно, еще пару нервов спущу и буду заказывать проект... мне нужна стабильность как у вас на скрине =) я походу - мартышка безлапая. Каждый раз код смотрю, все идеально, но не работает, значит не идеально =(

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

nkYellOw пишет:

Китайскую просто не жалко, она как подопытный кролик)))

У мну эти подопытные кролики перезаливаются по десятку раз на дню, и шо я имею вам сказать: вполне себе нормальные кролики, работают - аж свист и волосы назад :)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

nkYellOw пишет:

Ладно, еще пару нервов спущу и буду заказывать проект... мне нужна стабильность как у вас на скрине =) я походу - мартышка безлапая. Каждый раз код смотрю, все идеально, но не работает, значит не идеально =(

Код - это даже не половина дела, пмсм. Там ещё и схемотехника выплывает, как минимум. Можно написать код, оттестить его на макетке с китайскими модулями, а потом, на первой версии платы - оно не взлетит, потому что... (тут тысяча причин).

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

Будете смеяться, но у меня даже не ЛУТ. Макетка и снизу проводочками дорожки. Ну, один шлейф IDC на сетевой модуль.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

sadman41 пишет:

Ну, один шлейф IDC на сетевой модуль.

Он решает :))))))

nkYellOw
Offline
Зарегистрирован: 23.11.2015

Ну я не так глубоко внедряюсь. У меня задача - бесперебойное управление 24/7/365. Но правда все соединения делаю так: припаиваю к ноге на плате ардуино, вставляю в ваговский переходник и туда напихиваю провода от кулеров, датчиков и тд. Т.к. были случаи отхода провода (даже один раз ножка на проводе сломалась,задолбался искать косяк, а там просто лапка оторвалась) поэтому теперь все только припаиваю. 

У меня пока на тестах 1 датчик влажности + температура + 4 реле.

Сейчас пока борюсь с записью в СКЛ и получением времени из интернета(со стабильностью). Когда это поборю, начну вешать датчики. Сейчас в СКЛ пишутся нулевые показатели, после включения датчиков, значения поменяются а "тело" ардуинки уже будет стабильным)))

nkYellOw
Offline
Зарегистрирован: 23.11.2015

А в вашем проекте данные пишутся в СКЛ? 

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

Ну, для бесперебойной работы всякие там гирлянды соединителей - зло.

Дело, конечно, ваше, но я бы хотя бы на таком развелся (я так понимаю, что на Uno развлекаетесь): https://ru.aliexpress.com/item/-/32861703807.html

В конечном итоге они пишутся в SQL - Zabbix бэкэндом имеет MySQL, PostgreSql и еще там всякое. 

nkYellOw
Offline
Зарегистрирован: 23.11.2015

я на меге балуюсь + эзернет шилд + сверху плата ставится и там цифровых выходов 30 штук (надеюсь что будет куча разных датчиков) =))))

макетка хорошее решение - делаешь под конкретный проект. Но не думаю что это решит текущие проблемы, как говорится : тот же х** только вид сбоку))))

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

а что никто не пишет, что строчка 10 из кода в сообщении#27 - это тихий ужас? Может если строчки 10-14 по нормальному переписать - система получше работать начнет, тем более что оно именно в этом месте и спотыкается?

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

Ну, мало ли что там ужас... Это дело личное. Да и я в стрингах не разбираюсь, советовать не буду. Память не течет, а внешний вид - забота автора - ему с ним жить.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

b707 пишет:

а что никто не пишет, что строчка 10 из кода в сообщении#27 - это тихий ужас? Может если строчки 10-14 по нормальному переписать - система получше работать начнет, тем более что оно именно в этом месте и спотыкается?

Строго говоря, там вообще все строчки без макроса F(), поэтому перерасход оперативки - имеет место быть, конечно.

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

sadman41 пишет:

Ну, мало ли что там ужас... Это дело личное. Да и я в стрингах не разбираюсь, советовать не буду. Память не течет, а внешний вид - забота автора - ему с ним жить.

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

А ведь тут так - сначала в строчке 10 выделяется место под статичную часть строки. Потом к ней прибавляется mac, для чего, насколько я понимаю, место в памяти выдедяется заново. Потом нам нужно выделить место под символьный буфер того же размера. А потом еще скопировать в него первоначальную строку - и я не удивлюсь, если тут еще требуется дополнительная память.

Что будет делать библиотека String, если на каком-то этапе память выделить не удасться? - вот нашел в StacOverflow пример, где "лишняя" часть строки просто отбрасывается. (кстати, пример тоже работы с либой Ethernet).

Может и у ТС что-то похожее??

https://stackoverflow.com/questions/17972523/are-there-limits-on-string-length-in-arduino

 

Ну а дальше все понятно- в SQL Execute улетает некорректный query и оно зависает. Поскольку весь эффект замешан на фрагментации, то проявляться он будет не сразу, а спустя много часов - и совершенно случайным образом.

 

 

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

Евгений Петрович предлагал ему проверять память, выделяемую под string. 

Но по отчетам у него там 4кб памяти свободной. Должно хватать. Теоретически.

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

sadman41 пишет:

Евгений Петрович предлагал ему проверять память, выделяемую под string. 

Но по отчетам у него там 4кб памяти свободной. Должно хватать. Теоретически.

Да, рекомендацию-то я видел - а вот отчета по ней что-то не нашел :) Ну и потом - наличие 4 Кб памяти не отменяет вероятности тех проблем, что я описал. Там только строчки 10-14, навскидку, отжирают 1.5К "кучи". И еще неизвестно, как с этим запросом обращается SQL_Cursor

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

Объем памяти под fetched rows меня тоже смущают, но тут уж дело топикстартера с ним разбираться. Не сидеть же с ним рядом в отладке.

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

sadman41 пишет:

Объем памяти под fetched rows меня тоже смущают, но тут уж дело топикстартера с ним разбираться. Не сидеть же с ним рядом в отладке.

да я вообще удивляюсь, зачем показания датчиков отправлять на локальный сервер -  в виде СКЛ по TCP-IP ? - неужели чо попроще нельзя взять...

 

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

Пианист играет, как умеет...

nkYellOw
Offline
Зарегистрирован: 23.11.2015

Сервер не локальный. Скл нужен для записи данных с интервалом. Тем самым я вижу работу оборудования и могу строить графики по полученным данным. В дальнейшем из любой точки мира смогу следить и корректировать работу оборудования 

 

по переменной в которой длинный селект  : если отрезать часть запроса и сделать execute то скл вернёт ошибку не правильного запроса. Тк таблица имеет всего 5 значений то даже если будет выбирать всю таблицу(не представляю что это возможно) то ничего не зависнет.

проверку на выделение памяти я поставил и после этого на этом моменте уже не вылетает!

сейчас пока проблемы с реальным временем. Как поборю — буду тестировать дальше! Вам спасибо за советы, без них как без пинка, зато потихоньку код становится лучше :)

nkYellOw
Offline
Зарегистрирован: 23.11.2015

Спасибо! Буду думать как переписать. Тут же от обратного — знал бы что не так, исправил. Знал бы как исправить — переписал. Я же написал как умею ...

nkYellOw
Offline
Зарегистрирован: 23.11.2015

А как иначе длинный селект с двумя таблицами можно засунуть в execute типа char?

что бы не выделять память сначала под ботинок типа стринг а потом выделять место под чар длинной в ботинок типа стринг. Маленький намек и я пойду читать как это сделать =))) Спасибо! :P

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

У стринга есть метод, отдающий указатель на char, например.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

nkYellOw пишет:

по переменной в которой длинный селект  : если отрезать часть запроса и сделать execute то скл вернёт ошибку не правильного запроса. 

Что мешает скостить длину запроса, юзая хранимки? https://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-stored-procedures.html

nkYellOw
Offline
Зарегистрирован: 23.11.2015

воу! это интересно! спасибо)))))))

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

Главное - года через 3-4 не забыть, где и какие части системы раскиданы ;)

nkYellOw
Offline
Зарегистрирован: 23.11.2015

Да это верно. Нужно ,как закончу,в начале скетча написать что где... Спасибо

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

Я бы сделал так - СКЛ оставил бы только на сервере, например на локальной малинке, как было вначале. Датчики сгруппировал бы в 2-3 группы, к каждой поставил бы по простенькой Ардуине, типа Нано. Наны передают данные на малинку через NRF24 или HC-12, а обратно получают команды. А уже малинка получает данные и складывает их в локальный СКЛ.

Система получается простой, дешевой, надежной. И никакого интернета между ардуинами (ну не для этого они), никаких диких СКЛ запросов.

А насчет СКЛ DIYMan прав. Запрос можно переписать раза в три короче. Выбрать короткие имена таблиц и полей. Исключить возможность NULL. чтобы на него не надо было проверять. Свести все в одну таблицу и избавится от LEFT JOIN/ Не знаю. что там у вас в базе, но практически уверен, что все эти данные можно хранить в одной линейной базе без доп таблиц и представлений.

И, кстати, реальное время тоже ардуине ни к чему. Записывайте Timestamp методами CКЛ, когда помещаете запись в базу.

 

nkYellOw
Offline
Зарегистрирован: 23.11.2015

Спасибо большое за Советы! Реальное время нужно что бы в определённое время включать оборудование. Пример: чайник на 07:30 каждое утро  а таймштамп я использую и так при занесении температуры в базу, вижу автоматом когда сделана запись

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

nkYellOw пишет:

Спасибо большое за Советы! Реальное время нужно что бы в определённое время включать оборудование.

берите время с сервера.

И мой совет - выкиньте Ethernet вовсе

nkYellOw
Offline
Зарегистрирован: 23.11.2015

Спасибо!!

nkYellOw
Offline
Зарегистрирован: 23.11.2015

Пока переписал получение настроек из СКЛ - при запуске ардуино. Убрал из лупа. Поставил луп вместо 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 + "'";

И только если есть задача, тогда разово вступает в силу верхний селект и ардуино получает все настройки по новой.

Буду тестировать, надежда умирает последней))))))

nkYellOw
Offline
Зарегистрирован: 23.11.2015

Всем привет)

В общем, сделал так:

1) Вместо малины теперь сервер на диджитал оушн.

2) исполнительную часть(обращение к скл,запросы,обработка результата) перенес на сервер. Ардуино делает запрос и получает ответ с данными. Динамическая память упала с 32% до 17%.

3) При неудачном подключении к EthernetClient (сервер) идет обновление сессии на роутере (заметил что сессия кончается и ардуино просто перестает работать). Добавил обновление сессии. Для жесткости, поставил на роутере обновление сессии раз в 5 минут что бы рповерять оборудование в жестких условиях =)

4) Время получает с сервера вместе с основными параметрами каждые 30 секунд.

5) Каждый час пишет данные с ардуино в СКЛ.

6) Стоило ввести в скл время старта ардуино, как обнаружилась перезагрузка оборудования(пару раз за все время). Поставил стабилизатор с акумом, от скачков напряжения. Есть подозрение что это были скачки напряжения, либо отключение электричества в квартире. 

Работают две ардуинки, уже 1 день и 12 часов. Проблем нет. Буду держать до 2 недель, что бы наверняка!

В общем, проблема исчерпана, всем огромное спасибо за помощь!

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

nkYellOw пишет:

3) При неудачном подключении к EthernetClient (сервер) идет обновление сессии на роутере (заметил что сессия кончается и ардуино просто перестает работать). Добавил обновление сессии. Для жесткости, поставил на роутере обновление сессии раз в 5 минут что бы рповерять оборудование в жестких условиях =)

Работают две ардуинки, уже 1 день и 12 часов. Проблем нет. Буду держать до 2 недель, что бы наверняка!

О какой сессии идет речь в п.3?

И, да, моя ENC28J60 легко могла повеситься на третью неделю ;)

nkYellOw
Offline
Зарегистрирован: 23.11.2015

Обновление аренды. Я заметил что у меня часто до суток не доживала ардуинка. Я около 3 недель искоренял из кода злые стринги и прочий мусор, который влиял на память. Потом, когда настраивал третью ардуинку на роутере, заметил что аренда у моей первой ардуины кончается через 30 минут ( а аренда стояла 24 часа)

Через 30 минут ардуино перестала работать и я связал это с арендами на роутере. При подключении к серверу, если подключение сорвалось (а оно может сорваться если сервер в дауне либо интернета нет на ардуино) то вызывается функция maintain() которая возвращает обновилась аренда или нет. А для жесткости поставил аренду на сервере на 5 минут (каждые 5 минут нужно запрашивать обновление).

Собственно, могу отключить эту функцию, оставить аренду на роутере 5 минут и проверить, вылетает или нет. Просто пока не хочется отключать оборудование,т.к. проверяю на длительность работы =)

 

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

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

maintain() - это периодически вызываемая функция. Не надо дожидаться, пока что-то там оборвется - просто каждые... Ну, минут 5 (или какая у вас критичность) ее дергайте, она обменяется пакетами с DHCP, тот продлит lease. 

nkYellOw
Offline
Зарегистрирован: 23.11.2015

Понял,круто, спасибо! =)

А если в общем лупе поставить, каждые 30 секунд? не критично так часто ее вызывать?

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

Если некуда процессорное время девать, то ставьте, конечно. Она, внутри себя еще какие-то фокусы с периодичностью проверки производит. Впритирку периодичность вызова 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. 

--------------