такой беспощадный delay.

НикитаТангер

✩✩✩✩✩✩✩
22 Июл 2024
9
0
Привет! Знаю, что любой мой первый пост должен лететь в кунсткамеру, но всё же надеюсь на помощь.
Не могу упаковать код с задержками, в код без них.

C++:
if (OnButt == true && oneF1 == false) {
    digitalWrite(v13, HIGH);
    flugOnButt++;
    delay (60000);
    digitalWrite(v13, LOW);
    oneF1 = true;
    delayMicroseconds(50);
    oneF1 = false;
    Serial.println(flugOnButt);
Смысл программы в том, что она должна выполниться однократно, после нажатия кнопки. После выполнения функции ожидать нового нажатия.
Примеры Гайвера пытался применить, они работают с MILLIS в замкнутом цикле,но как только нужно по активации кнопкой, то ведёт себя программа некорректно.
 

poty

★★★★★★✩
19 Фев 2020
3,279
951
@НикитаТангер, примеров полно, любой проект с кнопками.
Первое правило - правильно поставить задачу. Сколько состояний (шагов, процессов) должна иметь программа? Какой признак перехода между состояниями? Что произойдёт, если кнопка будет в очередной раз нажата до отработки всех состояний? После этого уже и за кодирование можно сесть.
И, кстати, кода, при котором программа ведёт себя некорректно, так и не представлено. Ну так, чтобы оценить, делалось ли что-то в принципе?
 

НикитаТангер

✩✩✩✩✩✩✩
22 Июл 2024
9
0
@VictorArx,
в этот момент идёт и полезный управляющий сигнал.

@poty,
у меня проблема только с тем, что delay есть в этой части программы.
В остальных местах стоит циклическая конструкция и она работает сносно:
C++:
if (millis() - myTimer2 >= 333) {   // таймер на 333 мс (3 раза в сек)
    myTimer2 = millis();              // сброс таймера
    // выполнить действие 2
  }
А как только добавляется проверка нажатия кнопки в этот блок, то сразу происходит отложенная реакция.
----
как можно упаковать код из первого сообщения в этот таймер, с опросом состояния кнопки?
 

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

★★★★★★★
14 Авг 2019
4,284
1,304
Москва
3 раза в секунду опрашивать кнопку очень мало. Сделайте 10 и посмотрите.
И потом при обработке кнопок есть библиотекой Гайвера есть некая задержка при обработке 1-2-3 и более кликов вида :
boolean isSingle(); // возвращает true при одиночном клике. Сбрасывается после вызова
boolean isDouble(); // возвращает true при двойном клике. Сбрасывается после вызова
boolean isTriple(); // возвращает true при тройном клике. Сбрасывается после вызова
При обработке ожидается некоторое время для проверки будет ли еще нажатие или нет.
А вот isClick работает сразу по отпускании кнопки.
 

poty

★★★★★★✩
19 Фев 2020
3,279
951
@НикитаТангер, Ваша "циклическая конструкция" с millis ничем не отличается от delay, если не будет запускаться по условию.
 

НикитаТангер

✩✩✩✩✩✩✩
22 Июл 2024
9
0
Всё, разобрался. Если упёрся в тупик, нужно отдохнуть, а не пытаться найти выход.
Я не правильно использовал структуру.
Вот так работает, как нужно:

C++:
 if (OnButt  == true)
  {
    digitalWrite(v13, HIGH);
    oneF1 = true;
    V13ON = millis();
  }
 
    if (millis() - V13ON > 30000)
    {
      digitalWrite(v13, LOW);
      V13ON = false;
Millis штука очень удобная, если разобраться хотя бы на примерах.
Благодарю, что не сильно кидали в меня тапками).