Нужна помощь с if
- Войдите на сайт для отправки комментариев
Сб, 17/03/2018 - 20:07
Вот блок кода:
butt_led1 = !digitalRead(6);
butt_led2 = !digitalRead(7);
butt_led3 = !digitalRead(8);
Serial.println(i);
////
if(butt_led1 == 1 && butt_led1_flag == 0)
{
i++;
butt_led1_flag = 1;
}
if(butt_led2 == 1 && butt_led2_flag == 0)
{
i++;
butt_led2_flag = 1;
}
if(butt_led3 == 1 && butt_led3_flag == 0)
{
i++;
butt_led3_flag = 1;
}
////
if(butt_led1 == 1 && butt_led1_flag == 1)
{
i--;
butt_led1_flag = 0;
}
На данный момент задача кода выводить значение переменной i (которые варьюруются от 0 до 3) в ком-порт.
Почему-то не опрашивается butt_led1, хотя все флажки изначально равны 0. Помогите найти ошибку.
Если убрать последний if, то все работает, и значения i увеличиваются. Но мне нужно их и уменьшать.
анекдот. Дед учит внучка жизни.
-Запомни ,внучек, штаны нужно одевать после того как вытер жопу бумагой, а не наоборот.
04Serial.println(i);Почему у вас вывод стоит перед if.
Код нужен полностью. Не 1000+ строк, конечно, а короткий код в котором чётко проявляется проблема. Так, чтобы этот код можно было запустить и посмотреть.
По нынешнему огрызку сказать ничего нельзя, т.к. ХЗ как описаны переменные и ХЗ когда и как это выполняется.
Код нужен полностью. Не 1000+ строк, конечно, а короткий код в котором чётко проявляется проблема. Так, чтобы этот код можно было запустить и посмотреть.
По нынешнему огрызку сказать ничего нельзя, т.к. ХЗ как описаны переменные и ХЗ когда и как это выполняется.
Код целиком.
boolean butt_led1; //кнопки для переключения светодиодов boolean butt_led2; boolean butt_led3; int i = 0; int butt_led1_flag = 0; int butt_led2_flag = 0; int butt_led3_flag = 0; void setup() { pinMode(2, OUTPUT); //led1 pinMode(3, OUTPUT); //led2 pinMode(4, OUTPUT); //led3 pinMode(5, OUTPUT); //potent_led pinMode(6, INPUT_PULLUP); //butt_led1 pinMode(7, INPUT_PULLUP); //butt_led2 pinMode(8, INPUT_PULLUP); //butt_led3 Serial.begin(9600); } void loop() { ////обработка нажатий butt_led//// butt_led1 = !digitalRead(6); butt_led2 = !digitalRead(7); butt_led3 = !digitalRead(8); //// if(butt_led1 == 1 && butt_led1_flag == 0) { i++; butt_led1_flag = 1; } if(butt_led2 == 1 && butt_led2_flag == 0) { i++; butt_led2_flag = 1; } if(butt_led3 == 1 && butt_led3_flag == 0) { i++; butt_led3_flag = 1; } //// if(butt_led1 == 1 && butt_led1_flag == 1) { i--; butt_led1_flag = 0; } Serial.println(i); }Так в строках 45-49 отменяется все, что было сделано в строках 29-33.
Так условия у Вас так рулят... Сперва Вы тут
if(butt_led1 == 1 && butt_led1_flag == 0) { i++; butt_led1_flag = 1; }Нарастили i и выставили флаг butt_led1_flag в 1, что разрешает выполниться
if(butt_led1 == 1 && butt_led1_flag == 1) { i--; butt_led1_flag = 0; }и уменьшить i
Т.е. при нажатии butt_led1 переменная i "топчется на месте"
Смотрите. В строке 25 Вы читаете состояние кнопки. Допустим Ваш butt_led1 стала равной единице. Условие в строке 29 выполнится. i увеличится, флаг взведётся. Дальше пока не интересно до строки 45. Условие выполнится. Соответственно, i уменьшится, флаг, сбросится. Дальше печатается i, которая один раз увеличилась на 1 и один раз уменьшилась на 1, т.е. не изменилась. Уж невелик "алгоритм", можно пальцем по строчкам "отладить". Всё работает, как запрограммировано, а уж чего Вы хотели - другой вопрос.
Вообще изначально задумывалось так - нажал кнопку: значение i стало 1, нажал еще раз - 2, еще - 3, еще нажатие и сброс на 1.
Но пока что такими знаниями не обладаю. Думал, что нужен цикл for, но не знаю, как именно выставить условия.
Остановился на трех кнопках - нажат butt_led1 - горит первый светодиод и тд.
Если говорить об этом коде, как переписать не добавляя куча флажков ?
а хотелось так:
нажал 1 раз загорелся один led, нажал 2-ой добавился второй led и т.д. После 3-го погасли все или стали тухнуть по одному?
или так:
нажал 1 раз загорелся первый led, нажал 2-ой загорелся второй led, а первый погас и т.д.?
а хотелось так:
нажал 1 раз загорелся один led, нажал 2-ой добавился второй led и т.д. После 3-го погасли все или стали тухнуть по одному?
или так:
нажал 1 раз загорелся первый led, нажал 2-ой загорелся второй led, а первый погас и т.д.?
сначала хотел отработать нажатия кнопок используя значения переменной для наглядности, но на практике задумывался второй вариант.
Так в первом условии, где наращиваете счётчик, проверяйте, равен ли он 3-м и тогда присваивайте ему значение 1, вместо наращивания. Вроде, никаких знаний и не надо. ))
Так в первом условии, где наращиваете счётчик, проверяйте, равен ли он 3-м и тогда присваивайте ему значение 1, вместо наращивания. Вроде, никаких знаний и не надо. ))
после Вашего комментария меня почему-то осенило, и я заменил бесконечные if этим кодом:
while (butt_led1 == true) { i = 1; break; } while (butt_led2 == true) { i = 2; break; } while (butt_led3 == true) { i = 3; break; }while (butt_led1 == true) { i = 1; break; } while (butt_led2 == true) { i = 2; break; } while (butt_led3 == true) { i = 3; break; }Бармен, мне два стакана того же самого....
Бармен, мне два стакана того же самого....
Лучше не привыкайте к этой гадости!