Неблокирующийся код для последовательной работы реле

XacretT
Offline
Зарегистрирован: 31.05.2016

Добрый день, товарищи.

У меня есть 5 релюшек, которые открываются и закрываются по очереди. То-есть открывается вначале реле №1 на определенный период времени, затем закрывается на так же определенный период времени. Далее то-же самое происходит с реле №2,3,4,5 и по кругу. Все эти периоды работы/простоя разные для каждого реле.

В данный момент используется решение с delay

  for(int k=0; k<8;k++)
   {
       if (RelayWork[k] > 0) { //если время работы реле более 0
          digitalWrite(RelayKey[k], LOW);
          delay(RelayWork[k]*factor);
          digitalWrite(RelayKey[k], HIGH);
          delay(RelayStop[k]*factor);
       }
   }    

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

Переписать то же самое на millis можно элементарно, но не могу придумать, как заставить перебирать реле по очереди.

Заранее спасибо за внимание и помощь.

vde69
Offline
Зарегистрирован: 10.01.2016

завести на каждую реле отдельную переменную

Клапауций 232
Offline
Зарегистрирован: 05.04.2016
Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013
Logik
Offline
Зарегистрирован: 05.08.2014

XacretT пишет:

Добрый день, товарищи.

У меня есть 5 релюшек, которые открываются и закрываются по очереди. То-есть открывается вначале реле №1 на определенный период времени, затем закрывается на так же определенный период времени. Далее то-же самое происходит с реле №2,3,4,5 и по кругу. Все эти периоды работы/простоя разные для каждого реле.

В данный момент используется решение с delay

  for(int k=0; k<8;k++)
   {
       if (RelayWork[k] > 0) { //если время работы реле более 0
          digitalWrite(RelayKey[k], LOW);
          delay(RelayWork[k]*factor);
          digitalWrite(RelayKey[k], HIGH);
          delay(RelayStop[k]*factor);
       }
   }    

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

Переписать то же самое на millis можно элементарно, но не могу придумать, как заставить перебирать реле по очереди.

Заранее спасибо за внимание и помощь.

Так элементарно. Обединяете массивы  RelayWork и RelayStop в один (чередуя через один элемент старт1-стоп1-старт2-стоп2-...), размер его в два раза больше чем кол-во реле.  Делаете на millis формирование очередного интервала из этого массива (они получается будут чередоватся, то старт то стоп). Как интервал закончился закончился, делаете digitalWrite(RelayKey[k>>1], k&1); ну понятно инкркмент k, она глобальная,... То мелочи. Код Ваш даже короче станет )) Не блокирующий, быстрый доцепите дальше чего возжелаета, главное сохранять правильный подход.