Arduino Mega 2560 + Ethernet W5100

mavrinpn
Offline
Зарегистрирован: 17.07.2018

Добрый вечер, уважаемые форумчане!

Если кто сталкивался, прошу помочь!

Следующая задача:

Опрашивается несколько датчиков HC-SR04 с периодичностью раз в 10мс. В случае если какой-то из датчкиов фиксирует расстояние меньше заданного, то на сервер должен уйти GET запрос с информацией о времени (millis()) срабатывания.

Проблема:

Отправка данных через Ethernet останавливает выполнение скетча примерно на 2-3 секунды. В этот период могут быть потеряны полезные данные с других датчиков.

Скетч данного варианта:

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // MAC-адрес Arduino
IPAddress iPad(192, 168, 1, 106); // IP-адрес планшета
String iPad_string = "192.168.1.106";
IPAddress ip(192, 168, 1, 100); // IP-адрес Arduino
EthernetClient client;

void setup() {
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  delay(1000);
}

void loop() {
  delay(10);
  if (distance < 1000) { 
    
    if (client.connect(iPad, 80)) {
      client.println("GET /?request HTTP/1.1");
      client.println("HOST: "+iPad_string);
      client.println();

      client.stop();
    }
  }
}

Задержка происходит на функции client.stop();

 

Сделал так:

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // MAC-адрес Arduino
IPAddress iPad(192, 168, 1, 106); // IP-адрес планшета
String iPad_string = "192.168.1.106";
IPAddress ip(192, 168, 1, 100); // IP-адрес Arduino
EthernetClient client;

void setup() {
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  delay(1000);
  client.connect(iPad, 80)
}

void loop() {
  delay(10);
  if (distance < 1000) { 
    
      client.println("GET /?request HTTP/1.1");
      client.println("HOST: "+iPad_string);
      client.println();

    }
  }
}

В таком варианте задержки нет, GET-запросы отправляются друг за другом без проблем, но если на некоторое время (секунд 10-15) оставить стенд в покое, то данные уходить перестанут.

 

Что можно сделать, чтобы GET запросы уходили без задержек?

Заранее спасибо!

PS: часть скетча, отвечающего за опрос датчиков умышленно убрал.

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

В первом случае вы постоянно закрываете сессию и открываете заново, во втором все лупите в рамках одной сессии. Чуете, где собака зарыта?

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

попробуйте добавить в setup() после 12 строки  client.setTimeout(500);

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Добавь заголовок

Connection: close

чтобы сервак закрывал соединение сразу. Ну и Content-Length: 0 не помешает, в принципе.

JonHappy1
Offline
Зарегистрирован: 11.06.2018

2mavrinpn

используй websocket, и не будет таких проблем

mavrinpn
Offline
Зарегистрирован: 17.07.2018

DIYMan пишет:

Добавь заголовок

Connection: close

чтобы сервак закрывал соединение сразу. Ну и Content-Length: 0 не помешает, в принципе.

 

Спасибо! Но вариант не подошел. Соединение работает один раз и виснет - если не указать client.stop(). Либо задерживает выполнение скетча, если указать client.stop().

mavrinpn
Offline
Зарегистрирован: 17.07.2018

b707 пишет:

попробуйте добавить в setup() после 12 строки  client.setTimeout(500);

 

А так работает! Большое спасибо!

mavrinpn
Offline
Зарегистрирован: 17.07.2018

JonHappy1 пишет:

2mavrinpn

используй websocket, и не будет таких проблем

Спасибо за подсказку! Посмотрю на сокеты.