Веб-сервер 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;
}
Буду признателен за любую помощь! Спасибо
@Leeham, 👍-1
Обсуждение1 ответ
Ну, я нашел ответ на Stack Overflow.
Клавиши со стрелками активируются только onkeydown
, а не onkeypress
Мне нужно было всего лишь изменить onkeypress
на onkeydown
в коде JavaScript, и теперь все работает нормально!
- NodeMCU - Vin контакт как выход 5V?
- Как заставить 5-вольтовое реле работать с NodeMCU
- ESP8266 не подключается к Wi-Fi
- Разве в узле MCU v3 (LoLin) нет встроенного светодиода?
- Разница между этими двумя платами NodeMCU?
- NodeMCU - использовать кнопку flash в качестве входного сигнала в loop()
- Как определить размер Flash?
- Использование датчика рН 5В с узлом 3,3В
Откуда ты знаешь, что это не работает? Танк не двигается? Ардуино не получает команды? Ваш веб-интерфейс не работает (вам не нужно
server.on()
те URL-адреса, на которые вы ссылаетесь в кнопках)? Кстати. Цикл не должен возвращаться, используйтеcontinue
, чтобы пропустить текущую итерацию цикла и **продолжить** со следующей., @Sim SonОбычно веб-адрес изменяется на то, на что направлена кнопка, поэтому, если я нажму кнопку остановки, URL-адрес изменится на 172.20.10.4/stop. Если я использую прослушиватель ключей, он меняется только тогда, когда я назначаю клавишу «ввод» для прослушивателя ключей. Затем Nodemcu отправляет сигналы, которые я могу прочитать с помощью последовательного монитора. Спасибо, что так быстро ответили!, @Leeham
Кажется, я вижу лишний
\"
в"<a href=\"/forward\"\"><button>ВПЕРЕД </button></a>"
и следующие строки, @Sim SonИзвините, я, вероятно, недостаточно ясно выразился, все кнопки работают нормально, и клавишу ввода можно назначить любой из них, и они будут работать, я их проверял, однако клавиша ввода — единственная клавиша, на которую она реагирует. Итак, я пытаюсь понять, почему любая из кнопок реагирует только на клавишу «ввод», потому что у меня есть несколько кнопок, которые я хочу назначить клавишам со стрелками с помощью сценария keylistener., @Leeham