если проблема только в том, что идет зависание во время коннекта к серверу (или отправки данных) - может не в том месте работаете с реле? К примеру, надо отработать с реле ДО отправки данных на сервер?
Насколько я понимаю, "до отправки" не получится, потому что это независимые процессы. Выключатель нажимает человек в случайный момент времени, если сервер в это время занят коннектом - будет задержка.
Другой вопрос, что если у ТС действительно такой код, как он показал - то есть непрерывный коннект в ЛУПе - то у него эти события сталкиваются с вероятностью почти 100%.
тогда ему реально поможет отправка данных с увеличенным интервалом, например раз в минуту - задержки с включением света будут происходить в десятки раз реже.
В том то и дело, что я не понимаю. У меня опыта гораздо меньше и я основываюсь на нем. Если действительно только задержками "рулить", то я умываю руки - еще не достиг такого дзена.
Вопрос встречный - работа с реле - несколько миллисекунд (сигнал на включение/выключение реле), если "внешнее вмешательство" (работа от приложения) на прерывание повесить? По стандартам TCP коннект не должен оборваться (к примеру в середине сеанса отправки). Или порвется?
Дай бог вам здоровья и вашим близким, детям. Спасибо родителям что родили и воспитали таких хороших отзывчивых умных людей. Статья про без delay помогла по вашим советам. переделал код и все получилось. сейчас запустил в паре со своем проектом где MQTT брокер и все работает. Свет включается мгновенно.. НА фингспик тоже все удачно передается и на виртуину. Спасибо вам за помощь еще раз за ваше время. Всегда ценю таких умных людей которые еще тратят свое время на помощь.
P.S. В коде по умолчание интервал стоял на 1000мсек. работал немножко с тормозами. увеличил на 10000мсек - теперь как раньше работает все быстро релюхи
В коде по умолчание интервал стоял на 1000мсек. работал немножко с тормозами. увеличил на 10000мсек - теперь как раньше работает все быстро релюхи
10000 мс - это 10 сек - все равно мало, ставьте больше. С учетом того, что Фингспик не принимает данные чаще раза в 15 сек - менее 15 сек ставить вовсе бессмысленно. А лучше ставить 30 сек или минуту
Вчера постатвил 10 сек изначально через 30 минут все повисло. даже ардуино не реагировала н. сенсорные выключатели не нажимались. Виртуино тоже висели все показания с датчиков. Перезапускаю контролер все нормально. и опять через минут 30-40 висит все
Пришел с работы поставил 30 секунд. пока тьфу тьфу 1,5 часа прошло. вроде все хорошо
Короче опять все повисло. Видимо я не правильно на кодил))). После того как 30 сек поставил дольше продержалось все в работе. чем когда 10 секунд стояло
Изменения кода короые сделал. это строки 021 и 022. Затем с 048 по 058. Переделка была взята из примера для мигания светодиодом без delay. Если сможете подсказать где моя ошибка. В си не силен. Пардон если прошу глупую помощь ( Си не знаю толком)
Ну, тут может и на стороне FLProg-a проблема быть. Остаётся только долго и упорно тыкать в это палкой.
Например: эксперимент показал, что код с коннектом на thingspeak всё зависает в течении полутора часов. Значит делаем следующее - вычисляем "на глазок" время выполнения фрагмента от коннекта до стопа (просто разницу между двумя вызовами millis() вычисляем). Затем весь блок с коннектом заменяем на delay(время_на_глазок). Запускаем. Ждём. За день не повисло - значит скорее всего проблема не в этом блоке, а в остальном коде.
Но для начала я бы ещё избавился от String. Просто поменяйте на кучу println(). Может под String тупо памяти не хватает.
А может millis переполниться? я читал что может. Например когда интервал стоял 10 секунд то через полчаса все повисло. а когда 30сек то через 1,5часа.
"не повисло" читать как "повисло". Т.е. поменяли подозрительный блок кода на дилей, а девайс всё равно вешается. Значит проблема не подозрительном фрагменте.
А миллис... ну, конечно может. Любая целочисленная беззнаковая переменная переполняется. А чем это пугает?
Проблемы с миллис начинаются не ранее 49-го дня, так что тут нечего переживать.
Ну примерно через это время произойдет переполнение и он как раз сам и сбросится. А вообще я не считал сколько дней миллис отсчитывает, как не не надо было...
Сейчас уже боле 3 часов работает без единого зависания.. ЗАпустил чисто код конекта и реле с датчиками температуры (без когда где MQTT). ДЕлей неставил. оставил millis. Походу там в фл проговском коде что то мешает
Sadman41 Этот пример Мигание светодиодом без delay подойдет?
const
int
ledPin = 13;
// номер выхода, подключенного к светодиоду
// Variables will change:
int
ledState = LOW;
// этой переменной устанавливаем состояние светодиода
long
previousMillis = 0;
// храним время последнего переключения светодиода
long
interval = 1000;
// интервал между включение/выключением светодиода (1 секунда)
void
setup() {
// задаем режим выхода для порта, подключенного к светодиоду
pinMode(ledPin, OUTPUT);
}
void
loop()
{
// здесь будет код, который будет работать постоянно
// и который не должен останавливаться на время между переключениями свето
unsigned
long
currentMillis = millis();
//проверяем не прошел ли нужный интервал, если прошел то
if
(currentMillis - previousMillis > interval) {
// сохраняем время последнего переключения
previousMillis = currentMillis;
// если светодиод не горит, то зажигаем, и наоборот
if
(ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
// устанавливаем состояния выхода, чтобы включить или выключить светодиод
digitalWrite(ledPin, ledState);
}
}
если проблема только в том, что идет зависание во время коннекта к серверу (или отправки данных) - может не в том месте работаете с реле? К примеру, надо отработать с реле ДО отправки данных на сервер?
Насколько я понимаю, "до отправки" не получится, потому что это независимые процессы. Выключатель нажимает человек в случайный момент времени, если сервер в это время занят коннектом - будет задержка.
Другой вопрос, что если у ТС действительно такой код, как он показал - то есть непрерывный коннект в ЛУПе - то у него эти события сталкиваются с вероятностью почти 100%.
тогда ему реально поможет отправка данных с увеличенным интервалом, например раз в минуту - задержки с включением света будут происходить в десятки раз реже.
В том то и дело, что я не понимаю. У меня опыта гораздо меньше и я основываюсь на нем. Если действительно только задержками "рулить", то я умываю руки - еще не достиг такого дзена.
Вопрос встречный - работа с реле - несколько миллисекунд (сигнал на включение/выключение реле), если "внешнее вмешательство" (работа от приложения) на прерывание повесить? По стандартам TCP коннект не должен оборваться (к примеру в середине сеанса отправки). Или порвется?
Cesium137 - этот пример подойдет
Дай бог вам здоровья и вашим близким, детям. Спасибо родителям что родили и воспитали таких хороших отзывчивых умных людей. Статья про без delay помогла по вашим советам. переделал код и все получилось. сейчас запустил в паре со своем проектом где MQTT брокер и все работает. Свет включается мгновенно.. НА фингспик тоже все удачно передается и на виртуину. Спасибо вам за помощь еще раз за ваше время. Всегда ценю таких умных людей которые еще тратят свое время на помощь.
P.S. В коде по умолчание интервал стоял на 1000мсек. работал немножко с тормозами. увеличил на 10000мсек - теперь как раньше работает все быстро релюхи
В коде по умолчание интервал стоял на 1000мсек. работал немножко с тормозами. увеличил на 10000мсек - теперь как раньше работает все быстро релюхи
10000 мс - это 10 сек - все равно мало, ставьте больше. С учетом того, что Фингспик не принимает данные чаще раза в 15 сек - менее 15 сек ставить вовсе бессмысленно. А лучше ставить 30 сек или минуту
Вчера постатвил 10 сек изначально через 30 минут все повисло. даже ардуино не реагировала н. сенсорные выключатели не нажимались. Виртуино тоже висели все показания с датчиков. Перезапускаю контролер все нормально. и опять через минут 30-40 висит все
Пришел с работы поставил 30 секунд. пока тьфу тьфу 1,5 часа прошло. вроде все хорошо
Короче опять все повисло. Видимо я не правильно на кодил))). После того как 30 сек поставил дольше продержалось все в работе. чем когда 10 секунд стояло
Изменения кода короые сделал. это строки 021 и 022. Затем с 048 по 058. Переделка была взята из примера для мигания светодиодом без delay. Если сможете подсказать где моя ошибка. В си не силен. Пардон если прошу глупую помощь ( Си не знаю толком)
Ну, тут может и на стороне FLProg-a проблема быть. Остаётся только долго и упорно тыкать в это палкой.
Например: эксперимент показал, что код с коннектом на thingspeak всё зависает в течении полутора часов. Значит делаем следующее - вычисляем "на глазок" время выполнения фрагмента от коннекта до стопа (просто разницу между двумя вызовами millis() вычисляем). Затем весь блок с коннектом заменяем на delay(время_на_глазок). Запускаем. Ждём. За день не повисло - значит скорее всего проблема не в этом блоке, а в остальном коде.
Но для начала я бы ещё избавился от String. Просто поменяйте на кучу println(). Может под String тупо памяти не хватает.
Хорошо попробую поменять как сказали.
А может millis переполниться? я читал что может. Например когда интервал стоял 10 секунд то через полчаса все повисло. а когда 30сек то через 1,5часа.
Хорошо попробую поменять как сказали.
А может millis переполниться? я читал что может. Например когда интервал стоял 10 секунд то через полчаса все повисло. а когда 30сек то через 1,5часа.
Если миллис переполница, ардуина взорвецанах. У кого миллис переполнился, на форуме больше не паявляюца. Осторожнее с миллис.
Хорошо попробую поменять как сказали.
А может millis переполниться? я читал что может. Например когда интервал стоял 10 секунд то через полчаса все повисло. а когда 30сек то через 1,5часа.
"не повисло" читать как "повисло". Т.е. поменяли подозрительный блок кода на дилей, а девайс всё равно вешается. Значит проблема не подозрительном фрагменте.
А миллис... ну, конечно может. Любая целочисленная беззнаковая переменная переполняется. А чем это пугает?
Проблемы с миллис начинаются не ранее 49-го дня, так что тут нечего переживать.
После 49того дня миллис сам не сбросится я так понял. Тоесть его нужно как то сбрасывать? НАпример перезапуском ардуино
Ну примерно через это время произойдет переполнение и он как раз сам и сбросится. А вообще я не считал сколько дней миллис отсчитывает, как не не надо было...
После 49того дня миллис сам не сбросится я так понял. Тоесть его нужно как то сбрасывать? НАпример перезапуском ардуино
сбросится сам, ничего делать не нужно.
у меня температрный датчик на Аттини с прошлого ноября работает без ресета
Сейчас уже боле 3 часов работает без единого зависания.. ЗАпустил чисто код конекта и реле с датчиками температуры (без когда где MQTT). ДЕлей неставил. оставил millis. Походу там в фл проговском коде что то мешает