ARDUINO Slider из GyverPortal для управления шаговиком

MaxWhite

✩✩✩✩✩✩✩
12 Мар 2020
29
5
Всем привет!
Сломал уже всю голову, почти все написал, что надо, осталось последнее - подружить слайдер из библиотеки гайвер портал и шаговик. А именно чтобы установка слайдера, например, в 0-100 % давала бы шаги с 0-1200 (6 оборотов по 200), это можно сделать через функцию map, знаю, НО есть нюанс) шаговиком так же надо управлять с помощью обычного аналогового джойстика и положение шаговика (обороты или количество шагов) писать в слайдер и показывать его в веб морде. Еще по обе стороны шаговика есть концевики, при достижении которых он просто останавливается и значение шагов ставится либо 0 с одной стороны, либо 1200 с другой. С джойстиком все норм, с помощью gyverstepper2 все завелось, остался слайдер... могу даже денюжку дать, если будет решение.

Я склоняюсь к тому, что т.к. есть точное кол-во шагов в промежутке 0-1200 или же сами концы промежутка, то можно как-то эти шаги использовать, но хз как... решение просто витает в воздухе, не могу ухватить((

Если нужны доп сведения или код - спрашивайте!
 
Изменено:

Bruzzer

★★★✩✩✩✩
23 Май 2020
500
145
@MaxWhite,
Не понятно, какие сложности у вас именно с GyverPortal и слайдером. Все, что вы написали выше почти не имеет к этому отношения.
GyverPortal умеет
передавать в ESP значение переменной (слайдера) с web страницы
отображать на web странице значение переменной (слайдера) переданное с ESP .
Все описанные вами подробности ему (порталу) не интересны.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
Энкодер меняет текущее значение какой либо переменной, а потенциометр и указывает абсолютную.

Пример слайдер и энкодер.
Есть переменная А, которая меняет значения от -10 до +10. Изначально 0.
Энкодером щелкам в+ 3 раза , передаем значение в слайде, там 3.
Слайдером меняем значение на -3, передаем значение в переменную.
В переменной -3,
Меняем значение энкодером влево на 2, получаем значение -5 в переменной и передаем ее в слайдер.
Тут все работает.

А вот передать значение слайдера в положение потенциомтра не получиться , и любой последующее считываени значение с потенциометра похерят (поставят крест) на изменении слайдером. Тут слайдер скорее подойдет как исключительно отображение положения потенциометра
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
@MaxWhite, Я может что то запамятовал. Вроде было желание управлять потенциометром. Нет ? мог ошибиться.

А так не понимаю в чем сложность. Есть текущее значение положения шаговика (какое то). Есть положение слайдера. Если 1-ое не совпадает со вторым , надо делать шаг в нужном направлении. Может нужно понять , что положение слайсера не всегда соотв. положению шаговика ?
Наверняка положение слайсера будет меняться быстрее чем положение шаговика.
Может стоит еще менять цвет слайсера, типа зеленый если положение слайсера соотв. положению шаговика, красный нет.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
500
145
@MaxWhite,
Если ваш код короткий, то покажите его.
Если длинный, то напишите короткий пример ТОЛЬКО со слайдером и шаговиком.
 

MaxWhite

✩✩✩✩✩✩✩
12 Мар 2020
29
5
@MaxWhite,
Если ваш код короткий, то покажите его.
Если длинный, то напишите короткий пример ТОЛЬКО со слайдером и шаговиком.

C++:
#define stepPin D4   //драйвер
#define dirPin D3    //драйвер
#define ENPin D8     //драйвер
#define jstick A0    //джойстик
#define LimitSW1 D1  //концевик
#define LimitSW2 D2  //концевик

#include <Arduino.h>
#include "GyverStepper2.h"
#include <GyverPortal.h>
#include <GyverJoy.h>
#include <EncButton.h>
#include <LittleFS.h>
#include <EEPROM.h>

GyverPortal ui(&LittleFS);
GStepper2<STEPPER2WIRE> stepper(200, stepPin, dirPin, ENPin);
GyverJoy joyX(jstick);

struct LoginPass {
  char ssid[20];
  char pass[20];
};

LoginPass lp;

int steps;
int slider;
int value;


//конструктор обычной вебморды
void build() {
  GP.BUILD_BEGIN();
  GP.THEME(GP_DARK);
  GP.ICON_SUPPORT();
  GP.UPDATE("flower");
  GP.SLIDER("flower", slider, 0, 100);
  GP.BUILD_END();
}

void setup() {
  Serial.begin(9600);
  pinMode(LimitSW1, INPUT_PULLUP);
  pinMode(LimitSW2, INPUT_PULLUP);
  //joyX.invert(true);  // инвертировать
  joyX.calibrate();         // калибровка нуля при запуске
  joyX.deadzone(200);       // мёртвая зона
  joyX.exponent(GJ_CUBIC);  // экспонента для плавности
  stepper.setAcceleration(3000);
  stepper.setMaxSpeed(800);
  stepper.setSpeed(-600);  // медленно крутимся НАЗАД
  // пока кнопка не нажата
  while (digitalRead(LimitSW1)) {
    stepper.tick();
    yield();
  }
  stepper.reset();
  stepper.setCurrent(1200);
  stepper.autoPower(true);
  delay(500);

  EEPROM.begin(300);
  EEPROM.get(0, lp);
  Serial.print("Connect to: ");
  Serial.println(lp.ssid);
  WiFi.mode(WIFI_STA);
  WiFi.begin(lp.ssid, lp.pass);
  Serial.println();
  Serial.print("Connected!");
  ui.attachBuild(build);
  ui.attach(action);
  ui.start("flola");
}

void loop() {
  stepper.tick();
  ui.tick();
  joystick();
  steps = stepper.getCurrent();
}

//обработчик действий
void action() {
  //если изменять значение в вебморде
  if (ui.click()) {
    //если двигать слайдер
    if (ui.clickInt("flower", slider)) {
      steps = map(slider, 0, 100, 0, 1200);
      Serial.println(stepper.getCurrent());
    }
  }
  //при изменении положения энкодера/джойстика - вывод в морду положения
  if (ui.update()) {
    ui.updateInt("flower", slider);
  }
}
void joystick() {
  joyX.tick();

  if (stepper.tick() && joyX.value() == 0) {
    stepper.stop();
  }

  if (!stepper.tick() && joyX.value() < 0 && digitalRead(LimitSW2) == HIGH) {
    stepper.setSpeed(-700);  //1200 макс! 6 об/сек, мин 500-600, среднее 900
  } else if (joyX.value() < 0 && digitalRead(LimitSW2) == LOW) {
    stepper.stop();
    stepper.setCurrent(0);
  }

  if (!stepper.tick() && joyX.value() > 0 && digitalRead(LimitSW1) == HIGH) {
    stepper.setSpeed(700);  //1200 макс! 6 об/сек, мин 500-600, среднее 900
  } else if (joyX.value() > 0 && digitalRead(LimitSW1) == LOW) {
    stepper.stop();
    stepper.setCurrent(1200);
  }
}
скорее всего
steps = stepper.getCurrent(); не нужно, оно ничего не дает. Самое интересное должно происходить в функции action, но тут я всё
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
500
145
Наверно я не смогу вам помочь. Я отвечал на сообщение #7, и ожидал увидеть код про который в нем идет речь, быстро найти там ошибку и подсказать. Придумывать алгоритм я не готов.
Если делать как по примерам gyver portal и изменять значение в обработчике слайдера, то шаговик шагает по паре шагов за одно изменение слайдера, если добавить функцию тик и сюда, то ничего не изменяется,
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
Мельком глянул. Т.е. тут управление должно быть и слайдером и джойстиком ?
А не остановит ли это условие
C++:
  if (stepper.tick() && joyX.value() == 0) {
    stepper.stop();
работу мотора при управлении со слайдера ?