При включении контроллера игнорировать концевой выключатель

Каретка подъемного механизма в нижнем положении стоит на концевом выключателе (индуктивном), и организовать какой-то отъезд или парковку по этому концевику - нет возможности. Скетч рабочий, каретка ходит по заданным командам (шаговый двигатель) и концевики работают как должны.
Но если контроллер включается в самом нижнем положении, когда нижний концевик
активен при старте, то ничего не запускается.

Простые решения (разные, в коде) не помогают, high, low, переменные и их значения, условия, кейсы, или я не могу корректно совместить их с библиотеками которые использую - accelstepper, gyverstepper, ezbutton.

Подскажите в какую сторону копать,
пусть не кодом, но направлением, так скажем.
То есть, другими словами, определенного
пина при включении контроллера просто
"не должно существовать“, а потом он должен появляться. Остается наверное еще и такой вариант как подключение самого концевика
через реле, но это уже совсем от отчаянья, наверное.

Копай в сторону учебы программированию, очевидно. Ну или еще платный раздел есть.

так не бывает.
Может у вас запуск мотора АППАРАТНО заблокирован при опущенном концевике? - тогда, конечно, никакой код не поможет.

А если проблема софтверная - ее можно решить всегда.

Показывайте, как пытались решить проблему в коде. Только вставляйте код обязательно по правилам форума

Если под “апаратно заблокирован” вы подразумевали выключение драйвера шаговика по ENA - то нет.

Да мало ли как - может у вас питание мотора через концевик идет.

А хотите совета по коду - показывайте код, иначе никак.

Хорошо, сейчас попробую вставить код

Один из вариантов, на GyverStepper, и это рабочий код.
То есть все работает, но если контроллер включается в нижнем положении каретки,
и при включении же, - отрабатывает “stopdown(0); //pin D3”, то программа не работает.
Как отключать этот пин при включении контроллера?

#include <GyverStepper2.h>
#include <ezButton.h>

GStepper2<STEPPER2WIRE> stepper(800, 14, 12);

uint32_t tar = 234000;

ezButton buttonup (5); //pin D1
ezButton buttondown (4); //pin D2
ezButton stopup(16); //pin D0
ezButton stopdown(0); //pin D3

void setup() {

stepper.setMaxSpeed(9600);
stepper.setAcceleration(3200);  

buttonup.setDebounceTime(50);
buttondown.setDebounceTime(50);
stopup.setDebounceTime(50);
stopdown.setDebounceTime(50);

}

void loop() {

buttonup.loop();
buttondown.loop();
stopup.loop();
stopdown.loop();

if (buttonup.isPressed())
stepper.setTarget(tar);
stepper.tick();

if (stopup.isPressed()) 
stepper.brake();
stepper.tick();

if (buttondown.isPressed()) 
stepper.setTarget(0);
stepper.tick();

if (stopdown.isPressed()) 
stepper.brake();
stepper.tick();

}

а что за плата ардуино?

Еще один вариант (всего их пять или шесть) на AccelStepper с кейсами,
тоже рабочий, но только если не включать контроллер в нижнем положении каретки,
когда активен нижний концевик



#include <ezButton.h>
#include <AccelStepper.h>

#define dirPin 12    //pin D6
#define stepPin 14   //pin D5
#define enPin 13     //pin D7
#define relayPin 15  //pin D8

ezButton buttonup(5);    //pin D1
ezButton buttondown(4);  //pin D2
ezButton stopup(16);     //pin D0
ezButton stopdown(0);    //pin D3

AccelStepper stepper(AccelStepper::DRIVER, stepPin, dirPin);

#define STATE_DOWN 61
#define STATE_MOVE_UP 62
#define STATE_ST_MOVE_UP 63
#define STATE_UP 64
#define STATE_MOVE_DOWN 65
#define STATE_ST_MOVE_DOWN 66

#define MAX_POSITION 230000
#define MIN_POSITION 0

int stepperState = STATE_DOWN;
int direction = 1;
long targetPos = 0;

void setup() {

  pinMode(dirPin, OUTPUT);
  pinMode(stepPin, OUTPUT);
  pinMode(enPin, OUTPUT);
  pinMode(relayPin, OUTPUT);

  buttonup.setDebounceTime(50);
  buttondown.setDebounceTime(50);
  stopup.setDebounceTime(50);
  stopdown.setDebounceTime(50);

  stepper.setMaxSpeed(9600);
  stepper.setAcceleration(3200);
  stepper.setSpeed(9600);
}

void loop() {

  buttonup.loop();
  buttondown.loop();
  stopup.loop();
  stopdown.loop();

  if (buttonup.isPressed())
    stepperState = STATE_MOVE_UP;

  else if (buttondown.isPressed())
    stepperState = STATE_MOVE_DOWN;

  if (stopup.isPressed())
    stepperState = STATE_ST_MOVE_UP;

  if (stopdown.isPressed())
    stepperState = STATE_ST_MOVE_DOWN;


  switch (stepperState) {

    case STATE_DOWN:
      //digitalWrite(enPin, HIGH); // драйвер шагового двигателя отключен
      stepper.setCurrentPosition(MIN_POSITION);
      digitalWrite(relayPin, LOW);
      break;

    case STATE_MOVE_UP:
      //digitalWrite(enPin, LOW); // драйвер шагового двигателя включен
      direction *= 1;
      targetPos = direction * MAX_POSITION;
      stepper.moveTo(targetPos);
      stepper.run();
      if (stepper.distanceToGo() == 0) {
        stepperState = STATE_UP;
      }
      digitalWrite(relayPin, HIGH);
      break;

    case STATE_ST_MOVE_UP:
      stepper.setCurrentPosition(MAX_POSITION);
      digitalWrite(relayPin, HIGH);
      stepperState = STATE_UP;
      break;

    case STATE_UP:
      //digitalWrite(enPin, HIGH); // драйвер шагового двигателя отключен
      digitalWrite(relayPin, HIGH);
      break;

    case STATE_MOVE_DOWN:
      //digitalWrite(enPin, LOW); // драйвер шагового двигателя включен
      direction *= -1;
      targetPos = direction * MIN_POSITION;
      stepper.moveTo(targetPos);
      stepper.run();
      if (stepper.distanceToGo() == 0) {
        stepperState = STATE_DOWN;
        //digitalWrite(enPin, HIGH);  // драйвер шагового двигателя отключен
      }
      digitalWrite(relayPin, HIGH);
      break;

    case STATE_ST_MOVE_DOWN:
      stepper.setCurrentPosition(MIN_POSITION);
      digitalWrite(relayPin, LOW);
      stepperState = STATE_DOWN;
      break;
  }
}

вариантов, как я пытался игнорировать или поставить условие на отработку “stopdown” (нижнего концевика) тоже было много, но они у меня не работают, различные, не получается у меня это.
Подскажите в какую сторону смотреть.
Без пустого трепа, даже без кода, просто подскажите,
если можете.

плата esp_8266

покажите ваши попытки в этом коде, я не вижу ничего подобного

И какие проблемы? В конце сетапа проверить замкнута ли нога концевика и если замкнута то сдвинуть вверх до размыкания.

Подскажите пожалуйста правильное решение, можно без кода, просто укажите через что это правильно решается. На пустые “воспитательные рассуждения” у меня просто нет ни времени ни желания.

Я не понимаю, а в ходе нормальной работы программы (поле успешного старта) этот концевик никогда не нажимается, что ли? Или после первого нажатия программа зависает наглухо?
В чем разница между стартом и работой?

Проверка состояния концевика выполняется командой Функция digitalRead() | Аппаратная платформа Arduino

Я сразу написал что парковаться/отъезжать нет возможности. Такова конструкция. Каретка опустилась (села на концевик) и затем например контроллер выключился. А затем включился
и не работает потому что концевик зажат. Как отъезжать от концевика у меня вариант есть,
только применить его не могу.
Даже двух-трех миллиметров чтобы съехать с индуктивного датчика у меня нет.
В программе все с концевиками замечательно, туда-сюда все ходит, ничего не мешает.
Проблема только на момент включения самого контроллера.

обьясните

не понимаю.
А вот если при работе у вас каретка опустилась и нажала концевик - почему контроллер не зависает?

Не надо использовать ezButton

@applecad
Для кода из сообщения 9 -попробуйте опрашивать каждый концевик ТОЛЬКО при движении в направлении К НЕМУ:

Если выключается/включается контроллер в любой точке между концевиками, то все работает замечательно, многократно, без проблем.А если при включении контроллера каретка стоит в крайнем (любом) положении, то есть мы включаем контроллер, а концевик уже нажат - то программа не работает.
Допустим, концевик это та же кнопка.
Представьте, что вы сначала нажали какую-то кнопку (и удерживаете ее) а потом включили сам контроллер.
Как игнорировать эту кнопку?