Отчаялся разобраться в работе собственного кода

Тема в разделе "Arduino & Shields", создана пользователем Vetrinus, 16 ноя 2015.

  1. Vetrinus

    Vetrinus Гик

    Здравствуйте. В общем, название темы вы уже прочитали. Представляю своего франкенштейна на суд людской
    Код (C++):
    #define Avtomat 4
    #define Vpered 2
    #define Nazad 3
    bool v_run=false;
    bool n_run=false;
    void setup() {
      pinMode(Vpered, INPUT_PULLUP);
      pinMode(Nazad, INPUT_PULLUP);
      pinMode(Avtomat, INPUT_PULLUP);
      pinMode(5, OUTPUT); //Плюсовой Выход
      digitalWrite(5, LOW);
      pinMode(6, OUTPUT); //Минусовой Выход
      digitalWrite(6, HIGH);
    }

    void loop() {
      bool p2=digitalRead(Vpered);
      bool p3=digitalRead(Nazad);
      bool p4=digitalRead(Avtomat); //Управляющий сигнал - минус. В "ненажатом" положении digitalRead возвратит true.
      while(!p4) { //Следовательно, если я хочу, чтобы while работал, пока нажата кнопка, мне нужно чтобы в аргументе while был логический true, мне надо инвертировать переменную p4.
      if (digitalRead(Avtomat)==LOW) {
        break;
      }
      else if (p2==LOW) {
        //digitalWrite(5, HIGH);
        v_run=!v_run;
      }
      else if (p3==LOW) {
      n_run=!n_run;
       // digitalWrite(5, HIGH);
       // digitalWrite(6, LOW);
      }
      digitalWrite (5, v_run);
      digitalWrite(6, n_run);
      }//while end
      if (p2==LOW) {
        digitalWrite(5, HIGH);
     
      }
      else if (p3==LOW) {
        digitalWrite (6, LOW);
        digitalWrite (5, HIGH);
      }
      else {
        digitalWrite(5, LOW);
        digitalWrite(6, HIGH);
      }
    }

     
    , и расскажу, что от него требуется. А требуется от него вот что:
    1) 2 режима работы:
    Первый, в котором просто происходит обработка двух входов вот этим кодом, к которому нареканий нет.

    Код (C++):
    if (p2==LOW) {
        digitalWrite(5, HIGH);
     
      }
      else if (p3==LOW) {
        digitalWrite (6, LOW);
        digitalWrite (5, HIGH);
      }
      else {
        digitalWrite(5, LOW);
        digitalWrite(6, HIGH);
      }
    И второй, который крутится внутри while, в котором при наличии 0 уровня на 4 пине, входы 2 и 3 начинают работать как триггеры. Проблема в том, что они продолжают работать точно также, как и в первом режиме. В чем проблема?
     
  2. Vetrinus

    Vetrinus Гик

    Так, проблема крылась вот тут:
    Код (C++):
    if (digitalRead(Avtomat)==LOW) {
        break;
      }
    Оказалось, надо сменить, LOW на HIGH. Почему так произошло я сейчас думать не в состоянии, но факт остается фактом
     
  3. Vetrinus

    Vetrinus Гик

    Теперь надо прикрутить запись false в переменные v_run и n_run при выходе из while. Почему-то, когда я впихивал так, мне никакого оповещения не приходило:
    Код (C++):
    if (digitalRead(Avtomat)==HIGH) {
        break;
        v_run=false;
        n_run=false;
        Serial.println("While break");
      }
    Я закомментировал эти строки, и код перестал выходить из цикла. Что логично, в принципе. Но почему переменным-то значения не присваиваются?
     
  4. Vetrinus

    Vetrinus Гик

    В общем, все там присваивается, просто я не туда смотрел. Всем спасибо за помощь, все свободны :D
     
  5. Vetrinus

    Vetrinus Гик

    Выдалась минутка, подумал и разобрался в причинах проблемы. При наличии на 4(Avtomat) сигнала низкого уровня(который управляется логическим нулевым уровнем) просто срабатывало условие выхода из цикла, и дальше уже работал исправный код