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

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016
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);
  }
}

 

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

b707 пишет:

BOOM пишет:

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

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

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

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

В том то и дело, что я не понимаю. У меня опыта гораздо меньше и я основываюсь на нем. Если действительно только задержками "рулить", то я умываю руки - еще не достиг такого дзена.

Вопрос встречный - работа с реле - несколько миллисекунд (сигнал на включение/выключение реле), если "внешнее вмешательство" (работа от приложения) на прерывание повесить? По стандартам TCP коннект не должен оборваться (к примеру в середине сеанса отправки). Или порвется?

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

Cesium137 - этот пример подойдет

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

Дай бог вам здоровья и вашим близким, детям. Спасибо родителям что родили и воспитали таких хороших отзывчивых умных людей. Статья про без  delay  помогла по вашим советам. переделал код и все получилось. сейчас запустил в паре со своем проектом где MQTT  брокер и все работает. Свет включается мгновенно.. НА фингспик тоже все удачно передается и на виртуину. Спасибо вам за помощь еще раз за ваше время. Всегда ценю таких умных людей которые еще тратят свое время на помощь.

P.S. В коде по умолчание интервал стоял на 1000мсек. работал немножко с тормозами. увеличил на 10000мсек - теперь как раньше работает все быстро релюхи

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

Cesium137 пишет:

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

10000 мс - это 10 сек - все равно мало, ставьте больше. С учетом того, что Фингспик не принимает данные чаще раза в 15 сек - менее 15 сек ставить вовсе бессмысленно. А лучше ставить 30 сек или минуту

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

Вчера постатвил 10 сек изначально через 30 минут все повисло. даже ардуино не реагировала н. сенсорные выключатели не нажимались. Виртуино тоже висели все показания с датчиков. Перезапускаю контролер все нормально. и опять через минут 30-40 висит все

Пришел с работы поставил 30 секунд. пока тьфу тьфу 1,5 часа прошло. вроде все хорошо

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

Короче опять все повисло. Видимо я не правильно на кодил))). После того как 30 сек поставил дольше продержалось все в работе. чем когда 10 секунд стояло

Cesium137
Cesium137 аватар
Offline
Зарегистрирован: 13.12.2016
#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();

  
  }
}

 

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

Изменения кода короые сделал. это строки 021 и 022. Затем с 048 по 058.  Переделка была взята из примера для мигания светодиодом без delay. Если сможете подсказать где моя ошибка. В си не силен. Пардон если прошу глупую помощь ( Си не знаю толком)

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

Ну, тут может и на стороне FLProg-a проблема быть.  Остаётся только долго и упорно тыкать в это палкой.

Например: эксперимент показал, что код с коннектом на thingspeak всё зависает в течении полутора часов. Значит делаем следующее - вычисляем "на глазок" время выполнения фрагмента от коннекта до стопа (просто разницу между двумя вызовами millis() вычисляем). Затем весь блок с коннектом заменяем на delay(время_на_глазок). Запускаем. Ждём. За день не повисло - значит скорее всего проблема не в этом блоке, а в остальном коде.

Но для начала я бы ещё избавился от String. Просто поменяйте на кучу println(). Может под String тупо памяти не хватает.

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

Хорошо попробую поменять как сказали.

А может millis  переполниться? я читал что может. Например когда интервал стоял 10 секунд то через полчаса все повисло. а когда 30сек то через 1,5часа. 

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Cesium137 пишет:

Хорошо попробую поменять как сказали.

А может millis  переполниться? я читал что может. Например когда интервал стоял 10 секунд то через полчаса все повисло. а когда 30сек то через 1,5часа. 

Если миллис переполница, ардуина взорвецанах.  У кого миллис переполнился, на форуме больше не паявляюца. Осторожнее с миллис. 

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

Cesium137 пишет:

Хорошо попробую поменять как сказали.

А может millis  переполниться? я читал что может. Например когда интервал стоял 10 секунд то через полчаса все повисло. а когда 30сек то через 1,5часа. 

"не повисло" читать как "повисло". Т.е. поменяли подозрительный блок кода на дилей, а девайс всё равно вешается. Значит проблема не подозрительном фрагменте.

А миллис... ну, конечно может. Любая целочисленная беззнаковая переменная переполняется. А чем это пугает?

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

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

После 49того дня миллис сам не сбросится я так понял. Тоесть его нужно как то сбрасывать? НАпример перезапуском ардуино

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

Ну примерно через это время произойдет переполнение и он как раз сам и сбросится. А вообще я не считал сколько дней миллис отсчитывает, как не не надо было...

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

Cesium137 пишет:

После 49того дня миллис сам не сбросится я так понял. Тоесть его нужно как то сбрасывать? НАпример перезапуском ардуино

сбросится сам, ничего делать не нужно.

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

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

Сейчас уже  боле 3 часов работает без единого зависания.. ЗАпустил чисто код конекта и реле с датчиками температуры (без когда где MQTT). ДЕлей неставил. оставил millis. Походу там в фл проговском коде что то мешает