Нужен мой код для выполнения нескольких команд при нажатии входов

Привет всем, я снова вернулся с другой проблемой, касающейся кода для моей работы. Код, над которым я работал, предназначен для подключения к 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 Я только что отредактировал код, чтобы делать повороты, когда нажимается вход для третьего входа, предполагается, что он делает случайный поворот (влево или вправо, машина должна решить сама), и я не знаю, как написать это в коде.

, 👍-1

Обсуждение

https://www.arduino.cc/reference/en/language/functions/random-numbers/random/, @Juraj

перепишите свой код так, чтобы полученные команды и нажатия кнопок были отделены от выполняемых действий... прямо сейчас вы используете что-то вроде "если получен моторВКЛ, то запустите мотор" и "если кнопка нажата, затем запустите мотор"......... ... вместо этого используйте что-то вроде «если получен моторВКЛ, затем установите флаг» и «если кнопка нажата, затем установите флаг», затем выполните действие в зависимости от состояния флага «если флагIsSet, затем запустите мотор», @jsotola

@jsotola как мне написать это в виде кода?, @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