Как поставить условие исходя из порядка нажатий кнопок и временного интервала между нажатиями

martinways

✩✩✩✩✩✩✩
23 Дек 2020
25
0
Товарищи знатоки, подскажите как поставить условие

- если был клик по кнопке (vent.isClick()), потом клик по кнопке (motorstop.isClick()) и если интервал между этими нажатиями не более 2 секунд, то выдать в порт сообщение {Serial.println("OFF");
C++:
#include "GyverButton.h" /// https://github.com/AlexGyver/GyverLibs/releases/download/GyverButton/GyverButton.zip

GButton vent;
GButton motorstop;

unsigned long timer;

void setup() {
  Serial.begin(9600);
  timer = millis();
}
void loop() {
  int analog = analogRead(7);
  vent.tick(analog < 695 && analog > 652); //6
  motorstop.tick(analog < 940 && analog > 865); //2

  if (vent.isClick()) {Serial.println("Start");}
  if (motorstop.isClick()) Serial.println("Stop");

  //А здесь надо как-то поставить условие если нажата кнопка (vent.isClick()) потом нажатие (motorstop.isClick())
  // и если интервал между нажатиями был не более 2 секунд, то выдать Serial.println("OFF");

}
 
Изменено:

bort707

★★★★★★✩
21 Сен 2020
2,898
862
воспользоваться флагами состояний
Если нажата первая кнопка - присваиваем переменной флагу состояние =1
Далее если нажата вторая кнопка И состояние == 1 - переходим в состояние 2

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

Старик Похабыч

★★★★★★★
14 Авг 2019
4,192
1,281
Москва
Можно так сделать. Есть буфер нажатий.. Скажем на 5 кликов. В каждую ячейку можно записать номер кнопки,1,2,3,4 - 0 пустая ячейка.
И храним время последнего добавления в буфер значения.
В цикле проверяем время, если прошло больше 2 секунд с последнего занесения, то передаем буфер на обработку, если там что то есть конечно, т.е. все ячейки не 0. При передаче чистим буфер нулями.
При нажатии на кнопку делаем простую операцию - ищем 1-ую пустую ячейку в буфере , записываем туда номер кнопки. Запоминаем время. Если буфер заполнен, то можно сразу передать на обработку.
При обработке смотрим сколько кнопок нажато было и какая комбинация. Ну и делаем что надо.

Не пробовал так делать. Делал только с одной буферной кнопкой. Было так, что нажатие запоминалось и ожидало очереди на выполнение - кнопка могла быть нажата раньше чем закончилось предыдущее действие, на 0.1-0.3 секунды, но могло. В таком виде обработка выполнялась и не было ощущения пропущенного нажатия
 

martinways

✩✩✩✩✩✩✩
23 Дек 2020
25
0
Это для меня высшая математика, я совсем новичок, можете показать на примере моего скетча?
 

poty

★★★★★★✩
19 Фев 2020
2,988
895
Соседние вопросы Вам в помощь. Практически один в один с позавчерашним вопросом. Объявите переменную
Объявление переменной:
boolean firstClick = false;
Ваши условия перепишите как:
Новые условия:
if (vent.isClick()) {
  Serial.println("Start");
  timer = millis();
  firstClick = true;
}
if (motorstop.isClick()) {
  Serial.println("Stop");
  if (firstClick && millis()-timer <= 2000) Serial.println("OFF");
  firstClick = false;
}
Только вряд ли это Вас научит...
 
  • Лойс +1
Реакции: martinways и DAK

martinways

✩✩✩✩✩✩✩
23 Дек 2020
25
0
Только вряд ли это Вас научит...
Вы не правы! Я смотрю и понимаю как это работает, смогу по аналогии уже другие вещи сделать. Насколько просто оказалось решение, гораздо проще и правильнее на вид, чем предложения предыдущих товарищей, хотя им также огромное спасибо за советы.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,192
1,281
Москва
Хоть все и решилось, но я подумал, что указанный мной алгоритм будет интересен не только автору вопроса. По быстрому накропал такой пример:
 
  • Лойс +1
Реакции: martinways

martinways

✩✩✩✩✩✩✩
23 Дек 2020
25
0
Только вряд ли это Вас научит...
Хотя возможно Вы и правы))) Попробовал сделать по аналогии для бОльшего количества кнопок с одной общей, но не получилось.
Значит как должно работать: есть 3 кнопки
GButton xButton;
GButton yButton;
GButton motorstop;

Если нажал xButton и в течении 2 секунд нажал motorstop, то выдало "X started", если нажал yButton и в течении 2 сек motorstop, должно выдать "Y started", по Вашему примеру я добавил для каждой кнопки свой boolean, прописал их в кнопке motorstop и все заработало, но не так как надо - теперь если нажать сначала xButton, подождать много времени, а потом нажать yButton и в течении 2 сек motorstop, то выдает оба сообщения "X started" и "Y started", хотя по логике должно было выдать сообщение для последней нажатой кнопки, ведь с момента нажатия xButton прошло много времени. Как решить эту проблему?

C++:
#include "GyverButton.h" /// https://github.com/AlexGyver/GyverLibs/releases/download/GyverButton/GyverButton.zip

GButton xButton;
GButton yButton;
GButton motorstop;

unsigned long timer;

boolean xStart = false;
boolean yStart = false;

void setup() {
  Serial.begin(9600);
  timer = millis();
}
void loop() {
  int analog = analogRead(7);
  xButton.tick(analog < 471 && analog > 450); //11
  yButton.tick(analog < 493 && analog > 471); //10
  motorstop.tick(analog < 450 && analog > 422);//12

if (xButton.isClick()) {
  timer = millis();
  xStart = true;
}
if (yButton.isClick()) {
  timer = millis();
  yStart = true;
}
if (motorstop.isClick()) {
  if (xStart && millis()-timer <= 2000) Serial.println("X started");
  xStart = false;
  if (yStart && millis()-timer <= 2000) Serial.println("Y started");
  yStart = false;
}

}
Пробовал добавлять в кнопку xButton условие if (xButton.isClick() && millis()-timer >= 2000) xStart= false; , но не помогло.
 

poty

★★★★★★✩
19 Фев 2020
2,988
895
Таймер сделайте для каждой комбинации свой.
И, если действительно учитесь, не стоит обращать внимание на мнение (даже моё) об объектах, не относящихся к предмету обучения. :)
 
  • Лойс +1
Реакции: martinways

Старик Похабыч

★★★★★★★
14 Авг 2019
4,192
1,281
Москва
Если есть xStart = true; то должно быть где то и xStart = false; Ну например когда прошло 2 секунды и 2-ая кнопка не нажата. Флаг надо сбросить, а он сбрасывается только после набранной комбинации
 

poty

★★★★★★✩
19 Фев 2020
2,988
895
@Старик Похабыч, не обязательно. Если будет два запомненных состояния таймера, то всё будет работать отлично.
А вообще - доработать Вашу идею до библиотеки было бы здорово, судя по последним темам.
 

martinways

✩✩✩✩✩✩✩
23 Дек 2020
25
0
Таймер сделайте для каждой комбинации свой.
И, если действительно учитесь, не стоит обращать внимание на мнение (даже моё) об объектах, не относящихся к предмету обучения. :)
Сделал 2 таймера и все заработало! Ййуухху!(y) Премного благодарю!