Arduino Mega 2560 + Ethernet W5100
- Войдите на сайт для отправки комментариев
Добрый вечер, уважаемые форумчане!
Если кто сталкивался, прошу помочь!
Следующая задача:
Опрашивается несколько датчиков 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: часть скетча, отвечающего за опрос датчиков умышленно убрал.
В первом случае вы постоянно закрываете сессию и открываете заново, во втором все лупите в рамках одной сессии. Чуете, где собака зарыта?
попробуйте добавить в setup() после 12 строки client.setTimeout(500);
Добавь заголовок
Connection: close
чтобы сервак закрывал соединение сразу. Ну и Content-Length: 0 не помешает, в принципе.
2mavrinpn
используй websocket, и не будет таких проблем
Добавь заголовок
Connection: close
чтобы сервак закрывал соединение сразу. Ну и Content-Length: 0 не помешает, в принципе.
Спасибо! Но вариант не подошел. Соединение работает один раз и виснет - если не указать client.stop(). Либо задерживает выполнение скетча, если указать client.stop().
попробуйте добавить в setup() после 12 строки client.setTimeout(500);
А так работает! Большое спасибо!
2mavrinpn
используй websocket, и не будет таких проблем
Спасибо за подсказку! Посмотрю на сокеты.