Короткий простой код управления кареткой

достаточно.

1 лайк

как задумано не работает.

20 выход встаёт в лог 1 при разомкнутых герконах (каретка между датчиков). Замыкание геркона 9 дает переключение выхода 22 с 0 на 1, но не гасит выход 20 с 1 на 0.

нарушается требование на запрет одновременного высокого уровня на выходах. Дожен быть только на одном из них

Конечно могут.
Поэтому нужно ставить защиту от дураков, в том числе и в коде.

ТС, у тебя в коде как минимум не хватает двух переменных.
Одна из них должна указывать разрешение на движение, а вторая направление движения…

все верно - согласно строке 12

а вот этого в текущем коде быть не может, если вы не перепутали выводы.

Вообще, никогда не пользуйтесь номерами пинов в коде, всегда давайте им понятные имена - напрмер верхний геркон и нижний. И пины моторчиков тоже нужно обозначить как вверх и вниз

Вы какой код в плату заливаете - тот в что на форум выложили или это исправленная версия, а в плате код с добавлениеми?

всегда думал что концевики в разных концах стоят, как их одновременно нажать, разве что принудительно руками.

вот этот

void setup() {
  pinMode(10, INPUT);
  pinMode(9, INPUT);
  pinMode(20, OUTPUT);
  pinMode(22, OUTPUT);
}

void loop() {
  if (digitalRead(10) == 0 && (digitalRead(9) == 0 && (digitalRead(20) == 0 || digitalRead(22) == 0))) { // если каретка ни вверху и не внизу и никакие пины не подают сигналы (лог 0), то двигать вниз после паузы
    delay(1000); // пауза перед движением вниз
    digitalWrite(20, 1); // едем вниз
  } else { // если услвоие в строке 9 не выполняется, тоесть каретка или едет или находится вверху или внизу, проверяем на езду и положение.
    if (digitalRead(10) == 1 && digitalRead(9) == 0) { // если есть лог 1 на выходе 10,  и лог 0 на выходе 9, то каретка вверху, надо её остановить. сделать паузу и начать двигать вниз
      digitalWrite(22, 0); // останавливаем движение каретки вверх
      delay(1 * 1000); // пауза перед спуском
      digitalWrite(20, 1); // начинаем движение каретки вниз
    } else {
      if (digitalRead(10) == 0 && digitalRead(9) == 1) { // если ло 1 на выходе 9 и лог 0 на выходе 10, то каретка внизу, надо её остановить, сделать паузу, двигать вверх
        digitalWrite(20, 0); // останавливаем движение вниз
        delay(1 * 1000); // пауза в нижнем положении
        digitalWrite(22, 1); // начинаем движение вверх
      }
    }
  }
}
void setup() {
  pinMode(10, INPUT);
  pinMode(9, INPUT);
  pinMode(20, OUTPUT);
  pinMode(22, OUTPUT);
  if (digitalRead(10) == 0 && digitalRead(9) == 0 ) { // если каретка ни вверху и не внизу , то двигать вниз после паузы
    delay(1000); // пауза перед движением вниз
    digitalWrite(20, 1); // едем вниз
}

void loop() {


    if (digitalRead(10) == 1 && digitalRead(9) == 0) { // если есть лог 1 на выходе 10,  и лог 0 на выходе 9, то каретка вверху, надо её остановить. сделать паузу и начать двигать вниз
      digitalWrite(22, 0); // останавливаем движение каретки вверх
      delay(1 * 1000); // пауза перед спуском
      digitalWrite(20, 1); // начинаем движение каретки вниз
      delay(1 * 1000); 
    }
    if (digitalRead(10) == 0 && digitalRead(9) == 1) { // если ло 1 на выходе 9 и лог 0 на выходе 10, то каретка внизу, надо её остановить, сделать паузу, двигать вверх
        digitalWrite(20, 0); // останавливаем движение вниз
        delay(1 * 1000); // пауза в нижнем положении
        digitalWrite(22, 1); // начинаем движение вверх
        delay(1 * 1000); 
    }
}

это новая фича какая то?

Если я правильно понимаю, тут движение вниз описывается как постоянное условие потому что в сетапе. Т.е. едем вниз всегда если с концевиков нет сигнала. Но его не будет, если каретка едет вверх. Нужна проверка на движение, т.е. двигаться вниз можно только если нет сигналов двигаться вверх.

неправильно

Почитайте что такое setap() loop()

я не нашел как указать время в секундах. 1x1000 = 1 сек., 2x1000 = 2 сек.

Логическая 1 на выходе 20 не переключается в 0 при любом положении каретки. Но из положения внизу можно включить лог 1 на 22 выходе - двигать вверх. Но не поедет - одновременное логическое 1 на 20 и 22 выходе. Конфликт сигналов.

можем или 0-1 или 1-0. еще можем стоять 0-0, но 1-1 означет надо ехать и вниз и вверх одновременно. Что-то не работает.

1000 мс = 1 сек., 2000 мс = 2 сек.
не?

Ищите причину. В этом коде это возможно только если концевик на пине 9 не работает вовсе. Проверяйте схему и код.

технически, да.
Чисто для удобства менять эту константу в будущем в широком диапазоне, скажем нужно 1час 45 минут, долго вычислять сколько это будет в миллисекундах.

задержка почти на 2 часа, аааа…
и интересно как вы ее запишите в своем стиле?

Для удобства пишут макросы, а лучше constexpr-функции.

1 лайк

@Топтунов

вы вообще пробовали код, что я вам дал? Думаю что нет. В нем есть ошибка, из-за которой он не компилируется - а вы молчите. Значит не пробовали.

Какого фига тогда вы пишете эту чушь:

Иди решайте свои проблемы сами.

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