Блокирование нажатия кнопки пока процесс не закончится

Подскажите, пож., как заблокировать повторное нажатие кнопки.
Если я нажму кнопку второй раз, то цикл повторится.

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

Я так и сделал, флаг есть. У меня кнопка реализована на дисплее.

#include <SoftwareSerial.h>

char R = ' ';  //Задаем переменную R

//Пины управления шаговиком
#define STEP_PIN 5    //Импульсы ШД
#define DIR_PIN 4     //Направление ШД
#define ENABLE_PIN 6  //Включение ШД

#define frequency 2200  //Время между импульсами в мксек

//Логический флаг для рабочего режима
bool flag = 0;

SoftwareSerial mySerial(2, 3);  //Подключение дисплея DWIN

void setup() {

  mySerial.begin(115200);
  pinMode(STEP_PIN, OUTPUT);  //Настраиваем пины управления ШД
  pinMode(DIR_PIN, OUTPUT);
  pinMode(ENABLE_PIN, OUTPUT);

  digitalWrite(ENABLE_PIN, LOW);  //Выключаем мотор, чтобы не грелся
}

void loop() {
  if (mySerial.read() > 0 & mySerial.read() < 100) {
    R = mySerial.read();
    Serial.println(R);
    if (R == '1') {
      digitalWrite(ENABLE_PIN, HIGH);  //Включаем мотор ШД
      flag = 1;                        //Активируем флаг рабочего режима
    }
    if (flag) {                               //Если флаг активирован
      digitalWrite(DIR_PIN, HIGH);            //Задаем направление вращения
      for (int i = 0; i < 200; i++) {  //Перемещение на 200 шагов
        digitalWrite(STEP_PIN, HIGH);
        delayMicroseconds(frequency);
        digitalWrite(STEP_PIN, LOW);
      }
      flag = 0;
      digitalWrite(ENABLE_PIN, LOW);  //Выключаем мотор ШД, чтобы не грелся
    }
  }
}

Я не знаю, как игнорировать кнопку после первого нажатия. Т.е. нажал кнопку, флаг установился, процесс запустился, если я нажму несколько раз кнопку, процесс после завершения запустится еще несколько циклов.

А рация на танке

Тогда зачем снимать флаг сразу? Снимайте перед тем как нужно снова будет опросить кнопку.

Вот в этой теме на второй сверху картинке показан способ блокировки включения рычажкового переключателя. Для кнопки можно что-то аналогичное сделать.

Я снимаю флаг после окончания процесса.

Процесс нужно запускать только если флаг НЕ поднят. А у вас работает ровно так, как написано

И код нужно оформлять по правилам. Не “желательно”, а “нужно

Я это заметил в вашем вставленном с нарушениями правил форума “тексте”. Поэтому повторюсь, зачем снимать флаг, если больше не нужно реагировать на кнопку?

Прежде всего уважайте здесь присутствующих и пожалуйста исправьте пост с кодом, так как это требуют правила

Прошу прощения, Код поправил.

Реагировать на кнопку нужно, но только после окончании процесса.
Если сразу нажать на кнопку два раза, то процесс задвоится.

Наверно, я что-то не понимаю, помогите пожалуйста, разобраться.

Строка 31, нужно так

if (R == '1' && !flag)

В строке 35

if (flag)

не нужно

Вот почему сразу не сказать, что это не просто “кнопка на дисплее”, а что это “сериал”-устройство, или сразу привести полный скетч? Об этом можно было только догадываться по

if (R == '1')

В общем, очищайте буфер сериала перед тем, как снова нужно опрашивать кнопку. Там накапливаются все нажатия и ждут пока их оттуда вычитают.

Это, к сожалению, не помогло.

А как очищать буфер сериала?

Это поможет в совокупности с очисткой буфера

ЗЫ: тему перенес в песочницу

1 лайк

Я правильно понимаю, надо использовать форму?
void setup() {
Serial.begin(9600);
Serial.flush();
Serial.end();
}

Неправильно! Совсем неправильно!

Вам ведь уже объяснили!

И Вы даже сделали вид, что поняли.

Вы просите бана? Или хотите срач тут устроить?