Мой веб-сервер отлично работает, когда в моем коде используется/определен только 1 сервопривод.

Я пытаюсь создать веб-сервер, который управляет моими 3 сервоприводами для роботизированной руки. Когда я определяю и использую 1 сервопривод, это хорошо и быстро, но если я использую более 1, веб-сервер очень медленный и почти не загружается. Кто-нибудь, пожалуйста, помогите.

Я опубликую код ниже. С этим кодом веб-сервер работает очень медленно:

#include <Ethernet.h>
#include <SPI.h>
#include <Servo.h>
String readString;
Servo robotservo1;
Servo robotservo2;


byte mac[] = { 0x2C, 0xF7, 0xF1, 0x08, 0x29, 0xAF };
byte ip []={10,1,1,121};// проверяем заднюю часть своего щита
   // когда шилд подключен, последовательный монитор отобразит IP-адрес
EthernetServer server(80); 

void setup() {
  // поместите сюда код установки для однократного запуска:
  Serial.begin(9600);
 Ethernet.begin(mac, ip);
server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());// печатает мой IP-адрес, так что вы можете скопировать и вставить в браузере

robotservo1.attach(9);
robotservo2.attach(10);

robotservo1.write(45);
robotservo2.write(45);


}

void loop() {
  // поместите сюда ваш основной код для многократного запуска:
EthernetClient client = server.available();
if (client) {
if (client.connected()){
  if (client.available()) {
  char c = client.read();
  if (readString.length() < 100) {
          readString += c;
        } 
  if (c == '\n') {
          Serial.println(readString);                      
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          client.println("<hmtl>");
          client.println("<head>");
client.println("<title>Ethernet shield, hopefully works</title>");
client.println("</head>");
client.println("<title>");
client.println("Control the robotic arm using the buttons below");
client.println("</title>");
client.println("<body bgcolor = black>");
client.println("<font color = antiquewhite>");
client.println("<meta http-equiv=\"refresh\" content=\"4\">"); 
client.println("<b>");
client.println("Control the robotic arm by pressing the buttons below!!!");
client.println("</b>");
client.println("<body>");
client.println("<p>");
client.println("Servo 1 or Base");
client.println("<br>");
client.println("<FORM>");   
client.println("<INPUT type=button value=Servo-0 onClick=window.location='/?baseserv0\'>");
client.println("<INPUT type=button value=Servo-45 onClick=window.location='/?baseserv45\'>");
client.println("<INPUT type=button value=Servo-90 onClick=window.location='/?baseserv90\'>");
client.println("</FORM>");
client.println("</p>");

client.println("<p>");
client.println("Servo 2 or Elbow");
client.println("<br>");
client.println("<FORM>");   
client.println("<INPUT type=button value=Servo-0 onClick=window.location='/?elbowserv0\'>");
client.println("<INPUT type=button value=Servo-45 onClick=window.location='/?elbowserv45\'>");
client.println("<INPUT type=button value=Servo-90 onClick=window.location='/?elbowserv90\'>");
client.println("</FORM>");
client.println("</p>");

client.println("<p>");
client.println("Servo 3 or Shoulder");
client.println("<br>");
client.println("<FORM>");   
client.println("<INPUT type=button value=Servo-0 onClick=window.location='/?shoulderserv0\'>");
client.println("<INPUT type=button value=Servo-45 onClick=window.location='/?shoulderserv45\'>");
client.println("<INPUT type=button value=Servo-90 onClick=window.location='/?shoulderserv90\'>");
client.println("</FORM>");
client.println("</p>");

client.println("</font>");
client.println("</body>");
client.println("</html>");

 delay(1);

  if(readString.indexOf("?baseserv0") >0)
            {
              robotservo1.write(0);
            }

          else{
            if(readString.indexOf("?baseserv45") >0)
            {
              robotservo1.write(45);
            }

          else{
            if(readString.indexOf("?baseserv90") >0)
            {
              robotservo1.write(90);
            }


  }

}


  if(readString.indexOf("?baseserv0") >0)
            {
              robotservo2.write(0);
            }

          else{
            if(readString.indexOf("?elbowserv45") >0)
            {
              robotservo2.write(45);
            }

          else{
            if(readString.indexOf("?elbowserv90") >0)
            {
              robotservo2.write(90);
            }


  }

}

  readString="";
          client.stop();      
  }}}}}

, 👍0

Обсуждение

ваш код трудно читать, потому что он плохо отформатирован... пожалуйста, исправьте отступ... например, все операторы if должны иметь один и тот же отступ... также, client.println() все должны иметь одинаковый отступ, @jsotola

остановите клиент перед работой с двигателями. и немного чтения https://github.com/jandrassy/StreamLib/blob/master/README.md, @Juraj


1 ответ


1

У меня нет платы Ethernet, поэтому я не мог проверить тайминги, но когда я скомпилировал ваш код для Uno, я получил предупреждение о нехватке свободной памяти; что используется 83% памяти и могут возникнуть проблемы со стабильностью. Это компилятор говорит вам, что ваш код может работать неправильно. Это вполне может быть причиной того, что ваш сервер был медленным. Самый большой пользователь памяти данных (SRAM) — это текст в ваших операторах client.print().

Я поместил этот текст в программную память (флэш-память, которой в 10 раз больше!), что позволило сократить использование SRAM до 29%! Попробуйте запустить его и посмотрите, не станет ли он вести себя немного лучше:

#include <Ethernet.h>
#include <SPI.h>
#include <Servo.h>
String readString;
Servo robotservo1;
Servo robotservo2;


byte mac[] = { 0x2C, 0xF7, 0xF1, 0x08, 0x29, 0xAF };
byte ip [] = {10, 1, 1, 121}; // проверьте заднюю часть вашего щита
// когда шилд подключен, последовательный монитор отобразит IP-адрес
EthernetServer server(80);

void setup() {
   // поместите сюда код установки для однократного запуска:
   Serial.begin(9600);
   Ethernet.begin(mac, ip);
   server.begin();
   Serial.print("server is at ");
   Serial.println(Ethernet.localIP());// печатает мой IP-адрес, так что вы можете скопировать и вставить в браузере

   robotservo1.attach(9);
   robotservo2.attach(10);

   robotservo1.write(45);
   robotservo2.write(45);


}

void loop() {
   // поместите сюда ваш основной код для многократного запуска:
   EthernetClient client = server.available();
   if (client) {
      if (client.connected()) {
         if (client.available()) {
            char c = client.read();
            if (readString.length() < 100) {
               readString += c;
            }
            if (c == '\n') {
               Serial.println(readString);
               client.println(F("HTTP/1.1 200 OK"));
               client.println(F("Content-Type: text/html"));
               client.println();
               client.println(F("<hmtl>"));
               client.println(F("<head>"));
               client.println(F("<title>Ethernet shield, hopefully works</title>"));
               client.println(F("</head>"));
               client.println(F("<title>"));
               client.println(F("Control the robotic arm using the buttons below"));
               client.println(F("</title>"));
               client.println(F("<body bgcolor = black>"));
               client.println(F("<font color = antiquewhite>"));
               client.println(F("<meta http-equiv=\")refresh\" content=\"4\">"));
               client.println(F("<b>"));
               client.println(F("Control the robotic arm by pressing the buttons below!!!"));
               client.println(F("</b>"));
               client.println(F("<body>"));
               client.println(F("<p>"));
               client.println(F("Servo 1 or Base"));
               client.println(F("<br>"));
               client.println(F("<FORM>"));
               client.println(F("<INPUT type=button value=Servo-0 onClick=window.location='/?baseserv0\'>"));
               client.println(F("<INPUT type=button value=Servo-45 onClick=window.location='/?baseserv45\'>"));
               client.println(F("<INPUT type=button value=Servo-90 onClick=window.location='/?baseserv90\'>"));
               client.println(F("</FORM>"));
               client.println(F("</p>"));

               client.println(F("<p>"));
               client.println(F("Servo 2 or Elbow"));
               client.println(F("<br>"));
               client.println(F("<FORM>"));
               client.println(F("<INPUT type=button value=Servo-0 onClick=window.location='/?elbowserv0\'>"));
               client.println(F("<INPUT type=button value=Servo-45 onClick=window.location='/?elbowserv45\'>"));
               client.println(F("<INPUT type=button value=Servo-90 onClick=window.location='/?elbowserv90\'>"));
               client.println(F("</FORM>"));
               client.println(F("</p>"));

               client.println(F("<p>"));
               client.println(F("Servo 3 or Shoulder"));
               client.println(F("<br>"));
               client.println(F("<FORM>"));
               client.println(F("<INPUT type=button value=Servo-0 onClick=window.location='/?shoulderserv0\'>"));
               client.println(F("<INPUT type=button value=Servo-45 onClick=window.location='/?shoulderserv45\'>"));
               client.println(F("<INPUT type=button value=Servo-90 onClick=window.location='/?shoulderserv90\'>"));
               client.println(F("</FORM>"));
               client.println(F("</p>"));

               client.println(F("</font>"));
               client.println(F("</body>"));
               client.println(F("</html>"));

               delay(1);

               if (readString.indexOf("?baseserv0") > 0)
               {
                  robotservo1.write(0);
               }

               else {
                  if (readString.indexOf("?baseserv45") > 0)
                  {
                     robotservo1.write(45);
                  }

                  else {
                     if (readString.indexOf("?baseserv90") > 0)
                     {
                        robotservo1.write(90);
                     }


                  }

               }


               if (readString.indexOf("?baseserv0") > 0)
               {
                  robotservo2.write(0);
               }

               else {
                  if (readString.indexOf("?elbowserv45") > 0)
                  {
                     robotservo2.write(45);
                  }

                  else {
                     if (readString.indexOf("?elbowserv90") > 0)
                     {
                        robotservo2.write(90);
                     }


                  }

               }

               readString = "";
               client.stop();
            }
         }
      }
   }
}
,