Arduino Web Server. Как сделать задержку ответа?

Bagunda
Offline
Зарегистрирован: 04.04.2012

Как сделать задержку?

Нужно не выдавать ответ 2 секудны.

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

Вот код, который я пробовал по всякому и не получилось:

#include <EtherCard.h>  // Подключаем скачанную библиотеку. https://yadi.sk/d/R57sVoglbhTRN, https://github.com/jcw/ethercard

static byte mymac[] = {0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A};// MAC Address должен быть уникальным в вашей сети. Можно менять.
static byte myip[] = {192, 168, 1, 203};// ip статический / постоянный Address нашей Web страницы.
byte Ethernet::buffer[900];// Буфер, чем больше данных на Web странице, тем больше понадобится значения буфера.
BufferFiller bfill;

const char http_OK[] PROGMEM =
  "HTTP/1.0 200 OK\r\n"
  "Content-Type: text/html\r\n"
  "Pragma: no-cache\r\n\r\n";

const char http_Found[] PROGMEM =
  "HTTP/1.0 302 Found\r\n"
  "Location: /\r\n\r\n";

const char http_Unauthorized[] PROGMEM =
  "HTTP/1.0 401 Unauthorized\r\n"
  "Content-Type: text/html\r\n\r\n"
  "<h1>401 Unauthorized</h1>";

// Делаем функцию для оформления нашей Web страницы.
void homePage()
{
  bfill.emit_p(PSTR(
                 "<title>Arduino Webserver</title>"
                 "<p><font size=\"60\">"
                 "TEST: <a href=\"?command=test\">TEST</a><br />"
                 "</font></p>"),
               http_OK);
}

void send_page_with_info()
{
  bfill.emit_p(PSTR(
                 "{command:led_is_ok}"),
               http_OK);
}

long previousMillis = 0;        // храним время последнего переключения
boolean podojdat_nemnogo;

void setup()
{
  Serial.begin(9600);

  if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0)// По умолчанию в Библиотеке "ethercard" (CS-pin) = № 8. Меняем (CS-pin) на 10
    Serial.println(F("Failed to access Ethernet controller"));
  ether.staticSetup(myip);
  ether.printIp("My SET IP: ", ether.myip); // Выводим в Serial монитор статический IP адрес.

  podojdat_nemnogo == false;
}

void loop()
{
  unsigned long currentMillis = millis();

  delay(1); // Дёргаем микроконтроллер.

  word len = ether.packetReceive();   // check for ethernet packet / проверить ethernet пакеты.
  word pos = ether.packetLoop(len);   // check for tcp packet / проверить TCP пакеты.

  if (pos)
  {
    bfill = ether.tcpOffset();
    char *data = (char *) Ethernet::buffer + pos;
    if (strncmp("GET /", data, 5) != 0)
    {
      bfill.emit_p(http_Unauthorized);
    }
    else
    {
      data += 5;
      if (data[0] == ' ') {
        homePage(); // Return home page Если обнаружено изменения на станице, запускаем функцию.
      }
      else if (strncmp("?command=test ", data, 14) == 0) {
        previousMillis = currentMillis;
        Serial.println(F("Prikazyvaem podojdat nemnogo!"));
        podojdat_nemnogo = true;
      }
      else {
        bfill.emit_p(http_Unauthorized);// Page not found
      }
    }

    ether.httpServerReply(bfill.position());    // send http response
  }

  if (podojdat_nemnogo == true) {
    if (currentMillis - previousMillis > 3000) {
      Serial.println(F("Gotit!"));
      send_page_with_info();
      ether.httpServerReply(bfill.position());    // send http response
      podojdat_nemnogo == false;
    }
  }
}

Как я понял, нужно задерживать это первое if (pos), т.к. как мне кажется если браузер если не получает ответа побырому, то он посылает заново запрос

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Отправь refresh 2 сек, пусть снова спросит

dmitron1036
Offline
Зарегистрирован: 10.01.2016

нафига такие проблеммы? запрашивай состояние регулярно, JS сделает остальное.

про важность асинхронных алгоритмов ...промолчу