Нужна помощь с if

BigMeister
Offline
Зарегистрирован: 11.02.2018


Вот блок кода:
 
  
  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 увеличиваются. Но мне нужно их и уменьшать.

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

анекдот. Дед учит внучка жизни.

-Запомни ,внучек, штаны нужно одевать после того как вытер жопу бумагой, а не наоборот.

04 Serial.println(i);

Почему у вас вывод стоит перед if.

butt_led1 = !digitalRead(6);
butt_led2 = !digitalRead(7);
butt_led3 = !digitalRead(8);
Serial.println(butt_led1 + butt_led2 + butt_led3);

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Код нужен полностью. Не 1000+ строк, конечно, а короткий код в котором чётко проявляется проблема. Так, чтобы этот код можно было запустить и посмотреть.

По нынешнему огрызку сказать ничего нельзя, т.к. ХЗ как описаны переменные и ХЗ когда и как это выполняется.

BigMeister
Offline
Зарегистрирован: 11.02.2018

ЕвгенийП пишет:

Код нужен полностью. Не 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);
}

 

ven-til
Offline
Зарегистрирован: 13.02.2018

Так в строках 45-49 отменяется все, что было сделано в строках 29-33.

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Так условия у Вас так рулят... Сперва Вы тут

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 "топчется на месте"

kalapanga
Offline
Зарегистрирован: 23.10.2016

Смотрите. В строке 25 Вы читаете состояние кнопки. Допустим Ваш butt_led1 стала равной единице. Условие в строке 29 выполнится. i увеличится, флаг взведётся. Дальше пока не интересно до строки 45. Условие выполнится. Соответственно, i уменьшится, флаг, сбросится. Дальше печатается i, которая один раз увеличилась на 1 и один раз уменьшилась на 1, т.е. не изменилась. Уж невелик "алгоритм", можно пальцем по строчкам "отладить". Всё работает, как запрограммировано, а уж чего Вы хотели - другой вопрос.

BigMeister
Offline
Зарегистрирован: 11.02.2018

Вообще изначально задумывалось так - нажал кнопку: значение i стало 1, нажал еще раз - 2, еще - 3, еще нажатие и сброс на 1. 

Но пока что такими знаниями не обладаю. Думал, что нужен цикл for, но не знаю, как именно выставить условия. 

Остановился на трех кнопках - нажат butt_led1 - горит первый светодиод и тд. 

Если говорить об этом коде, как переписать не добавляя куча флажков ?

ven-til
Offline
Зарегистрирован: 13.02.2018

а хотелось так:

нажал 1 раз загорелся один led, нажал 2-ой добавился второй led и т.д. После 3-го погасли все или стали тухнуть по одному?

или так:

нажал 1 раз загорелся первый led, нажал 2-ой загорелся второй led, а первый погас и т.д.?

 

BigMeister
Offline
Зарегистрирован: 11.02.2018

ven-til пишет:

а хотелось так:

нажал 1 раз загорелся один led, нажал 2-ой добавился второй led и т.д. После 3-го погасли все или стали тухнуть по одному?

или так:

нажал 1 раз загорелся первый led, нажал 2-ой загорелся второй led, а первый погас и т.д.?

 

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

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

BigMeister пишет:
Вообще изначально задумывалось так - нажал кнопку: значение i стало 1, нажал еще раз - 2, еще - 3, еще нажатие и сброс на 1.

Так в первом условии, где наращиваете счётчик, проверяйте, равен ли он 3-м и тогда присваивайте ему значение 1, вместо наращивания. Вроде, никаких знаний и не надо. ))

BigMeister
Offline
Зарегистрирован: 11.02.2018

OlegK пишет:

BigMeister пишет:
Вообще изначально задумывалось так - нажал кнопку: значение i стало 1, нажал еще раз - 2, еще - 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;
  }

 

sadman41
Offline
Зарегистрирован: 19.10.2016

BigMeister пишет:

 

while (butt_led1 == true)
  {
    i = 1;
    break;
  }
  while (butt_led2 == true)
  {
    i = 2;
    break;
  }
  while (butt_led3 == true)
  {
    i = 3;
    break;
  }

 

Бармен, мне два стакана того же самого....

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:

Бармен, мне два стакана того же самого....

Лучше не привыкайте к этой гадости!