Класс кнопки, одновременное нажатие

И что? Как это мешает нажимать кнопки не одновременным тапом, а поочередно? Или гарантированный результат не нужен? :wink:

У меня на часах режим регулировки яркости включается одновременным нажатием на “+” и “-”. Все, как описал - нажал одну кнопку и, не отпуская, нажал вторую. И все работает

А у меня в квартире газ.) Иной раз на часах и 5-ти кнопок мало.

Ты ж сам про мало (Например, 2-е на всё про всё) писал. Вот я тебе про две и написал )))

вообще не понимаю, в чем проблема. Класс кнопки не должен сам проверять свое (или соседней кнопки) нажатие. Это делается во внешней программе.

Обьясните эту фразу:

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

Ну просто не удобно с двумя. А функций нужно много. Вот и приходится использовать одновременное нажатие.
Кнопка + уже делает какое то действие по нажатию. А тут ты ещё добавляешь вторую кнопку -. В общем нужно хорошо продумывать Юзер интерфейс.)

В данном случае достаточно знать состояние кнопки - замкнуты контакты или нет. А какой там флаг был поднят - уже не важно

Так проблема в чем? Я ж не запрещаю, просто говорю, что не нужно пытаться заставлять юзера тапать обе кнопки строго одновременно. Проще нужно быть ))

2 лайка

Все равно, на мой взгляд, обращение из класса одной кнопки к другой - совершенно не нужное ТС усложнение.

Ну, я сделал, ничего особо не усложнилось. Во внешнем коде проверок было бы ровно столько же. Главное, что уже на этапе программирования должно быть известно, какая пара кнопок проверяется. А у ТС вроде так и есть

Если у Вас возникают подобные вопросы, значит Вы неправильно спроектировали класс.
Если кнопки взаимозависимы, и проектировать их совокупность нужно как одно целое.

1 лайк

совершенно необязательно

Конечно не обязательно!
Никто ведь не запрещает надевать штаны через голову.

А я вот не уверен. В разных местах есть разные странные законы. Например, аллигаторов нельзя к пожарным гидрантам привязывать. Ну, а про штраф $500 за взрыв атомной бомбы я тут уже рассказывал. Вот не удивлюсь, если где-нибудь и это запрещено.

1 лайк

Клапауций не запрещал.

1 лайк
#define BTN_PIN1 2
#define BTN_PIN2 3
#define BOUNCE 30

class Button {
private:
uint8_t _pin;
bool cl;
uint16_t pressTime;
bool btnFlag = false;
bool push = false;

public:
void set(uint8_t pin) {
_pin = pin;
pinMode(_pin, INPUT_PULLUP);
}

void read() {
cl = false;
if(!digitalRead(_pin)) {  // Изменил на ! так как INPUT_PULLUP
if(!btnFlag) {
btnFlag = true;
pressTime = millis();
}
} else {
btnFlag = false;
push = false;
}

if(btnFlag && millis() - pressTime >= BOUNCE && !push) {
push = true;
cl = true;
}
}

bool click() {
bool result = cl;
cl = false;  // Сбрасываем после чтения
return result;
}

bool isPressed() {
return push;  // Возвращает текущее состояние нажатия
}
};

class ButtonGroup {
private:
Button* buttons;
uint8_t count;

public:
ButtonGroup(Button* btnArray, uint8_t btnCount) {
buttons = btnArray;
count = btnCount;
}

bool allPressed() {
for(uint8_t i = 0; i < count; i++) {
if(!buttons[i].isPressed()) {
return false;
}
}
return true;
}

bool anyPressed() {
for(uint8_t i = 0; i < count; i++) {
if(buttons[i].isPressed()) {
return true;
}
}
return false;
}
};

Button buttons[2];
ButtonGroup group(buttons, 2);

void setup() {
Serial.begin(115200);
buttons[0].set(BTN_PIN1);
buttons[1].set(BTN_PIN2);
}

void loop() {
for(uint8_t i = 0; i < 2; i++) {
buttons[i].read();
}

// Проверка отдельных нажатий
if(buttons[0].click()) {
Serial.println("Button 1 clicked");
}

if(buttons[1].click()) {
Serial.println("Button 2 clicked");
}

// Проверка одновременного нажатия
if(group.allPressed()) {
Serial.println("Both buttons pressed!");
}

delay(10);
}
1 лайк

Всем большое спасибо! Мне нужно время, подумать нормально, потестить что получится. В целом я понял что к чему, вроде ничего особо сложного нет, синтаксис только не знаю.

Пробовал еще static bool, пока не получилось. Вроде как из всех объектов класса должен быть доступ. Продолжу дальше изучать.

Зачем тебе статическая переменная в этом классе? Ты хоть понимаешь зачем статические переменные нужны?

BOOM если вы мне, то у меня там их нет, вы как понимаю их не любите ?)))
а у кого они там есть ? и какой номер строки в каком коде ?

Я писал на это:

Не понимаю.
Вот что прочитал-

Статическая переменная (static) в классе — это поле, общее для всех экземпляров (объектов) класса, существующее в единственном экземпляре. Она привязана к самому классу, а не к объекту, инициализируется один раз при загрузке класса и существует на протяжении всего времени выполнения программы.