Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Ответить

Зависает код ESP8266

Пн ноя 28, 2022 22:27:33

Всем привет.
Такая проблема: создал пару кнопок в HTML, чтобы управлять шаговым двигателем. Суть при нажатии кнопки вверх двигатель делает заданное в коде количество оборотов, вниз аналогично. С браузера посылаю запрос по выданному IP/get1 (вверх). Если прокрутился до конца, посылаю запрос IP/get2 крутится в низ, т.е. все нормально. НО если нажал вверх и во время движения нажал вниз, то скрипт зависает и больше ни на что не реагирует.
Подскажите что нужно поправить, что бы не нужно было ждать пока он докрутится до конца, а можно было прервать и направить в противоположную сторону.
Спасибо.
Спойлер
Код:
#include <CustomStepper.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#define verh 0
#define niz 8       
long schet = 0; //Счетчик шагов
long shagi = 0;
CustomStepper stepper(32, 33, 25, 26);
const char* ssid = "xxxxx";   
const char* password = "xxxxx";   
ESP8266WebServer server(80);

void setup() {
  Serial.begin(115200);
  delay(100);
  Serial.println("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);   
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected..!");
  Serial.print("Got IP: "); 
  Serial.println(WiFi.localIP());

  server.on("/get1", get1);
  server.on("/get2", get2);

  server.begin();
  Serial.println("HTTP server started"); 
 
  stepper.setRPM(12);   // Устанавливаем кол-во оборотов в минуту
  stepper.setSPR(2048); 
}

void get1()

  shagi = niz;
  server.send ( 200, "text/plain", "works well" );
}

void get2()
{   
  shagi = verh;
  server.send ( 200, "text/plain", "works well" );
}

void loop() {
  server.handleClient();  // обработка входящих WEB запросов
 
 if (stepper.isDone() && schet < shagi){
    Serial.println("Up");
    stepper.setDirection(CCW);   // Устанавливает направление вращения. Может принимать 3 значения: CW - по часовой, CCW - против часовой
    stepper.rotateDegrees(45);   // В градусах
    schet++;   
    }
  if (stepper.isDone() && schet > shagi){
    Serial.println("Down");
    stepper.setDirection(CW);
    stepper.rotateDegrees(45);
    schet--;   
    }
stepper.run();
}

Re: Зависает код ESP8266

Вт ноя 29, 2022 07:12:21

ИМХО попробовать заведомо рабочий проект на ту же тему.
Например: https://randomnerdtutorials.com/stepper ... websocket/

Re: Зависает код ESP8266

Вт ноя 29, 2022 10:42:13

Зависает в каком состоянии то ? Останавливается сразу или доворачивает 45 градусов и больше ничего не делает ? выведите в сериал shagi и schet посмотреть последнее их состояние.

Re: Зависает код ESP8266

Вт ноя 29, 2022 16:33:56

Зависает в каком состоянии то ? Останавливается сразу или доворачивает 45 градусов и больше ничего не делает ? выведите в сериал shagi и schet посмотреть последнее их состояние.

Доворачивает и останавливается, больше ни на что не реагирует.
Во время движения нажал вниз и остановилось. Но если дать пройти до конца то все работает нормально.
Serial:
Спойлер
Код:
16:29:34.052 -> shagi Up
16:29:34.052 -> 8
16:29:34.052 -> schet Up
16:29:34.052 -> 0
16:29:34.683 -> shagi Up
16:29:34.683 -> 8
16:29:34.683 -> schet Up
16:29:34.683 -> 1
16:29:35.302 -> shagi Up
16:29:35.302 -> 8
16:29:35.302 -> schet Up
16:29:35.302 -> 2
16:29:35.962 -> shagi Up
16:29:35.962 -> 8
16:29:35.962 -> schet Up
16:29:35.962 -> 3

Тоже самое пробовал, но через кнопку, все нормально работает, нажимаешь в момент вращения и начинает крутить в другую сторону.
В чем подвох не пойму.
Я новичок в этом, старайтесь пожалуйста объяснить простыми словами, что поправить.
Спойлер
Код:
#include <CustomStepper.h>
#include "GyverButton.h"
#define verh 0
#define niz 4          //Число шагов для положения
#define seredina 2
boolean stop = 0;
long schet = 0; //Счетчик шагов
long shagi = 0;
CustomStepper stepper(32, 33, 25, 26);
GButton butt1(17); // Кнопка

void setup() {
  Serial.begin(9600);
  stepper.setRPM(12);
  stepper.setSPR(2048);
  butt1.setTimeout(700);
  butt1.setType(LOW_PULL);
  butt1.setDirection(NORM_CLOSE); // NORM_OPEN - кнопка нормально-разомкнутая NORM_CLOSE - нормально-замкнутая
  butt1.setTickMode(AUTO);  //Выставляем опрос кнопок в режим АВТО
}

void loop() {

if (butt1.isSingle()){shagi = niz;}  //одно нажатие
if (butt1.isDouble()){shagi = verh;} //два нажатия
if (butt1.isHolded()){shagi = schet; stop = 1;}

if (stepper.isDone() && schet < shagi){
    Serial.println("Time1");
    stepper.setDirection(CCW);
    stepper.rotate(1);
    schet++;
    }
  if (stepper.isDone() && schet > shagi){
    Serial.println("Time2");
    stepper.setDirection(CW);
    stepper.rotate(1);
    schet--;
    }
  if (stepper.isDone() && stop == 1){
    Serial.println("Time3");
    stepper.setDirection(STOP);
    stepper.rotate();
    stop = 0;   
    }
stepper.run();
}
Ответить