Неблокирующийся код для последовательной работы реле
- Войдите на сайт для отправки комментариев
Втр, 31/05/2016 - 14:31
Добрый день, товарищи.
У меня есть 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 можно элементарно, но не могу придумать, как заставить перебирать реле по очереди.
Заранее спасибо за внимание и помощь.
завести на каждую реле отдельную переменную
класс титановый велосипед для delay без delay().
http://robotosha.ru/arduino/multitasking-and-interrupts-arduino.html
Добрый день, товарищи.
У меня есть 5 релюшек, которые открываются и закрываются по очереди. То-есть открывается вначале реле №1 на определенный период времени, затем закрывается на так же определенный период времени. Далее то-же самое происходит с реле №2,3,4,5 и по кругу. Все эти периоды работы/простоя разные для каждого реле.
В данный момент используется решение с delay
Возникло желание прицепить дисплей и кнопки для изменения периодов работы/простоя, но считывать кнопки не могу в силу того, что программа ждет дилеи.
Переписать то же самое на millis можно элементарно, но не могу придумать, как заставить перебирать реле по очереди.
Заранее спасибо за внимание и помощь.
Так элементарно. Обединяете массивы RelayWork и RelayStop в один (чередуя через один элемент старт1-стоп1-старт2-стоп2-...), размер его в два раза больше чем кол-во реле. Делаете на millis формирование очередного интервала из этого массива (они получается будут чередоватся, то старт то стоп). Как интервал закончился закончился, делаете digitalWrite(RelayKey[k>>1], k&1); ну понятно инкркмент k, она глобальная,... То мелочи. Код Ваш даже короче станет )) Не блокирующий, быстрый доцепите дальше чего возжелаета, главное сохранять правильный подход.