Блокировка кнопки
- Войдите на сайт для отправки комментариев
Сб, 20/04/2013 - 19:20
Две кнопки подключены на один аналоговый пин. Каждая работает на три нажатия. Как сделать блокировку второй кнопки пока не прошёл цыкл нажатий первой кнопки и блокировать первую во время нажатий второй
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);
}
}
а если тупо добавить
if ((buttonVAL > 110 && buttonVAL < 200 ) && flag2 ==0 && режим1 == 1 )
так и в первой части.
Ну сейчас так и получается. Мне нужно чтобы допустим в режиме regim2==2 и regim2==3 нельзя было получить regim1==2 и regim1==3 и наоборот.
Можно попробовать записать regim2==2 && regim1==1 и regim2==3 && regim1==1 но я не знаю, корректна ли такая запись.
цыклциклМне стыдно за ошибку.
А что нужно то? Допустим нажали два раза кнопку 1, потом кнопку 2. Игнорировать нажатие или еще что?
Мне нужно чтобы в режиме regim2==2 и regim2==3 нельзя было получить regim1==2 и regim1==3 и наоборот, нажатие второй кнопки блокировать (игнорировать).
Ну сейчас так и получается. Мне нужно чтобы допустим в режиме regim2==2 и regim2==3 нельзя было получить regim1==2 и regim1==3 и наоборот.
Можно попробовать записать regim2==2 && regim1==1 и regim2==3 && regim1==1 но я не знаю, корректна ли такая запись.
если это лично вам, то корректна.
в дальнейшем выносите это всё в отдельные функции, читать будет легче.
А как быть с тем, что при нажатии второй кнопки изменится значение buttonVAL и тогда уже первая кнопка не будет читаться?
та я хз. я так никогда не писал.
создайте две функции, и не выходите ни из одной пока не произойдет определенное условие.
Я об этом тоже думал (когда кнопки на разных пинах тогда всё нормально), но все кнопки на одном пине и случайное нажатие второй кнопки вырубит первую. maksim в теме " Работа с кнопками. В помощь новичку" показывал подобное подключение кнопок, но вопрос блокировки так и завис.
Определить какая кнопка нажата. Если нажата неправильная кнопка, игнорировать. Если нажата правильная, то увеличить счетчик нажатий. Когда это проверили, выполнять всё остальное.
та нифига. если по нажатию кнопки №1 вызвать функцию, и в ней зациклится пока эта же кнопка не нажмется еще два раза, то обработки кнопки №2 просто не будет, она в другой функии. как-то так.
Спасибо. Соберу завтра схему и попробую, надеюсь заработает.
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; } }как-то так, только ожидания отпускания кнопки добавить надо.
Ну майтесь, мой вариант - тупее не придумаешь
А как проверить и игнорировать?
Игнорировать - return, определить - я не совсем понял подключения на аналоговый пин, по уровню? Если проясните подключение кнопок - подскажу. Я догадываюсь, но лучше знать точно.
Кнопки на одном аналоговом пине через разные резисторы. Считываются значения при нажатии и тогда определяется какая кнопка нажата. Я в начале поста в коде указал.
Ок, забудьте, нет времени выпрашивать информацию, схема подключения - единственное что могло помочь
#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)