Блокировка кнопки

vvadim
Offline
Зарегистрирован: 23.05.2012

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





void loop()
{

  buttonVAL = analogRead(buttonPin);
  if (buttonVAL < 100 && flag1 ==0)
  {  
    regim1 ++;   
    flag1 =1; 
    if(regim1 >3)
    {
      regim1 =1;      
    }    
  }
  if (buttonVAL == 0 && flag1 ==1) 
  {   
    flag1 =0;
  }       
  if(regim1 == 1)  {
    digitalWrite(led1XPin, HIGH); 
    digitalWrite(led2Xpin, LOW);
    digitalWrite(led3Xpin, LOW);     
  }
  if(regim1 == 2)  { 
    digitalWrite(led1XPin, LOW); 
    digitalWrite(led2Xpin, HIGH);
    digitalWrite(led3Xpin, LOW);  
  }
  if(regim1 ==3)   {
    digitalWrite(led1XPin, LOW); 
    digitalWrite(led2Xpin, LOW);
    digitalWrite(led3Xpin, HIGH);  
  }
  if ((buttonVAL > 110 && buttonVAL < 200 ) && flag2 ==0 )
  {  
    regim2 ++;   
    flag2 =1; 
    if(regim2 >3)
    {
      regim2 =1;      
    }    
  }
  if (buttonVAL == 0 && flag2 ==1) 
  {   
    flag2 =0;
  }       
  if(regim2 == 1)  {
    digitalWrite(led4XPin, LOW); 
    digitalWrite(led5Xpin, LOW);
    digitalWrite(led6Xpin, HIGH);  
  }
  if(regim2 == 2)  { 
    digitalWrite(led4XPin, LOW); 
    digitalWrite(led5Xpin, HIGH);
    digitalWrite(led6Xpin, LOW);  
  }
  if(regim2 ==3)   {
    digitalWrite(led4XPin, HIGH); 
    digitalWrite(led5Xpin, LOW);
    digitalWrite(led6Xpin, LOW);  
  }
}


 

__Alexander
Offline
Зарегистрирован: 24.10.2012

а если тупо добавить

if ((buttonVAL > 110 && buttonVAL < 200 ) && flag2 ==0                       && режим1 == 1                          )

 

так и в первой части.

vvadim
Offline
Зарегистрирован: 23.05.2012

Ну сейчас так и получается. Мне нужно чтобы допустим в режиме regim2==2 и regim2==3 нельзя было получить regim1==2 и regim1==3 и наоборот.

Можно попробовать  записать regim2==2 && regim1==1 и regim2==3 && regim1==1 но я не знаю, корректна ли такая запись.

toc
Offline
Зарегистрирован: 09.02.2013

цыкл цикл

 

vvadim
Offline
Зарегистрирован: 23.05.2012

Мне стыдно за ошибку.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

А что нужно то? Допустим нажали два раза кнопку 1, потом кнопку 2. Игнорировать нажатие или еще что?

vvadim
Offline
Зарегистрирован: 23.05.2012

Мне нужно чтобы  в режиме regim2==2 и regim2==3 нельзя было получить regim1==2 и regim1==3 и наоборот, нажатие второй кнопки блокировать (игнорировать).

__Alexander
Offline
Зарегистрирован: 24.10.2012

vvadim пишет:

Ну сейчас так и получается. Мне нужно чтобы допустим в режиме regim2==2 и regim2==3 нельзя было получить regim1==2 и regim1==3 и наоборот.

Можно попробовать  записать regim2==2 && regim1==1 и regim2==3 && regim1==1 но я не знаю, корректна ли такая запись.

если это лично вам, то корректна.

в дальнейшем выносите это всё в отдельные функции, читать будет легче.

 

vvadim
Offline
Зарегистрирован: 23.05.2012

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

__Alexander
Offline
Зарегистрирован: 24.10.2012

та я хз. я так никогда не писал.

создайте две функции, и не выходите ни из одной пока не произойдет определенное условие.

vvadim
Offline
Зарегистрирован: 23.05.2012

Я об этом тоже думал (когда кнопки на разных пинах тогда всё нормально), но все кнопки на одном пине и случайное нажатие второй  кнопки вырубит первую. maksim в теме " Работа с кнопками. В помощь новичку" показывал подобное подключение кнопок, но вопрос блокировки так и завис.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Определить какая кнопка нажата. Если нажата неправильная кнопка, игнорировать. Если нажата правильная, то увеличить счетчик нажатий. Когда это проверили, выполнять всё остальное.

__Alexander
Offline
Зарегистрирован: 24.10.2012

та нифига. если по нажатию кнопки №1 вызвать функцию, и в ней зациклится пока эта же кнопка не нажмется еще два раза, то обработки кнопки №2 просто не будет, она в другой функии. как-то так.

vvadim
Offline
Зарегистрирован: 23.05.2012

Спасибо. Соберу завтра схему и попробую, надеюсь заработает.

__Alexander
Offline
Зарегистрирован: 24.10.2012


loop()
{
if (press_1) func1()
else if (press_2) func2()
}

void func1()
{
 while(1)
 {
 // ждем нажатия кнопки 1
 if (press_1) x++;
  if (x == 2) return;
 }

}


void func2()
{
 while(1)
 {
 // ждем нажатия кнопки 2
 if (press_2) x++;
  if (x == 2) return;
 }

}

как-то так, только ожидания отпускания кнопки добавить надо.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Ну майтесь, мой вариант - тупее не придумаешь

vvadim
Offline
Зарегистрирован: 23.05.2012

kisoft пишет:
Определить какая кнопка нажата. Если нажата неправильная кнопка, игнорировать. Если нажата правильная, то увеличить счетчик нажатий. Когда это проверили, выполнять всё остальное.

А как проверить и игнорировать? 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Игнорировать - return, определить - я не совсем понял подключения на аналоговый пин, по уровню? Если проясните подключение кнопок - подскажу. Я догадываюсь, но лучше знать точно.

vvadim
Offline
Зарегистрирован: 23.05.2012

Кнопки на одном аналоговом пине через разные резисторы. Считываются значения при нажатии и тогда определяется какая кнопка нажата. Я в начале поста в коде указал.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Ок, забудьте, нет времени выпрашивать информацию, схема подключения - единственное что могло помочь

vvadim
Offline
Зарегистрирован: 23.05.2012

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012
#include <LiquidCrystal.h>

#define BUTTONS_PIN A2
#define BUTTON1_LEVEL 700
#define BUTTON2_LEVEL 350

#define OUT_LED1 4
#define OUT_LED2 5
#define OUT_LED3 6

byte g_press_counter = 0;
int last_button = -1;

int get_button();

LiquidCrystal lcd(A0, A1, 8, 9, 10, 11);

void setup()
{
  pinMode( OUT_LED1, OUTPUT );
  pinMode( OUT_LED2, OUTPUT );
  pinMode( OUT_LED3, OUTPUT );

  lcd.begin(16, 2);
  lcd.setCursor(0,0);
  lcd.print("Key: ");
}

void loop()
{
  int l_input_button = get_button();
  /* Если еще не было нажатий, инициализируем переменную с номером последней нажатой кнопки */
  if( 0 == g_press_counter )
  {
    last_button = l_input_button;
  }
  lcd.setCursor( 5, 0 );
  lcd.print( l_input_button );
  lcd.setCursor( 0, 1 );
  lcd.print( g_press_counter );
  /*
   * Определяем, допустимость нажатия кнопок, а именно:
   * - не должно быть нажатийкнопок
   * - последняя нажатая кнопка должна быть той же кнопкой
   */
  if( g_press_counter != 0 && last_button != l_input_button )
  {
    return;
  }
  /* Меняем кол-во нажатий кнопки */
  ++g_press_counter;
  if( 1 == l_input_button )
  {
    switch( g_press_counter )
    {
      case 1:
        digitalWrite( OUT_LED1, HIGH );
        break;
      case 2:
        digitalWrite( OUT_LED2, HIGH );
        break;
      case 3:
        digitalWrite( OUT_LED3, HIGH );
        g_press_counter = 0;
        break;
    }
  }
  else if( 2 == l_input_button )
  {
    switch( g_press_counter )
    {
      case 1:
        digitalWrite( OUT_LED1, LOW );
        break;
      case 2:
        digitalWrite( OUT_LED2, LOW );
        break;
      case 3:
        digitalWrite( OUT_LED3, LOW );
        g_press_counter = 0;
        break;
    }
  }
  lcd.setCursor( 0, 1 );
  lcd.print( g_press_counter );
}

/* Ожидание нажатия кнопки, возвращает номер кнопки, 1, 2 */
int get_button()
{
  int l_ret = -1;
  int l_value = 1023;
  while( l_value >= BUTTON1_LEVEL )
  {
    l_value = analogRead(BUTTONS_PIN);
    lcd.setCursor( 10, 0 );
    lcd.print( l_value );
  }
  if( l_value < BUTTON2_LEVEL )
  {
    l_ret = 2;
  }
  else if( l_value < BUTTON1_LEVEL )
  {
    l_ret = 1;
  }
  delay( 50 );
  while( l_value < BUTTON1_LEVEL )
  {
    // ждем, когда будет отпущена кнопка
    l_value = analogRead(BUTTONS_PIN);
    lcd.setCursor( 10, 0 );
    lcd.print( l_value );
  }
  return l_ret;
}

Код "грязный", дребезг, уровни, отображение на LCD не отлаживал.

Кнопки подключал, 1КОм на +5В, второй конец на A2. К A2 либо на землю (кнопка2) или через 1КОм тоже на землю (кнопка1)