Помогите упростить код убрать половину if else вот код

Тема в разделе "Arduino & Shields", создана пользователем ArtemFBR, 15 янв 2022.

  1. ArtemFBR

    ArtemFBR Нуб

    помогите упростить код убрать половину if else вот код, за помощь буду благодарен.
    Код (C++):
    int red5Pin = 2;
    int green5Pin = 3;
    int orange5Pin = 4;

    int red3Pin = 7;
    int green3Pin = 5;
    int orange3Pin = 6;
    int red1Pin = 8;
    int green1Pin = 9;
    int orange1Pin = 10;


    int rail1_Pin = 14;
    int rail2_Pin = 15;
    int rail3_Pin = 16;

    int rail1 = 0;
    int rail2 = 0;
    int rail3 = 0;

    void setup()
    {
      pinMode(rail1_Pin, INPUT_PULLUP); // вход первого пути
      pinMode(rail2_Pin, INPUT_PULLUP); // вход второго пути
      pinMode(rail3_Pin, INPUT_PULLUP); // вход третево пути

      pinMode(red5Pin, OUTPUT); //к5
      pinMode(green5Pin, OUTPUT); //з5
      pinMode(orange5Pin, OUTPUT); //ж5

      pinMode(red3Pin, OUTPUT); //к3
      pinMode(green3Pin, OUTPUT); //з3
      pinMode(orange3Pin, OUTPUT); //ж3

      pinMode(red1Pin, OUTPUT); //к1
      pinMode(green1Pin, OUTPUT); //з1
      pinMode(orange1Pin, OUTPUT); //ж1

      //таймер считивания сигналов
      Serial.begin(9600);
    }

    void loop()
    {

      int rail1 = !digitalRead(rail1_Pin);
      int rail2 = !digitalRead(rail2_Pin);
      int rail3 = !digitalRead(rail3_Pin);

      if (rail1 == 0 && rail2 == 0 && rail3 == 0)
      {

        digitalWrite(green1Pin, HIGH);
        digitalWrite(orange1Pin, LOW);
        digitalWrite(red1Pin, LOW);

        digitalWrite(green3Pin, HIGH);
        digitalWrite(orange3Pin, LOW);
        digitalWrite(red3Pin, LOW);

        digitalWrite(red5Pin, LOW);
        digitalWrite(green5Pin, HIGH);
        digitalWrite(orange5Pin, LOW);
      }
      else if (rail1 == 1 && rail2 == 0 && rail3 == 0)
      {

        digitalWrite(green1Pin, LOW);
        digitalWrite(orange1Pin, LOW);
        digitalWrite(red1Pin, HIGH);

        digitalWrite(green3Pin, HIGH);
        digitalWrite(orange3Pin, LOW);
        digitalWrite(red3Pin, LOW);

        digitalWrite(red5Pin, LOW);
        digitalWrite(green5Pin, HIGH);
        digitalWrite(orange5Pin, LOW);
      }
      else if (rail1 == 0 && rail2 == 1 && rail3 == 0)
      {

        digitalWrite(green1Pin, LOW);
        digitalWrite(orange1Pin, HIGH);
        digitalWrite(red1Pin, LOW);

        digitalWrite(green3Pin, LOW);
        digitalWrite(orange3Pin, LOW);
        digitalWrite(red3Pin, HIGH);

        digitalWrite(red5Pin, LOW);
        digitalWrite(green5Pin, HIGH);
        digitalWrite(orange5Pin, LOW);
      }
      else if (rail1 == 0 && rail2 == 0 && rail3 == 1)
      {
        digitalWrite(green1Pin, HIGH);
        digitalWrite(orange1Pin, HIGH);
        digitalWrite(red1Pin, LOW);
        digitalWrite(green3Pin, LOW);
        digitalWrite(orange3Pin, HIGH);
        digitalWrite(red3Pin, LOW);

        digitalWrite(red5Pin, HIGH);
        digitalWrite(green5Pin, LOW);
        digitalWrite(orange5Pin, LOW);
      }
      else if (rail1 == 1 && rail2 == 1 && rail3 == 0)
      {
        digitalWrite(green1Pin, LOW);
        digitalWrite(orange1Pin, LOW);
        digitalWrite(red1Pin, HIGH);

        digitalWrite(green3Pin, LOW);
        digitalWrite(orange3Pin, LOW);
        digitalWrite(red3Pin, HIGH);

        digitalWrite(red5Pin, LOW);
        digitalWrite(green5Pin, HIGH);
        digitalWrite(orange5Pin, LOW);
      }
      else if (rail1 == 1 && rail2 == 0 && rail3 == 1)
      {
        digitalWrite(green1Pin, LOW);
        digitalWrite(orange1Pin, LOW);
        digitalWrite(red1Pin, HIGH);

        digitalWrite(green3Pin, LOW);
        digitalWrite(orange3Pin, HIGH);
        digitalWrite(red3Pin, LOW);

        digitalWrite(red5Pin, HIGH);
        digitalWrite(green5Pin, LOW);
        digitalWrite(orange5Pin, LOW);
      }
      else if (rail1 == 0 && rail2 == 1 && rail3 == 1)
      {
        digitalWrite(green1Pin, LOW);
        digitalWrite(orange1Pin, HIGH);
        digitalWrite(red1Pin, LOW);

        digitalWrite(green3Pin, LOW);
        digitalWrite(orange3Pin, LOW);
        digitalWrite(red3Pin, HIGH);

        digitalWrite(red5Pin, HIGH);
        digitalWrite(green5Pin, LOW);
        digitalWrite(orange5Pin, LOW);
      }
      else if (rail1 == 1 && rail2 == 1 && rail3 == 1)
      {
        digitalWrite(green1Pin, LOW);
        digitalWrite(orange1Pin, LOW);
        digitalWrite(red1Pin, HIGH);

        digitalWrite(green3Pin, LOW);
        digitalWrite(orange3Pin, LOW);
        digitalWrite(red3Pin, HIGH);

        digitalWrite(red5Pin, HIGH);
        digitalWrite(green5Pin, LOW);
        digitalWrite(orange5Pin, LOW);
      }
      delay(100);
    }
     
    Последнее редактирование модератором: 15 янв 2022
  2. Airbus

    Airbus Радиохулиган Модератор

    Зачем 10 одинаковых тем создавать?
    [​IMG]
     
  3. Airbus

    Airbus Радиохулиган Модератор

    Что значит убрать половину if else? С какой целью?
     
    issaom нравится это.
  4. shabronov

    shabronov Нерд

    Уважаемый ArtemFBR Может такой вариант реализации создать по приведенному примеру ниже.

    : 1_й_уровень ( цикл ) 0x100 0 BEGIN DUP . ( cмотрим ) 1+ 2DUP = UNTIL 2DROP ;
    : 2й_уровень ( цикл ) 0x100 0 DO 1_й_уровень LOOP ;
    \ другие уровни или действия
    : 3й_уровень ( выбор )
    0 BEGIN ( при нажатии клавиши 1 выбираем 1_й_уровень )
    ( при нажатии клавиши 2 выбираем 1_й_уровень )
    [CHAR] 1 OVER = IF 1_й_уровень THEN
    [CHAR] 2 OVER = IF 2й_уровень THEN
    \ добавить свои уровни если потребуются
    KEY? ( K ) DUP 0x1B = UNTIL DROP ;

    Пример компактной записи выбора пути на условном операторе IF THEN (если то )
    Подробнее пример с условием выбора есть по адресу
    Это метод "вложение вложений" во "вложения" и получается запись удобная для анализа и работы. Для Ардуины тоже есть реализация на языке FORTH Так что, если у Вас =железо= на Ардуино, то можно решить Вашу задачу. Надеюсь, что донес глубину мысли.
     
  5. Рокки1945

    Рокки1945 Гуру

    пиши функцию и отправляй туда 3 аргумента
     
  6. parovoZZ

    parovoZZ Гуру

    А зачем?
     
    Airbus нравится это.
  7. akl

    akl Гуру

    начинать надо с описания человеческим языком алгоритма, по которому работает эта приблуда.
    я например заметил, что красная лампочка загорается всегда, когда на соответствующем канале замыкается кнопка. то есть для красных лампочек условия вообще не нужны. С остальными уже не очень понятно, но вполне возможно зная общий алгоритм можно было бы сильно переделать программу
     
  8. Airbus

    Airbus Радиохулиган Модератор

    Там разные условия для всех входных комбинаций.Про выхода пока говорить не будем. Поэтому хз что там ТС хочет убрать
     
  9. akl

    akl Гуру

    убрал ваще все ифы полностью
    елсы тоже уничтожил на корню
    Код (C++):
        int rail1 = !digitalRead(rail1_Pin);
        int rail2 = !digitalRead(rail2_Pin);
        int rail3 = !digitalRead(rail3_Pin);

        digitalWrite(green1Pin, !rail1&&!rail2);
        digitalWrite(orange1Pin, !rail1&&(rail2||rail3));
        digitalWrite(red1Pin, rail1);

        digitalWrite(green3Pin, !rail2&&!rail3);
        digitalWrite(orange3Pin, !rail2&&rail3);
        digitalWrite(red3Pin, rail2);

        digitalWrite(green5Pin, !rail3);
        digitalWrite(orange5Pin, 0);
        digitalWrite(red5Pin, rail3);
     
    ArtemFBR, parovoZZ и Рокки1945 нравится это.
  10. b707

    b707 Гуру

    можно подумать, что Си не поддерживает вложенные условия...
    Не пишите фигни...
     
  11. shabronov

    shabronov Нерд

    Понял Вас b707 Но если отвергаешь, то предлагай! Покажите вложенные условия на СИ и сравним компактность текста программы. А так это просто "юзерский наезд ". Просьба ArtemFBR в "упростить код" и кстати ответа нет. А то что "вложения и т.д" существуют во всех языкам программирования можете не сомневаться. Надеюсь что донес глубину мысли и вложенные идеи.
     
  12. akl

    akl Гуру

    но я же упростил примерно в 8 раз. вернее сделал компактнее, что не одно и то же.
    Артем учится мигать светодиодами, а ему предлагают изучить другой язык. А для ардуины на этом форте или как его вообще есть хоть какие-то материалы?
     
  13. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Если Ардуинский язык поддерживает трехмерный массив (array), то забить значения в массив и выбирать по значениям индексов (координат). Будет совсем без ифов / элсов.
    ПС. Английский Массив (array) сильно напоминает русскую "ораву", означающую примерно то же самое.
     
  14. parovoZZ

    parovoZZ Гуру

    Чой та и зачем оно?
    Надо сравнивать алгоритмы. А код должен быть легко читаемым, а вовсе не компактным. Компактность кода вовсе не приводит к быстрому выполнению или компактности кода для МК
     
  15. b707

    b707 Гуру

    На Си нет н-мерных массивов, только одномерные.
    Трехмерный поддерживается как массив массивов массивов
     
  16. b707

    b707 Гуру

    вы правда считаете что ответ на вопрос "как упростить код на Си" - это выучить другой язык?
    Который, к тому же, на ардуине не применим?
     
  17. shabronov

    shabronov Нерд

    Уважаемые все, кто желает помочь ArtemFBR Что "за буря в стакане воды?" Где автор вопроса? Не вижу смысла в полемике без автора. Уровни знаний, понимания различные. И запрашивающего ArtemFBR и у всех на форуме. Предлагаю подождать автора ArtemFBR. Для расслабления вариант видов вопрошающего или возможно ошибаюсь и все приличнее.
     
  18. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Еще проще - зададим ТРИ одномерных массива размерностью 8.
    Бинарная комбинация трёх входных сигналов - индекс.
    И никаких ифов элсов. Примитивная задачка.
     
    Последнее редактирование: 16 янв 2022
  19. Рокки1945

    Рокки1945 Гуру

    Я вообще тут if else - не увидел
     
  20. b707

    b707 Гуру

    не надо никаких тройных массивов.
    Три входных сигнала - три бита. Если выбрать входные пины на одном порту МК - все три можно читать одной операцией
    Выходные сигналы - тоже битами. Выходов у ТС 9, значит для хранения понадобится uint16_t

    Так что можно взять один единственный массив, индекс - трехбитовое состояние входа, значение - 9битное состояние выхода.

    А вообще, если приглядеться, состояние второй и третьей тройки выходов зависит только от соответсвующих входов.
    Лишь состояние первой тройки зависит не только от входа rail1. но и 2 и 3. Вполне вероятно, что ТС просто ошибся, набивая текст и все три группы сигналов полностью независимы - тогда задача упрощается на порядок.
     
    Последнее редактирование: 17 янв 2022