Торможу я или ардуино?
- Войдите на сайт для отправки комментариев
Смастерил веб-страницу на UNO, которая включает и выключает лампочки и подрубил её к роутеру через ethernet.
Сперва положил все файлы на sd карту,но скорость была очень медленной, а если использовал буфер, то ардуино иногда висла.
Тогда на Ардуино оставил только index.htm, а под все остальные файлы поднял отдельный сервер на комьютере.
Теперь страница загружается моментально, но при включении и отключении ламп часто возникают тормоза, и иногда достигают 2 секунд! (это при том, что ping до ардуино стабильно <1ms большими пакетами)
Зашёл на ютуб и посмотрел видео других, и у всех работает не так быстро как хотелось бы.
Ардуино может работать нестабильно и иногда тормозить при идеальном коде?
Если взять Mega, заметна будет разница?
Если вместо tcp/ip использовать блютуз или радиоканал скорость отклика будет выше?
Прикладываю скетч:
#include <SPI.h> #include <Ethernet.h> #include <SD.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; byte ip[] = { 192, 168, 0, 200 }; byte subnet[] = { 255, 255, 255, 0 }; EthernetServer server(80); int bedPin1 = 2; int bedPin2 = 3; boolean boolLed1 = false; boolean boolLed2 = false; File webFile; String readString = String(30); void setup() { Ethernet.begin(mac, ip, subnet); server.begin(); Serial.begin(9600); pinMode(bedPin1, OUTPUT); pinMode(bedPin2, OUTPUT); digitalWrite(bedPin1, LOW); digitalWrite(bedPin2, LOW); } void loop() { EthernetClient client = server.available(); if (client) { boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); if (readString.length() < 30) { readString.concat(c); } if (c == '\n' && currentLineIsBlank) { Serial.println(readString); if(readString.indexOf("bedLevel1") >=0){ if(boolLed1){ digitalWrite(bedPin1, LOW); boolLed1= false; }else{ digitalWrite(bedPin1, HIGH); boolLed1= true; } } if(readString.indexOf("bedLevel2") >=0){ if(boolLed2){ digitalWrite(bedPin2, LOW); boolLed2= false; }else{ digitalWrite(bedPin2, HIGH); boolLed2= true; } } if (readString.indexOf("GET / HTTP") >=0 || readString.indexOf("index.htm") >=0){ client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); client.println(); webFile = SD.open("index.htm"); if (webFile) { while(webFile.available()) { client.write(webFile.read()); } webFile.close(); } } if (readString.indexOf("inputs.xml") >=0){ client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/xml"); client.println("Connection: close"); client.println(); client.print("<?xml version = \"1.0\" ?>"); client.print("<inputs>"); client.print("<bedLevel1>"); if(boolLed1){client.print("on");} else{client.print("off");} client.print("</bedLevel1>"); client.print("<bedLevel2>"); if(boolLed2){client.print("on");} else{client.print("off");} client.print("</bedLevel2>"); client.print("</inputs>"); } readString =""; break; } if (c == '\n') { currentLineIsBlank = true; } else if (c != '\r') { currentLineIsBlank = false; } } } delay(1); client.stop(); } }
Ардуино может работать нестабильно и иногда тормозить при идеальном коде?
А "идеальный код"! это что? Определение можете дать?
HTTP-запросы в принципе не дадут мгновенного отклика.
2 секунды в локалке - это конечно многовато, я такого добивался через интернет (с локальным IP и сервер территориально не далеко), но порядок цифр будет именно таким.
Ардуино может работать нестабильно и иногда тормозить при идеальном коде?
А "идеальный код"! это что? Определение можете дать?
Это значит - нет ошибок. И нет строки delay(100000);
Это значит - нет ошибок. И нет строки delay(100000);
у меня есть такой код - дарю:
Насколько мне известно, библиотека Ethernet вызывает серьезные нарекания именно по скорости работы.
Есть даже люди, которые взялись ее переписывать, но, судя по всему, работы там много.
Но некоторого прогресса им, по их же утверждениям, добиться удалось.
Ссылку не дам, но можно поискать как по форума, так и по И-нету.
на хабре исправленную библиотеку показывали - была большая радость
Это значит - нет ошибок.
Понятно. Т.е. речь идёт о высокой теории, т.к. в грешной земной жизни действует Закон Брукса "every last bug you found is actually the penultimate" ("всякая найденная последняя ошибка на самом деле является предпоследней")
Некоторые ошибочно называют это "законом Мэрфи", но это неточно. В таком виде правило сформулировал Фредерик Брукс мл. Хотя влияние Закона Мэрфи конечно же очевидно.
Да, кстати, а вот если нет строки "delay(100000)", но есть строка "delay(100500)" - это идеальный код? Или "так себе" - "средней идеальности"?
Спасибо за ответы, смирюсь с 2 секундами!
На jquery сделал так:
При нажатии сразу на клиенте меняется кнопка вкл-выкл и блокируется на 2 секунды, чтобы пользователь несколько раз не тыкнул.
После этого отправляется ajax get запрос на переключение лампочки, а через 2 секунды подгружается xml с ардуины и переключатель еще раз синхронизируется, чтобы избежать возможных неточностей.
Ощущение, как будто ардуино реагирует моментально.