если проблема только в том, что идет зависание во время коннекта к серверу (или отправки данных) - может не в том месте работаете с реле? К примеру, надо отработать с реле ДО отправки данных на сервер?
Насколько я понимаю, "до отправки" не получится, потому что это независимые процессы. Выключатель нажимает человек в случайный момент времени, если сервер в это время занят коннектом - будет задержка.
Другой вопрос, что если у ТС действительно такой код, как он показал - то есть непрерывный коннект в ЛУПе - то у него эти события сталкиваются с вероятностью почти 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 подойдет?constintledPin = 13;// номер выхода, подключенного к светодиоду// Variables will change:intledState = LOW;// этой переменной устанавливаем состояние светодиодаlongpreviousMillis = 0;// храним время последнего переключения светодиодаlonginterval = 1000;// интервал между включение/выключением светодиода (1 секунда)voidsetup() {// задаем режим выхода для порта, подключенного к светодиодуpinMode(ledPin, OUTPUT);}voidloop(){// здесь будет код, который будет работать постоянно// и который не должен останавливаться на время между переключениями светоunsignedlongcurrentMillis = millis();//проверяем не прошел ли нужный интервал, если прошел тоif(currentMillis - previousMillis > interval) {// сохраняем время последнего переключенияpreviousMillis = currentMillis;// если светодиод не горит, то зажигаем, и наоборотif(ledState == LOW)ledState = HIGH;elseledState = 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 секунд стояло
#include <SPI.h> #include <Ethernet.h> String text1; String text2; String text3; String text4; String text5; String text6; String text7; String text8; byte mac[] = { 0x78, 0xAC, 0xC0, 0x0B, 0xE2,0x7B}; EthernetClient client; long channelID= 603816; // переменная номера канала фингспик String apiKey= "NRNGQCUU0BXBU9LQ"; //переменная ключа записи в фингспик const char* server= "api.thingspeak.com"; переменная адреса сервера фингспик long previousMillis= 0; // храним время последнего переключения светодиода long interval= 30000; // интервал между включение/выключением светодиода (1 секунда) void setup() { Ethernet.begin(mac); delay(1000); } void loop() { text1 = String(""); text2 = String(""); text3 = String(""); text4 = String(""); text5 = String(""); text6 = String(""); text7 = String(""); text8 = String(""); unsigned long currentMillis = millis();/ здесь будет код, который будет работать постоянно // и который не должен останавливаться на время между переключениями if(currentMillis - previousMillis > interval) //проверяем не прошел ли нужный интервал, если прошел то { previousMillis = currentMillis;// сохраняем время последнего переключения client.connect(server, 80); // соединение с сервером String postStr = apiKey; postStr += "&field1="; postStr += String(text1); postStr += "&field2="; postStr += String(text2); postStr += "&field3="; postStr += String(text3); postStr += "&field4="; postStr += String(text4); postStr += "&field5="; postStr += String(text5); postStr += "&field6="; postStr += String(text6); postStr += "&field7="; postStr += String(text7); postStr += "&field8="; postStr += String(text8); postStr += "\r\n\r\n";//возвращаем курсор в начало строки, переносим курсор на новую строку client.print("POST /update HTTP/1.1\n"); client.print("Host: api.thingspeak.com\n"); client.print("Connection: close\n"); client.print("X-THINGSPEAKAPIKEY: " + apiKey + "\n"); client.print("Content-Type: application/x-www-form-urlencoded\n"); client.print("Content-Length: "); client.print(postStr.length()); client.print("\n\n"); client.print(postStr); client.stop(); } }Изменения кода короые сделал. это строки 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. Походу там в фл проговском коде что то мешает