Ethernet Shield W5100 + ThingSpeak = Зависает включение реле

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016
#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); убрал строку так как она увеличивает задержку включения реле

 

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016
Всем привет. Делаю умный дом.  Оборудование: контролер Arduino Mega, Ethernet Shield W5100.
 
Изначально работает все через  MQTT  брокер (не ThingSpeak) с использованием приложения Виртуино MQTT/
 
РАботает все прекрасно и быстро без нареканий.
 
Решил сделать считывание показаний с датчиков на сайт ThingSpeak.com
 
После использования приложенного кода -  зависает реле освещения в дома, когда нажимаю на сенсорный выключатель
 
Зависает так - срабатывает то сразу то с задержкой. а датчики в приложении Virtuino MQTT  считываются тормозами
 
Данные с ардуино на ThingSpeak  успешно передаются а также прекрасно считываются графики приложением VirtuinoMQTT.
 
Если не использую данный представленный код, то реле не зависает. 
 
P.S. Зависает даже если оставляю в скетче данный код +  включение реле через сенсорные выключатели и датчики температуры.
 
Если сможете помогите . ЗАранее вам спасибо большое друзья
BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Зависает, похоже, на время отправки информации на сайт. 

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

Подозревал то что вы ответили. А как можно это устранить? Может подскажете если не трудно какие строки кода написать? Правда в си языке не силен. Умный дом полностью реализован в FLProge  но выше изложенный код это не флпроговский - здесь на форуме такое не приветствуют)

Дело в том что когда все работает без того кода то есть  ардуино соединяется с брокером MQTT  а Virtuino-й я считываю данные - то реле не зависает 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Как можно подсказать, если не видишь как работает весь код? У вас же тут представлен только код отправки на сервер (и тот не скомпилируется).

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

Cesium137 пишет:

Дело в том что когда все работает без того кода то есть  ардуино соединяется с брокером MQTT  а Virtuino-й я считываю данные - то реле не зависает 

ИМХО, если у вас реле управляет тот же контроллер, что отправляет данные по сети - то ничего вы не сделаете, при задержках коннекта будет виснуть. Разводите эти задачи на разные МК.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Да тут не понятно как именно "оно взаимодействует". Если как я предполагаю, то все реально. Но кода не видно, хз что там на самом деле.

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

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

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

но с использованием MQTT брокера и реле работает и отправка . И все на одном контролере

sadman41
Онлайн
Зарегистрирован: 19.10.2016

b707 прав - на однопроцессорной системе с блокирующими библиотеками сделать что-то параллельно с процессом ожидания коннекта практически невозможно. 

Почему с MQTT работает? А потому что там persistent connection на 98% вероятности и коннект устанавливается только тогда, когда сокет находится в состоянии Closed, а то и вообще один раз (кода не вижу, но догадываюсь). В Вашем примере кроме ожидания самого коннекта, есть еще процедура ресолва доменного имени в IP-адрес. Т.е. еще один этап тупого ожидания в пустом цикле. И эти два пожирателя времени запускается каждый проход loop() .

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

sadman41 пишет:

Почему с MQTT работает? А потому что там persistent connection на 98% вероятности и коннект устанавливается только тогда, когда сокет находится в состоянии Closed, а то и вообще один раз

к тому же подохреваю, что MQTT сервер у ТС стоит в его же сети(надеюсь он не управляет комнатными выключателями через внешний интернет :), а Thigspeak.com как бы не на другом континенте... Время коннекта по локалке и в "дальнем" инете может отличаться на порядки.

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016
А можно в этом коде сделать так как в MQTT как вы писали в сообщении "persistent connection на 98%..."
#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=  603566; // Change this to your channel ID.//нет в коде
String apiKey= "NRNGQCUU0BXBU9AR"; //API key from ThingSpeak channel
//int duration=5; //эту строку убрал. она увеличивает время на включение реле 
const char* server= "api.thingspeak.com";
void setup()
{
Ethernet.begin(mac);
 delay(1000);

 



  
}
void loop()
{




//Плата:1
text1 = String("");
text2 = String("");
text3 = String("");
text4 = String("");
text5 = String("");
text6 = String("");
text7 = String("");
text8 = String("");

 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*1000);// убрал строку . она увеличивает время срабатывание реле
  
  }
}

 

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

мой MQTT  customer.cloudmqtt.com находится как там писали на сайте в Вирджинии США

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

Выключателями тоже управляет. Сам свет включается мгновенно. А обратная связь то есть состояние что свет в ключен на мобильнике (индикатор графический) срабатывает с задержкой 1-2 секунды

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

Cesium137 пишет:

А можно в этом коде сделать так как в MQTT как вы писали в сообщении "persistent connection"

держать "персистент коннекшион" с Thinspeak? - а тамошний админ согласится? :)

Если серьезно - ставлю на то, что при такой попытке Thingspeak.com отрубит ваше соединение менее чем через минуту по таймауту. У них сотни тысяч, если не миллионы, подписчиков, держать с каждым соединение никаких ресурсов не хватит.

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

sadman41
Онлайн
Зарегистрирован: 19.10.2016

А что Вы пихаете на этот thingspeak? Требуют ли эти данные публикации по два раза в секунду?

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

Cesium137 пишет:

Выключателями тоже управляет. Сам свет включается мгновенно. А обратная связь то есть состояние что свет в ключен на мобильнике (индикатор графический) срабатывает с задержкой 1-2 секунды

Один выключатель, понятно, включается мгновенно, потому что контроллер сначала его включает, а потом шлет запрос MQTT. А вы попробуйте щелкнуть двумя разными выключателями одновременно - вполне возможно второй сработает только спустя те самые 1-2 секунды

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

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

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

неспорю с вами. но не пробовал так делать.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Публикуйте показания датчиков раз в полминуты, например. Или только по изменению значений метрик.

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

sadman41 пишет:

А что Вы пихаете на этот thingspeak? Требуют ли эти данные публикации по два раза в секунду?

надеюсь это не реальный скетч - не крутит же ТС коннект с Фингспик непрерывно в Лупе. Да и на самом Фингспике, насколько я помню, запрет на посылку данных чаще 1 раза в 15 секунд.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Запрет на публикацию, но не на коннект. Return code тут не анализируется.

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

Хочу поделиться как у меня устроен на мобиле мой не большой умный дом

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

sadman41 пишет:

Запрет на публикацию, но не на коннект. Return code тут не анализируется.

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

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Cesium137 пишет:

А можно в этом коде сделать так как в MQTT как вы писали в сообщении "persistent connection на 98%..."
#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=  603566; // Change this to your channel ID.//нет в коде
String apiKey= "NRNGQCUU0BXBU9AR"; //API key from ThingSpeak channel
//int duration=5; //эту строку убрал. она увеличивает время на включение реле 
const char* server= "api.thingspeak.com";
void setup()
{
Ethernet.begin(mac);
 delay(1000);

 



  
}
void loop()
{




//Плата:1
text1 = String("");
text2 = String("");
text3 = String("");
text4 = String("");
text5 = String("");
text6 = String("");
text7 = String("");
text8 = String("");

 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*1000);// убрал строку . она увеличивает время срабатывание реле
  
  }
}

 

Я далеко не гений, но где в этом коде работа с реле? Или MQTT? Вам помощь нужна или что? Хрен с ним, с засвеченым кодом API, оно никому нахрен не нужно.... Или что вы скрываете?

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

Пихаю показания с датчиков. да там не реже 15 секунд. Я в коде не приводил подключенные датчики. Потому что делаю все в FLPROGE  а там код не совсем читаемый для программистов. мне однажды сделали замечание на форуме тут

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Cesium137 пишет:

Хочу поделиться как у меня устроен на мобиле мой не большой умный дом

Это к первоначальному вопросу вообще никакого отношения не имеет.

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

а как этот интервал должен выглядеть  то есть строчка кода как пишется?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Cesium137 пишет:

Пихаю показания с датчиков. да там не реже 15 секунд. Я в коде не приводил подключенные датчики. Потому что делаю все в FLPROGE  а там код не совсем читаемый для программистов. мне однажды сделали замечание на форуме тут

Кажется мне, вот иногда так бывает, что управление реле по типу "включи, ну или выключи". Или очень сложный алгоритм?

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

я знаю. прошу извенить

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

BOOM пишет:

Cesium137 пишет:

Хочу поделиться как у меня устроен на мобиле мой не большой умный дом

Это к первоначальному вопросу вообще никакого отношения не имеет.

Строчка кода пишется кодом, в семантике C++ приобладающе...

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Cesium137 пишет:

я знаю. прошу извенить

Да вставь уже весь код, отдели только где что комментариями (для упрощения прочтения).

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

Я делаю все в фл проге. поэтому не включил реле и датчики. сами понимаете код флпроговский - код франкенштейна. Решил скинуть код  для подключения к серверу. может в нем есть недоработка. поэтому обратился на форум. 

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

BOOM пишет:

Да вставь уже весь код, отдели только где что комментариями (для упрощения прочтения).

BOOM, он может вставить код,  только не жалуйтесь потом :) У ТС код из FLProg, что-либо длиннее обычного блинка разбирать в этом коде абсолютно бесполезно.

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

Алгоритм простой. Стоит сенсорный выключатель (датчик касания) - включает реле через ТТ-тригер- нажал включено еще раз нажал то выключено. Но могу еще с мобилы выключать включать. а там уже через компонент такой XOR  называется - он дает разграничение. то есть мобилой выключу свет а сенсором который на стене включу и наоборот

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Что-то мне так кажется, из вас доктор по типу - болит голова? Голову с плеч! Не понятно же, что у вас там и как происходит (и как вы в том бардаке ориентируетесь?)? Ведь если проблема  только в том, что идет зависание во время коннекта к серверу (или отправки данных) - может не в том месте работаете с реле? К примеру, надо отработать с реле ДО отправки данных на сервер? Или это не возможно сделать, по хрен знает какой причине - потому что flprog вам запретил ее рассказывать? В общем, если хотите быстро, сразу и бесплатно, то либо купите готовое решение, либо так же и тыкайте пока не получится результат. По статистике вероятности написать войну и мир могут даже обезьяны, только там сочетаний и повторений,  умереть можно....

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

b707 пишет:

BOOM пишет:

Да вставь уже весь код, отдели только где что комментариями (для упрощения прочтения).

BOOM, он может вставить код,  только не жалуйтесь потом :) У ТС код из FLProg, что-либо длиннее обычного блинка разбирать в этом коде абсолютно бесполезно.

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

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

Cesium137 пишет:

Я делаю все в фл проге. поэтому не включил реле и датчики. сами понимаете код флпроговский - код франкенштейна. Решил скинуть код  для подключения к серверу. может в нем есть недоработка. поэтому обратился на форум. 

Cesium137 - а как вы встраиваете этот код в FLProg? - вы же не можете на одном МК запустить два скетча

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

вот и я о том же. я понимаю что и код вы не видите и помощь прошу у вас. думал может в моем приложенном нормальном коде (не флпроговском) там можно какое то разграничение сделать между запросом на сервер и включением реле. Прошу извенить если выпытваю у вас невозможное

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Cesium137 пишет:

Алгоритм простой. Стоит сенсорный выключатель (датчик касания) - включает реле через ТТ-тригер- нажал включено еще раз нажал то выключено. Но могу еще с мобилы выключать включать. а там уже через компонент такой XOR  называется - он дает разграничение. то есть мобилой выключу свет а сенсором который на стене включу и наоборот

А эта вся хрень ДО момента отправки на сервер, ВО время отправки, или ПОСЛЕ? Или еще какой вариант?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Cesium137 пишет:

вот и я о том же. я понимаю что и код вы не видите и помощь прошу у вас. думал может в моем приложенном нормальном коде (не флпроговском) там можно какое то разграничение сделать между запросом на сервер и включением реле. Прошу извенить если выпытваю у вас невозможное

Ну вот сам и пришел к нашему выводу - непонятно что править, где и как ))

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

я скачал блок пользователя для ФлПрог. блок по отправки данных на Фингспик но он изначально заточен под ESP 8266. А у меня ЕзернетШилд W5100. Я его немного переделал. только часть - под Езернет. У меня получилось связатьсяя с Фингспиком. Все работает. кроме реле тормозят..

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

BOOM пишет:

 если проблема  только в том, что идет зависание во время коннекта к серверу (или отправки данных) - может не в том месте работаете с реле? К примеру, надо отработать с реле ДО отправки данных на сервер?

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

Другой вопрос, что если у ТС действительно такой код, как он показал - то есть непрерывный коннект в ЛУПе - то у него эти события сталкиваются с вероятностью почти 100%.

тогда ему реально поможет отправка данных с увеличенным интервалом, например раз в минуту - задержки с включением света будут происходить в десятки раз реже.

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

Еще сделал так. основную схему умного дома убрал где под MQTT  все сделано. Оставил только датчики температуры и релюхи с сенсорными выключателями ну и тот код который приводил ( код этот он внутри блока для отправки данных на Фингспик.) и все равно все тормозит. Я раньше думал что MQTT  мешает нормальной работе реле. оКазалось и без него такая же фигня

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

Cesium137 - сделайте задержку между отправками раз в минуту - тогда посмотрим. Есть вероятность, что проблема уйдет вовсе.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Cesium, берёте и в поиск забиваете "blink без delay". Там будет строчек пять кода и условие. Внутрь условия суете коннект и отправку метрик на thingspeak. Это самое реальное, что можно в Вашей ситуации сделать малой кровью.

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

там в коже есть две строки отвечающие за время отправки. если я их разкоменчю и увеличу значения переменной duration то задержка реле увеличится еще больше. если строки закоментил то задержка минимальна примерно раз в 2-3 секунды  тоесть каснулся либо сразу сработает реле либо в течении 2-3 секунд надо тыкать по сенсорнику и тогда сработает

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

Спасибо большое за совет. сейчас попробую

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016

в моем коде представленном есть такая строка отвечающая за задержку между отправками. ?