Нужна помощь с задержкой или паузой

Всем доброго времени суток, очень нужна помощь,

Я пытаюсь написать программку для облегчения своей работы, работа не связана с программированием, поэтому в этой сфере я полный НОЛЬ, немного по изучав я наткнулся на программу ардублок, но там отсутствует возможность использовать задержки кроме delay. а мне необходимо отключать или запускать другой процесс а с delay это не получается и приходится постоянно перезагружать ардуинку, попробовав разные варианты с форума и с интернета, у меня ничего не получилось, программа заключается в включении трех реле на 2-3сек через определенный промежуток времени, в программе в место реле описаны светодиоды, так как я пробую на них и так нагляднее, вот пример моего кода.

long x = 0;

#include <Wire.h>
#include "ASOLED.h"


void Start() {
  if (digitalRead(A0) == 0) {
    while (1){
      LD.printString_12x16("Старт 1", 0, 2);
      LD.printString_12x16("Цикл", 0, 6);
      LD.printString_12x16("", 50, 6);
       LD.printNumber((long)x);
      x = x + 1;
      pinMode(10, OUTPUT);
       digitalWrite(10, 1);
      delay(2000);
      pinMode(10, OUTPUT);
       digitalWrite(10, 0);
      delay(6000);
      pinMode(11, OUTPUT);
       digitalWrite(11, 1);
      delay(2000);
      pinMode(11, OUTPUT);
       digitalWrite(11, 0);
      delay(30000);
      pinMode(12, OUTPUT);
       digitalWrite(12, 1);
      delay(2000);
      pinMode(12, OUTPUT);
       digitalWrite(12, 1);
      delay(900000);
      pinMode(13, OUTPUT);
       digitalWrite(13, 1);
      delay(2000);
    }
  }
}

void Start1() {
  if (digitalRead(A1) == 0) {
    while (1){
      LD.printString_12x16("Старт 2", 0, 2);
      LD.printString_12x16("Цикл", 0, 6);
      LD.printString_12x16("", 50, 6);
       LD.printNumber((long)x);
      x = x + 1;
      pinMode(10, OUTPUT);
       digitalWrite(10, 1);
      delay(2000);
      pinMode(10, OUTPUT);
       digitalWrite(10, 0);
      delay(6000);
      pinMode(11, OUTPUT);
       digitalWrite(11, 1);
      delay(2000);
      pinMode(11, OUTPUT);
       digitalWrite(11, 0);
      delay(45000);
      pinMode(12, OUTPUT);
       digitalWrite(12, 1);
      delay(2000);
      pinMode(12, OUTPUT);
       digitalWrite(12, 1);
      delay(900000);
      pinMode(13, OUTPUT);
       digitalWrite(13, 1);
      delay(2000);
    }
  }
}

void Start3() {
  if (digitalRead(A2) == 0) {
    while (1){
      LD.printString_12x16("СТОП", 0, 2);
      LD.printString_12x16("        ", 0, 6);
      pinMode(13, OUTPUT);
       digitalWrite(13, 1);
    }
  }
}


void setup() {
  LD.init();
 LD.clearDisplay();

    LD.printString_12x16("RABOTA", 35, 0);
  pinMode(10, OUTPUT);
   digitalWrite(10, 0);
  pinMode(11, OUTPUT);
   digitalWrite(11, 0);
  pinMode(12, OUTPUT);
   digitalWrite(12, 0);
  pinMode(13, OUTPUT);
   digitalWrite(13, 0);

  pinMode(A0, INPUT_PULLUP);
  pinMode(A1, INPUT_PULLUP);
  pinMode(A2, INPUT_PULLUP);
}

void loop() {
    Start();
    Start1();
    Start3();

}

Посмотрите старый форум. Там была тема точно под эту задачу и она была решена. Поиском можно.

Спасибо

Я наверное неправильно выразился, мне необходим цикл с определенными промежутками, в разнобой у меня получилось заставить их работать, а вот согласно моего алгоритма не получается.

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

Наверное - неправильно. По крайней мере, не очень понятно.
Вам верно указали на blink Without Delay - это то на основе чего делается вообще все, что угодно.
Собственно, разберитесь, как там работает светодиод.
Далее - обобщение на несколько светодиодов. И здесь может быть два основных случая:

  1. Светодиоды работают независимо - каждый по своему сценарию: собственно, та конструкция, что в blink Without Delay повторяется по числу светодиодов.
  2. Светодиоды работают по общему замыслу в рамках единой последовательности. В этом случае логическая переменная заменяется на целую и дальше - состояния сменяются последовательно. Например:
  • состояние 1 - 1-й светодиод горит 2 секунды,
  • состояние 2 - пауза 1 секунда,
  • состояние 3 - 2-й и 3-й светодиоды горят 3 секунды,

    из последнего состояния снова переходим в первое и т.д.

@Nikolay_XMAO
все ваши процедуры оформлены одинаково - сначала условие, а внутри “вечный” цикл while(1), например:

Выхода из цикла не предусмотрено.
При такой организации три процедуры в ЛУП никак не могут отработать, потому что программа в первой же зависнет навечно.

не удивительно.

1 лайк

вопросы на засыпку - период у цикла есть? нарисовать график логики работы реально?

Вроде правильно нарисовал, это цикл должен повторятся бесконечно, пока его не остановить.
Все включения реле(лампочки) на 2 секунды,

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

Примерный алгоритм:

Задача 1: интервал срабатывания 2 секунды, режим работы - два срабатывания и остановка

1. проверить текущее реле, если оно выключено, включить его,
   иначе выключить реле и остановиться.

Задача 2: интервал срабатывания - переменный, режим работы - непрерывный

 1. Установить текущее реле
  2. запустить задачу 1
  3. установить себе новый интервал

Номер текущего реле указывать в глобальной переменной, к которой есть доступ у обеих задач.

Обе задачи реализуются несколькими строками кода. Читайте по ссылке, там есть и пример управления светодиодом (реле), и сменой интервалов, и пуском/остановкой задач

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

при сбое по электропитанию что надо делать?

Можно начать процесс с начала, а можно продолжить выполнение программы, в моем случае это роли не играет.

для этой циклограммы тогда все эти миллисы и не нужны, последовательно включаем-выключаем через delay()

единственный минус, с кнопки не остановить, только отключение или рестарт платы.
а в целом все работает через delay()

Подскажите пожалуйста, если в void setup() поместить команду на стоп процесса через кнопку, будет работать? если да, то что за команда?

ну почему не остановишь, кнопку на прерывание, в котором все и делайте

Могу я Вас попросить шаблон кода и куда его вставить? или нужна кнопка с фиксацией?

А как delay() в прерывании прервать можно?

оправить в цикл с условием, задержки можно и на свою функцию переписать…существует 99 способов