Проблема с IF (опрашиваю через ИФ 3 кнопки)

sanch1995
Offline
Зарегистрирован: 09.09.2016

Всем доброй ночи!

Играюсь с ардуиной... К сожалению возникла проблема с обычным опросом.

код ниже



byte esc = 4;
byte okay = 2;
byte menu = 12;
bool escST;
bool okayST;
bool menuST;
void setup() {
Serial.begin(9600);
pinMode(esc, INPUT);
pinMode(okay, INPUT);
pinMode(menu, INPUT);
digitalWrite(esc, HIGH);
digitalWrite(okay, HIGH);
digitalWrite(menu, HIGH);
}

void loop() {
int select;
escST = digitalRead(esc);
delay(50);
Serial.print("escST = ");
Serial.println(escST);
//------------------------
menuST = digitalRead(menu);
delay(50);
Serial.print("menuST = ");
Serial.println(menuST);
//----------------
okayST = digitalRead(okay);
delay(50);
Serial.print("okayST = ");
Serial.println(okayST);
//--------------
if(escST == 0){
select = 1;
}
if(menuST == 0){
select = 2;
}

if(okayST == 0){
select = 3;
}
else{
select = 0;
}
Serial.print("select = ");
Serial.println(select);
delay(1000);
}

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

3 кнопки "ОК" "выход" и "меню"

по схеме - подкл через кнопку и резистор 5к к земле+внутренний подтяг резисторами делаю... по факту нажатой может быть только 1 кнопка из 3

плата arduino mini pro на 328ой меге

проблема: при использовании 3 шт IF - значение всегда или 0(если не нажимать ничего) и 3 если нажата "esc"/

я так понимаю, что я где то навалял с тем, что нужно как то заставить игнорировать другие IF если хоть 1 из них верно. Как это сделать подскажите?(мб что то вроде перехода, хотя я думаю есть способ изменить код и обойтись без меток и goto). 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

sanch1995 пишет:

резистор 5к к земле+внутренний подтяг резисторами делаю...

надеюсь, внутренний подтяг тоже к земле? :D

замени резисторы на 1К и убери делаи из кода.

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

else в строке 44 относится не ко всем if'ам, а только к самому последнему. Поэтому, если условие в строке 41 неверно, то срабатывает else независимо от условий в строках 34 и 37. 

sanch1995
Offline
Зарегистрирован: 09.09.2016

ЕвгенийП, вот я кажется тоже к тому и пришел, можете подсказать, как исправить данный момент?

sanch1995
Offline
Зарегистрирован: 09.09.2016

Мда, видимо в час ночи я уже никакой((((

Кстати, кто может подсказать, предположим у меня 6 кнопок, если не использовать внутренний подтяг к плюсу - можно ли сделать так:

тоесть 6 кнопок  ----|резистор|----/кнопка1...6/---•••---|резистор2|----земля

••• - подкл к ардуино.

вопрос, может  ли резистор 2 быть общим для всех 6 кнопок??? И почему так???

Заранее благодарю!)

 

проблема решена, решил с помощью добавления переменной bool fin;

записываю в нее единицу если хоть 1 IF истину дает.

В конце проверяю fin=0? если да то выдаю в итог ответ 0. Думаю кому нибудь пригодится))))))

//--------------
bool fin = 0;
if(escST == 0){
select = 1;
fin = 1;
}
if(menuST == 0){
select = 2;
fin = 1;
}

if(okayST == 0){
select = 3;
fin = 1;
}
if(fin == 0){
select = 0;
}
Serial.print("select = ");
Serial.println(select);
delay(1000);
Serial.println("----------------");
}

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Может лутше использовать 

if ()
{
}
else if ()
{  
}

 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016
лутше
 
if () {}
if () {}
if () {}
if () {}
if () {}
sanch1995
Offline
Зарегистрирован: 09.09.2016

с Элсе тоже что то не срослось((((

а что по поводу общего резистора подтягивающего на 6 кнопок?

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

sanch1995 пишет:

а что по поводу общего резистора подтягивающего на 6 кнопок?

ты собрался замкнуть пины кнопок между собой?

Radjah
Offline
Зарегистрирован: 06.08.2014

Сначала в IDE нажимаешь Ctrl+T для автоматического форматирования кода и расстановки отступов, потом смотришь на вложенность операторов.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Пробуй.

byte esc = 4;
byte okay = 2;
byte menu = 12;

byte select = 0;

void setup() {
  Serial.begin(9600);
  pinMode(esc, INPUT);
  pinMode(okay, INPUT);
  pinMode(menu, INPUT);
  digitalWrite(esc, HIGH);
  digitalWrite(okay, HIGH);
  digitalWrite(menu, HIGH);
}

void loop() {
  if (!digitalRead(esc))
  {
    select = 1;
    Serial.print("select = ");
    Serial.println(select);
  }

  else if (!digitalRead(okay))
  {
    select = 2;
    Serial.print("select = ");
    Serial.println(select);
  }

  else if (!digitalRead(menu))
  {
    select = 3;
    Serial.print("select = ");
    Serial.println(select);
  }

}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Клапауций 232 пишет:

sanch1995 пишет:

а что по поводу общего резистора подтягивающего на 6 кнопок?

ты собрался замкнуть пины кнопок между собой?

А почему нет, если сигнал для Ардуины нужно подавать из шести разных мест?

sanch1995
Offline
Зарегистрирован: 09.09.2016

Всем большое спасибо, тему можно закрыть)) отдельно спасибо ЕвгенийП за наводку, и vosara за код)