Здравствуйте. В общем, название темы вы уже прочитали. Представляю своего франкенштейна на суд людской Код (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 начинают работать как триггеры. Проблема в том, что они продолжают работать точно также, как и в первом режиме. В чем проблема?
Так, проблема крылась вот тут: Код (C++): if (digitalRead(Avtomat)==LOW) { break; } Оказалось, надо сменить, LOW на HIGH. Почему так произошло я сейчас думать не в состоянии, но факт остается фактом
Теперь надо прикрутить запись false в переменные v_run и n_run при выходе из while. Почему-то, когда я впихивал так, мне никакого оповещения не приходило: Код (C++): if (digitalRead(Avtomat)==HIGH) { break; v_run=false; n_run=false; Serial.println("While break"); } Я закомментировал эти строки, и код перестал выходить из цикла. Что логично, в принципе. Но почему переменным-то значения не присваиваются?
Выдалась минутка, подумал и разобрался в причинах проблемы. При наличии на 4(Avtomat) сигнала низкого уровня(который управляется логическим нулевым уровнем) просто срабатывало условие выхода из цикла, и дальше уже работал исправный код