Веб-сервер Nodemcu для arduino RC Tank, прослушиватели ключей больше не работают!

Привет, спасибо, что посмотрели мой пост.

По сути, я построил управляемый WiFi резервуар из Arduino и платы Nodemcu. Вы получаете доступ к веб-странице с компьютера и можете нажимать кнопки «вперед», «назад», «влево» и «вправо», чтобы управлять танком. Мой учитель помог мне написать HTML-код в мою программу Arduino Nodemcu, чтобы у нее был прослушиватель клавиш, который автоматически нажимал кнопки при обнаружении определенных нажатий клавиш.

Все работало отлично, но вдруг в один прекрасный день прослушиватели ключей перестали работать, я пробовал несколько раз, но не знаю, что изменилось, все, что я знаю, это то, что клавиша ввода все еще работает, если вы используете эту клавишу для прослушивателя (значение ключа : 13) но любое другое значение не работает и мне нужно более 1 клавиши для управления танком (вперед, назад, влево и вправо.)

Вот код:

/* include library */
#include <ESP8266WiFi.h>

/*
Если вы понятия не имеете об этой библиотеке, вы можете посмотреть учебник ниже.
NodeMCU ESP8266 Учебник 01: Программирование NodeMCU ESP-12E с помощью Arduino IDE
https://youtu.be/IVToijhx0ck
*/

/* определяем порт */

WiFiClient client;
WiFiServer server(80);

/* WIFI settings */
const char* ssid = "SkyNet Mobile";
const char* password = "switch2020";

/* data received from application */
String  data = "";
/* define L298N or L293D motor control pins */
void setup() {
  delay(5000); // даем arduino время загрузить bootmanager, чтобы он не захлебнулся и не сдох
  Serial.begin(9600);
  /* initialize motor control pins as output */
  /* Connect to WiFi network */
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  /* start server communication */
  server.begin();
  Serial.println("Server started");

  /* print the IP address */
  Serial.print("Use this URL to connect: ");
  Serial.print("http://");
  Serial.print(WiFi.localIP());
  Serial.println("/");

}

void loop() {

  /* If the server available, run the "checkClient" function */
  client = server.available();
  if (!client) return;
  data = checkClient ();
  // Serial.println(directionDataVariable);

  /************************ Run function according to incoming data from application *************************/

  /* If the incoming data is "forward", run the "MotorForward" function */
  if (data == "forward") MotorForward();
  /* If the incoming data is "backward", run the "MotorBackward" function */
  else if (data == "backward") MotorBackward();
  /* If the incoming data is "left", run the "TurnLeft" function */
  else if (data == "left") TurnLeft();
  /* If the incoming data is "right", run the "TurnRight" function */
  else if (data == "right") TurnRight();
  /* If the incoming data is "stop", run the "MotorStop" function */
  else if (data == "stop") MotorStop();
  // Устанавливаем скорость на быструю
  else if (data == "speed") speeder(); //быстрая функция двигателя
  else if (data == "slow") slow(); //функция замедления двигателя

  else if (data == "LEDON") LEDON(); // Включаем светодиод
  else if (data == "LEDOFF") LEDOFF(); //Выключаем светодиод
  else if (data == "LEDTOGGLE") LEDTOGGLE(); // ЦИКЛ по функциям светодиода

  /* Web Browser */
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("");
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");
  client.println("<head>");
  client.println("<title> Liam's Tank </title>");
  client.println("</head>");
  client.println("<body>");
  client.println("<center>");
  client.println("<h3> Liam's WiFi Controlled Tank </h3>");
  client.println("<br><br>");
  client.println("<hr>");

  /* Buttons */
  client.println("<br><br>");
  client.println("<a href=\"/forward\"\"><button>FORWARD </button></a>"); //Кнопка "Вперед"
  client.println("<a href=\"/backward\"\"><button>BACKWARD </button></a><br />"); //Кнопка назад
  client.println("<br><br>");
  client.println("<a href=\"/left\"\"><button>LEFT </button></a>"); //Левая кнопка
  client.println("<a href=\"/right\"\"><button>RIGHT </button></a><br />");//Правая кнопка
  client.println("<br><br>");
  client.println("<a href=\"/stop\"\"><button>STOP </button></a><br />"); //Кнопка Stop
  client.println("<a href=\"/speed\"\"><button>SPEED </button></a>"); // Кнопка "Ускорить"
  client.println("<a href=\"/slow\"\"><button>SLOW </button></a>"); //Кнопка замедления
  client.println("<p>"); //создаем абзац (барьер)
  client.println("<a href=\"/LEDON\"\"><button>LEDON </button></a>"); // Включаем кнопку LED
  client.println("<a href=\"/LEDOFF\"\"><button>LEDOFF </button></a>"); //Кнопка выключения светодиода
  client.println("<a href=\"/LEDTOGGLE\"\"><button>LEDTOGGLE </button></a>");//Кнопка переключения режимов светодиода
  client.println("</p>"); //создаем абзац (барьер)
  //конец кода кнопки

  //Сценарий Key Listener, написанный моим учителем:
  client.println("<script>document.onkeypress = function(e) {");
  client.println("    e = e || window.event;");
  client.println("    if (e.keyCode == '87') { window.location.href = '/forward'; }");
  client.println("    else if (e.keyCode == '40') { window.location.href = '/backward'; }");
  client.println("    else if (e.keyCode == '37') { window.location.href = '/left'; }");
  client.println("    else if (e.keyCode == '39') { window.location.href = '/right'; }");
  client.println("    else if (e.keyCode == '13') { window.location.href = '/stop'; }");
  client.println("    else if (e.keyCode == '70') { window.location.href = '/speed'; }");
  client.println("    else if (e.keyCode == '83') { window.location.href = '/slow'; }");

изменение любого кода клавиши == xx на клавишу ввода '13' приведет к тому, что она будет работать, но работает только клавиша ввода (13), вот в чем проблема! Использование любого другого ключа не обнаружено, когда я проверяю его в веб-браузере.

client.println("} </script>");
      //конец кода скрипта

      client.println("<br><br>");
      client.println("<hr>");
      client.println("<br><br>");
      client.println("<pre><h3>Made with Arduino and NodeMCU boards</br> WiFi controlled Tank via Web Browser</br>Built and designed by Liam Price.</br></h3></pre>");
      client.println("</center>");
      client.println("</body>");
      client.println("</html>");
    }

    //Эти функции запускаются, когда переменная данных соответствует им, например, если веб-страница переадресована, то будет запущена функция MotorForward, и она отправит сигнал по TX на другую плату Arduino для управления двигателями.
    /********************************************* FORWARD *****************************************************/
    void MotorForward(void)
    {
      Serial.print('H');
    }
    /********************************************* BACKWARD *****************************************************/
    void MotorBackward(void)
    {
      Serial.print('B');
    }
    /********************************************* TURN LEFT *****************************************************/
    void TurnLeft(void)
    {
      Serial.print('T');
    }
    /********************************************* TURN RIGHT *****************************************************/
    void TurnRight(void)
    {
      Serial.print('L');
    }
    /********************************************* STOP *****************************************************/
    void MotorStop(void)
    {
      Serial.print('S');
    }
    /********************************************* speed (fast) *****************************************************/
    void speeder(void)
    {
      Serial.print('G');
    }
    /********************************************* speed (slow) *****************************************************/
    void slow(void)
    {
      Serial.print('A');
    }
    /********************************************* LEDON *****************************************************/
    void LEDON(void)
    {
      Serial.print('Z');
    }
    /********************************************* LEDOFF *****************************************************/
    void LEDOFF(void)
    {
      Serial.print('X');
    }
    /********************************************* LEDON *****************************************************/
    void LEDTOGGLE(void)
    {
      Serial.print('Y');
    }
    /********************************** RECEIVE DATA FROM the WEB ******************************************/
    String checkClient (void)
    {
      while (!client.available()) delay(1);
      String request = client.readStringUntil('\r');
      request.remove(0, 5);
      request.remove(request.length() - 9, 9);
      return request;
    }

Буду признателен за любую помощь! Спасибо

, 👍-1

Обсуждение

Откуда ты знаешь, что это не работает? Танк не двигается? Ардуино не получает команды? Ваш веб-интерфейс не работает (вам не нужно server.on() те URL-адреса, на которые вы ссылаетесь в кнопках)? Кстати. Цикл не должен возвращаться, используйте continue, чтобы пропустить текущую итерацию цикла и **продолжить** со следующей., @Sim Son

Обычно веб-адрес изменяется на то, на что направлена кнопка, поэтому, если я нажму кнопку остановки, URL-адрес изменится на 172.20.10.4/stop. Если я использую прослушиватель ключей, он меняется только тогда, когда я назначаю клавишу «ввод» для прослушивателя ключей. Затем Nodemcu отправляет сигналы, которые я могу прочитать с помощью последовательного монитора. Спасибо, что так быстро ответили!, @Leeham

Кажется, я вижу лишний \" в "<a href=\"/forward\"\"><button>ВПЕРЕД </button></a>" и следующие строки, @Sim Son

Извините, я, вероятно, недостаточно ясно выразился, все кнопки работают нормально, и клавишу ввода можно назначить любой из них, и они будут работать, я их проверял, однако клавиша ввода — единственная клавиша, на которую она реагирует. Итак, я пытаюсь понять, почему любая из кнопок реагирует только на клавишу «ввод», потому что у меня есть несколько кнопок, которые я хочу назначить клавишам со стрелками с помощью сценария keylistener., @Leeham


1 ответ


0

Ну, я нашел ответ на Stack Overflow.

Клавиши со стрелками активируются только onkeydown, а не onkeypress

Мне нужно было всего лишь изменить onkeypress на onkeydown в коде JavaScript, и теперь все работает нормально!

,