Нужен мой код для выполнения нескольких команд при нажатии входов
Привет всем, я снова вернулся с другой проблемой, касающейся кода для моей работы. Код, над которым я работал, предназначен для подключения к IP-серверу, где перечислены некоторые параметры, и я могу управлять серводвигателем через него. Перечисленные варианты: ВПЕРЕД, НАЗАД, ШАГ и СТОП. Каждая команда заставляет серводвигатель двигаться определенным образом, но проблема, с которой мне нужна помощь, заключается в том, что мне нужен отредактированный код для работы с тремя входными переключателями, которые при нажатии в режиме реального времени позволяют двигателю совершать повороты без необходимости нажатия какой-либо кнопки . на сервере и пока код не работает. Они работают с некоторыми светодиодными индикаторами, которые при нажатии входных переключателей также загораются, каждый вход соединен с выходом (светодиодом) соответственно, и я попытался создать маркер, который при нажатии на вход также говорит на сервере, что «LED1 является на "например. Каждый вход соответствует переключателю INPUT, а каждый выход соответствует светодиоду. Переменная Pin соответствует двигателю. Вот код, о котором идет речь:
#include <ESP8266WiFi.h>
#include <Servo.h>
const char* ssid = "RETProject";
const char* password = "mporfiri";
WiFiServer server(80);
int Pin = 16; // GPIO13
int var = 0;
int D1 = 5;
int D2 = 4;
int D4 = 2;
int D5 = 14;
int D6 = 12;
int D7 = 13;
int temp1 = 0;
int temp2 = 0;
int temp3 = 0;
Servo servoMotor;
void setup() {
Serial.begin(115200);
delay(10);
pinMode(D1, INPUT);
pinMode(D2, OUTPUT);
pinMode(D4, INPUT);
pinMode(D5, OUTPUT);
pinMode(D6, INPUT);
pinMode(D7, OUTPUT);
pinMode(Pin,INPUT);
//pinMode(LED_BUILTIN, OUTPUT);
// цифровая запись (LED_BUILTIN, LOW);
// Подключаемся к сети Wi-Fi
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");
// Запускаем сервер
server.begin();
Serial.println("Server started");
// Печатаем IP-адрес
Serial.print("Use this URL to connect: ");
Serial.print("http://");
Serial.print(WiFi.localIP());
Serial.println("/");
//servoMotor.attach(Pin);
}
void loop() {
// Проверяем, подключился ли клиент
WiFiClient client = server.available();
temp1 = digitalRead(D1);
temp2 = digitalRead(D4);
temp3 = digitalRead(D6);
if (!client) {
return;
}
// Подождем, пока клиент отправит какие-то данные
Serial.println("new client");
while(!client.available()){
delay(1);
}
// Читаем первую строку запроса
String request = client.readStringUntil('\r');
Serial.println(request);
client.flush();
// Совпадение с запросом
if(temp1 == HIGH) {
digitalWrite(D2,HIGH);
servoMotor.attach(Pin);
servoMotor.write(90);
}
else{
digitalWrite(D2,LOW);
}
if(temp2 == HIGH) {
digitalWrite(D5,HIGH);
servoMotor.attach(Pin);
servoMotor.write(-90);
}
else {
digitalWrite(D5,LOW);
}
if(temp3 == HIGH) {
digitalWrite(D7,HIGH);
}
else{
digitalWrite(D7,LOW);
}
int value = LOW;
while (value = LOW); {
if (request.indexOf("/LED=ON") != -1) {
// цифровая запись (LED_BUILTIN, HIGH);
value = HIGH;
servoMotor.attach(Pin);
servoMotor.write(0);
delay(1000);
}
if (request.indexOf("/LED=OFF") != -1) {
// цифровая запись (LED_BUILTIN, LOW);
value = LOW;
servoMotor.attach(Pin);
servoMotor.write(180);
delay(1000);
}
if (request.indexOf("/LED=STP") != -1){
var = 1;
while(var < 10){
// цифровая запись (LED_BUILTIN, LOW);
value = LOW;
servoMotor.attach(Pin);
servoMotor.write(90);
delay(200);
servoMotor.write(-90);
delay(200);
var=var+1;
}
}
if (request.indexOf("/LED=STOP") != -1) {
// цифровая запись (LED_BUILTIN, LOW);
value = LOW;
servoMotor.detach();
delay(1000);
}
// Устанавливаем ledPin согласно запросу
// цифровая запись (ledPin, значение);
// Возвращаем ответ
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println(""); // не забудьте об этом
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.print("Robot is now: ");
if(value == HIGH) {
client.print("Moving Forward");
} else if(value == LOW) {
client.print("Moving Backward");
} else if(request.indexOf("/LED=STP") != -1) {
client.print("Moving in Step");
}else {
client.print("Stopped");
}
if(temp1 == HIGH) {
client.print("Led_1 is on");
}else if (temp1 == LOW);{
client.print("Led_1 is off");
}
if(temp2 == HIGH) {
client.print("Led_2 is on");
}else if (temp2 == LOW);{
client.print("Led_2 is off");
}
if(temp3 == HIGH) {
client.print("Led_3 is on");
}else if (temp3 == LOW);{
client.print("Led_3 is off");
}
client.println("<br><br>");
client.println("<a href=\"/LED=ON\"\"><button>Move Forward </button></a>");
client.println("<a href=\"/LED=STP\"\"><button>Step </button></a>");
client.println("<a href=\"/LED=OFF\"\"><button>Move Backward </button></a><br />");
client.println("<a href=\"/LED=STOP\"\"><button>STOP </button></a><br />");
client.println("<a href=\"/Temp1=HIGH\"\"><Input>LED_1 ON </Input></a><br />");
client.println("<a href=\"/Temp2=HIGH\"\"><Input>LED_2 ON </Input></a><br />");
client.println("<a href=\"/Temp3=HIGH\"\"><Input>LED_3 ON </Input></a><br />");
client.println("</html>");
delay(1);
Serial.println("Client disonnected");
Serial.println("");
}
}
PS Я только что отредактировал код, чтобы делать повороты, когда нажимается вход для третьего входа, предполагается, что он делает случайный поворот (влево или вправо, машина должна решить сама), и я не знаю, как написать это в коде.
@Ruben Ulloa, 👍-1
Обсуждение1 ответ
Ваш код будет выполнять какие-либо действия только в том случае, если клиент подключился к нему из-за этой строки
if (!client) {
return;
}
Ваша физическая кнопка никогда ничего не сделает сама по себе, пока клиент не подключится и не отправит какие-то данные.
Для случайного направления вы используете линию, подобную следующей, чтобы случайным образом выбрать направление
int direction = random(0,2) ? 1 : 0 ;
переменная направления будет случайным образом равна 1 или 0
`случайный(0,2) ? 1 : 0 — это замысловатый способ записи «random(0, 2)»., @Edgar Bonet
Вау, ты прав. хе-хе., @tavis
- Как читать и записывать EEPROM в ESP8266
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
- ошибка: espcomm_upload_mem failed при загрузке скетча
- Как определить размер Flash?
- Несколько клиентских серверов через Wi-Fi
- Передача функции-члена класса в качестве аргумента
- В ESP-12E NodeMCU, какой выход PIN A0?
- Esp8266 Vin контакт
https://www.arduino.cc/reference/en/language/functions/random-numbers/random/, @Juraj
перепишите свой код так, чтобы полученные команды и нажатия кнопок были отделены от выполняемых действий... прямо сейчас вы используете что-то вроде "если получен моторВКЛ, то запустите мотор" и "если кнопка нажата, затем запустите мотор"......... ... вместо этого используйте что-то вроде «если получен моторВКЛ, затем установите флаг» и «если кнопка нажата, затем установите флаг», затем выполните действие в зависимости от состояния флага «если флагIsSet, затем запустите мотор», @jsotola
@jsotola как мне написать это в виде кода?, @Ruben Ulloa