Подскажите, пож., как заблокировать повторное нажатие кнопки.
Если я нажму кнопку второй раз, то цикл повторится.
добавить флаг, при нажатии кнопки - входишь в процесс если флаг не взведён, взводишь флаг, когда процесс выполнился освобождаешь, процесс запускаешь по условию нажатия кнопки И не выставленного флага
Я так и сделал, флаг есть. У меня кнопка реализована на дисплее.
#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')
В общем, очищайте буфер сериала перед тем, как снова нужно опрашивать кнопку. Там накапливаются все нажатия и ждут пока их оттуда вычитают.
Это, к сожалению, не помогло.
А как очищать буфер сериала?
Это поможет в совокупности с очисткой буфера
ЗЫ: тему перенес в песочницу
Я правильно понимаю, надо использовать форму?
void setup() {
Serial.begin(9600);
Serial.flush();
Serial.end();
}
Неправильно! Совсем неправильно!
Вам ведь уже объяснили!
И Вы даже сделали вид, что поняли.
Вы просите бана? Или хотите срач тут устроить?