Arduino Web Server. Как сделать задержку ответа?
- Войдите на сайт для отправки комментариев
Втр, 01/11/2016 - 19:00
Как сделать задержку?
Нужно не выдавать ответ 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), т.к. как мне кажется если браузер если не получает ответа побырому, то он посылает заново запрос
Отправь refresh 2 сек, пусть снова спросит
нафига такие проблеммы? запрашивай состояние регулярно, JS сделает остальное.
про важность асинхронных алгоритмов ...промолчу