Официальный сайт компании Arduino по адресу arduino.cc
Ethernet Shield W5100 + ThingSpeak = Зависает включение реле
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Втр, 08/10/2019 - 23:41
#include <SPI.h> #include <Ethernet.h> byte mac[] = { 0x78, 0xAC, 0xC0, 0x0B, 0xE2,0x7B}; EthernetClient client; long channelID= 603816; String apiKey= "NRNGQCUU0BXBU9LQ"; //int duration=0; //Если переменной duration присваиваю большее значение то зависание реле увеличивается по времени поэтому убрал строку const char* server= "api.thingspeak.com"; viod setup() { Ethernet.begin(mac); delay(1000); } viod loop() { if (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(); //delay(duration*1); убрал строку так как она увеличивает задержку включения реле
Зависает, похоже, на время отправки информации на сайт.
Подозревал то что вы ответили. А как можно это устранить? Может подскажете если не трудно какие строки кода написать? Правда в си языке не силен. Умный дом полностью реализован в FLProge но выше изложенный код это не флпроговский - здесь на форуме такое не приветствуют)
Дело в том что когда все работает без того кода то есть ардуино соединяется с брокером MQTT а Virtuino-й я считываю данные - то реле не зависает
Как можно подсказать, если не видишь как работает весь код? У вас же тут представлен только код отправки на сервер (и тот не скомпилируется).
Дело в том что когда все работает без того кода то есть ардуино соединяется с брокером MQTT а Virtuino-й я считываю данные - то реле не зависает
ИМХО, если у вас реле управляет тот же контроллер, что отправляет данные по сети - то ничего вы не сделаете, при задержках коннекта будет виснуть. Разводите эти задачи на разные МК.
Да тут не понятно как именно "оно взаимодействует". Если как я предполагаю, то все реально. Но кода не видно, хз что там на самом деле.
Мне нужен и менно код функционирующий для отправки данных на сервер . Сейчас исправлю и пришлю код который будет компилироваться
но с использованием MQTT брокера и реле работает и отправка . И все на одном контролере
b707 прав - на однопроцессорной системе с блокирующими библиотеками сделать что-то параллельно с процессом ожидания коннекта практически невозможно.
Почему с MQTT работает? А потому что там persistent connection на 98% вероятности и коннект устанавливается только тогда, когда сокет находится в состоянии Closed, а то и вообще один раз (кода не вижу, но догадываюсь). В Вашем примере кроме ожидания самого коннекта, есть еще процедура ресолва доменного имени в IP-адрес. Т.е. еще один этап тупого ожидания в пустом цикле. И эти два пожирателя времени запускается каждый проход loop() .
Почему с MQTT работает? А потому что там persistent connection на 98% вероятности и коннект устанавливается только тогда, когда сокет находится в состоянии Closed, а то и вообще один раз
к тому же подохреваю, что MQTT сервер у ТС стоит в его же сети(надеюсь он не управляет комнатными выключателями через внешний интернет :), а Thigspeak.com как бы не на другом континенте... Время коннекта по локалке и в "дальнем" инете может отличаться на порядки.
мой MQTT customer.cloudmqtt.com находится как там писали на сайте в Вирджинии США
Выключателями тоже управляет. Сам свет включается мгновенно. А обратная связь то есть состояние что свет в ключен на мобильнике (индикатор графический) срабатывает с задержкой 1-2 секунды
А можно в этом коде сделать так как в MQTT как вы писали в сообщении "persistent connection"
держать "персистент коннекшион" с Thinspeak? - а тамошний админ согласится? :)
Если серьезно - ставлю на то, что при такой попытке Thingspeak.com отрубит ваше соединение менее чем через минуту по таймауту. У них сотни тысяч, если не миллионы, подписчиков, держать с каждым соединение никаких ресурсов не хватит.
А что Вы пихаете на этот thingspeak? Требуют ли эти данные публикации по два раза в секунду?
Выключателями тоже управляет. Сам свет включается мгновенно. А обратная связь то есть состояние что свет в ключен на мобильнике (индикатор графический) срабатывает с задержкой 1-2 секунды
Один выключатель, понятно, включается мгновенно, потому что контроллер сначала его включает, а потом шлет запрос MQTT. А вы попробуйте щелкнуть двумя разными выключателями одновременно - вполне возможно второй сработает только спустя те самые 1-2 секунды
Честно сказать я всех тонкостей не знаю. Но спасибо вам за уделеное время и советы. ТАк то у меня ве прерксно работает. но хоте чтобы показания с датчиков фиксировались в фингспике чтобы я потом через виртуино мог их считать или считать с саомго сайта фингспик
неспорю с вами. но не пробовал так делать.
Публикуйте показания датчиков раз в полминуты, например. Или только по изменению значений метрик.
А что Вы пихаете на этот thingspeak? Требуют ли эти данные публикации по два раза в секунду?
надеюсь это не реальный скетч - не крутит же ТС коннект с Фингспик непрерывно в Лупе. Да и на самом Фингспике, насколько я помню, запрет на посылку данных чаще 1 раза в 15 секунд.
Запрет на публикацию, но не на коннект. Return code тут не анализируется.
Хочу поделиться как у меня устроен на мобиле мой не большой умный дом
Запрет на публикацию, но не на коннект. Return code тут не анализируется.
это бесполезность в квадрате... Обновлять данные со скоростью ЛУП - уже излишне, а уж впустую тыркаться в сервер - совсем за гранью :)
Я далеко не гений, но где в этом коде работа с реле? Или MQTT? Вам помощь нужна или что? Хрен с ним, с засвеченым кодом API, оно никому нахрен не нужно.... Или что вы скрываете?
Пихаю показания с датчиков. да там не реже 15 секунд. Я в коде не приводил подключенные датчики. Потому что делаю все в FLPROGE а там код не совсем читаемый для программистов. мне однажды сделали замечание на форуме тут
Хочу поделиться как у меня устроен на мобиле мой не большой умный дом
Это к первоначальному вопросу вообще никакого отношения не имеет.
а как этот интервал должен выглядеть то есть строчка кода как пишется?
Пихаю показания с датчиков. да там не реже 15 секунд. Я в коде не приводил подключенные датчики. Потому что делаю все в FLPROGE а там код не совсем читаемый для программистов. мне однажды сделали замечание на форуме тут
Кажется мне, вот иногда так бывает, что управление реле по типу "включи, ну или выключи". Или очень сложный алгоритм?
я знаю. прошу извенить
Хочу поделиться как у меня устроен на мобиле мой не большой умный дом
Это к первоначальному вопросу вообще никакого отношения не имеет.
Строчка кода пишется кодом, в семантике C++ приобладающе...
я знаю. прошу извенить
Да вставь уже весь код, отдели только где что комментариями (для упрощения прочтения).
Я делаю все в фл проге. поэтому не включил реле и датчики. сами понимаете код флпроговский - код франкенштейна. Решил скинуть код для подключения к серверу. может в нем есть недоработка. поэтому обратился на форум.
Да вставь уже весь код, отдели только где что комментариями (для упрощения прочтения).
BOOM, он может вставить код, только не жалуйтесь потом :) У ТС код из FLProg, что-либо длиннее обычного блинка разбирать в этом коде абсолютно бесполезно.
Алгоритм простой. Стоит сенсорный выключатель (датчик касания) - включает реле через ТТ-тригер- нажал включено еще раз нажал то выключено. Но могу еще с мобилы выключать включать. а там уже через компонент такой XOR называется - он дает разграничение. то есть мобилой выключу свет а сенсором который на стене включу и наоборот
Что-то мне так кажется, из вас доктор по типу - болит голова? Голову с плеч! Не понятно же, что у вас там и как происходит (и как вы в том бардаке ориентируетесь?)? Ведь если проблема только в том, что идет зависание во время коннекта к серверу (или отправки данных) - может не в том месте работаете с реле? К примеру, надо отработать с реле ДО отправки данных на сервер? Или это не возможно сделать, по хрен знает какой причине - потому что flprog вам запретил ее рассказывать? В общем, если хотите быстро, сразу и бесплатно, то либо купите готовое решение, либо так же и тыкайте пока не получится результат. По статистике вероятности написать войну и мир могут даже обезьяны, только там сочетаний и повторений, умереть можно....
Да вставь уже весь код, отдели только где что комментариями (для упрощения прочтения).
BOOM, он может вставить код, только не жалуйтесь потом :) У ТС код из FLProg, что-либо длиннее обычного блинка разбирать в этом коде абсолютно бесполезно.
Да я представляю себе этот бардак, не знаю как ТС в нем ориентируется. Но понимать же алгоритм нужно.
Я делаю все в фл проге. поэтому не включил реле и датчики. сами понимаете код флпроговский - код франкенштейна. Решил скинуть код для подключения к серверу. может в нем есть недоработка. поэтому обратился на форум.
Cesium137 - а как вы встраиваете этот код в FLProg? - вы же не можете на одном МК запустить два скетча
вот и я о том же. я понимаю что и код вы не видите и помощь прошу у вас. думал может в моем приложенном нормальном коде (не флпроговском) там можно какое то разграничение сделать между запросом на сервер и включением реле. Прошу извенить если выпытваю у вас невозможное
Алгоритм простой. Стоит сенсорный выключатель (датчик касания) - включает реле через ТТ-тригер- нажал включено еще раз нажал то выключено. Но могу еще с мобилы выключать включать. а там уже через компонент такой XOR называется - он дает разграничение. то есть мобилой выключу свет а сенсором который на стене включу и наоборот
А эта вся хрень ДО момента отправки на сервер, ВО время отправки, или ПОСЛЕ? Или еще какой вариант?
вот и я о том же. я понимаю что и код вы не видите и помощь прошу у вас. думал может в моем приложенном нормальном коде (не флпроговском) там можно какое то разграничение сделать между запросом на сервер и включением реле. Прошу извенить если выпытваю у вас невозможное
Ну вот сам и пришел к нашему выводу - непонятно что править, где и как ))
я скачал блок пользователя для ФлПрог. блок по отправки данных на Фингспик но он изначально заточен под ESP 8266. А у меня ЕзернетШилд W5100. Я его немного переделал. только часть - под Езернет. У меня получилось связатьсяя с Фингспиком. Все работает. кроме реле тормозят..
если проблема только в том, что идет зависание во время коннекта к серверу (или отправки данных) - может не в том месте работаете с реле? К примеру, надо отработать с реле ДО отправки данных на сервер?
Насколько я понимаю, "до отправки" не получится, потому что это независимые процессы. Выключатель нажимает человек в случайный момент времени, если сервер в это время занят коннектом - будет задержка.
Другой вопрос, что если у ТС действительно такой код, как он показал - то есть непрерывный коннект в ЛУПе - то у него эти события сталкиваются с вероятностью почти 100%.
тогда ему реально поможет отправка данных с увеличенным интервалом, например раз в минуту - задержки с включением света будут происходить в десятки раз реже.
Еще сделал так. основную схему умного дома убрал где под MQTT все сделано. Оставил только датчики температуры и релюхи с сенсорными выключателями ну и тот код который приводил ( код этот он внутри блока для отправки данных на Фингспик.) и все равно все тормозит. Я раньше думал что MQTT мешает нормальной работе реле. оКазалось и без него такая же фигня
Cesium137 - сделайте задержку между отправками раз в минуту - тогда посмотрим. Есть вероятность, что проблема уйдет вовсе.
Cesium, берёте и в поиск забиваете "blink без delay". Там будет строчек пять кода и условие. Внутрь условия суете коннект и отправку метрик на thingspeak. Это самое реальное, что можно в Вашей ситуации сделать малой кровью.
там в коже есть две строки отвечающие за время отправки. если я их разкоменчю и увеличу значения переменной duration то задержка реле увеличится еще больше. если строки закоментил то задержка минимальна примерно раз в 2-3 секунды тоесть каснулся либо сразу сработает реле либо в течении 2-3 секунд надо тыкать по сенсорнику и тогда сработает
Спасибо большое за совет. сейчас попробую
в моем коде представленном есть такая строка отвечающая за задержку между отправками. ?