Библиотека для выполнения заданий по очереди - помогите найти

production
Offline
Зарегистрирован: 24.05.2017

Добрый день!

Не могу никак найти такую библиотеку или описание метода:

Нужно, чтобы программа отслеживала какая нога замкнута на GND и на сколько секунд (это я смог сделать). Дальше функция замыкает уже другие ноги соответственно на то же количество секунд, но по очереди, чтобы не две одновременно.

Вот примерно так я себе это вижу:

На входе:A1-ON A2-ON A3-ON A1-OFF A2-OFF A3-OFF

На выходе: 1-ON 1-OFF 2-ON 2-OFF 3-ON 3-OFF

Не обязательно, конечно, ноги замыкать, просто любые задания, лишь бы они по очереди выполнялись. Я нашел кучу библиотек с мультитаскингом и заданиями, но они все равно все параллельно работают, а мне надо последовательно. Я уже и с буферами разобрался, ничего не помогает. Ткните, пожалуйста, в нужную библиотеку или, может быть, вы с таким стречались.

Заранее большое спасибо за помощь!

production
Offline
Зарегистрирован: 24.05.2017

Забыл сказать, само собой, хотелось бы без delay.

КашыLot
Offline
Зарегистрирован: 24.05.2017

production пишет:
Не обязательно, конечно, ноги замыкать, просто любые задания, лишь бы они по очереди выполнялись. Я нашел кучу библиотек с мультитаскингом и заданиями, но они все равно все параллельно работают, а мне надо последовательно. Я уже и с буферами разобрался, ничего не помогает. Ткните, пожалуйста, в нужную библиотеку или, может быть, вы с таким стречались.

если сторлько изучили, проще самому написать. Сформируйте список  (буфер) заданий и выполняйте его почередно по прерыванию таймера.

production
Offline
Зарегистрирован: 24.05.2017

Вот тут у меня и затык. Не могу найти в какое место вставить эту отсечку, что система занята.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

production пишет:

Вот тут у меня и затык. Не могу найти в какое место вставить эту отсечку, что система занята.

какая система у тебя занята?

production
Offline
Зарегистрирован: 24.05.2017

Занята выполнением задания. Задания все равно одновременно выполняются.

КашыLot
Offline
Зарегистрирован: 24.05.2017

production пишет:
Вот тут у меня и затык. Не могу найти в какое место вставить эту отсечку, что система занята.
Что в вашем понимании  "отсечка" и "система занята"?

Последовательно очень просто - сформируйте массив  длительности для N заданий t[N], включите i-задание (индекс=i), анализируйте время прошедшее со включения задания. Если прошло времени  >= t[i], выключите это задание и включите следующее задание на время  t[i+1].

При необходимости учитывайте переполнения счетчиков времени. 

 

 

production
Offline
Зарегистрирован: 24.05.2017

Массив потом сортировать?

КашыLot
Offline
Зарегистрирован: 24.05.2017

production пишет:
Задания все равно одновременно выполняются.
вы же хотели не одновременно, а последовательно ?

production
Offline
Зарегистрирован: 24.05.2017

Да, именно

КашыLot
Offline
Зарегистрирован: 24.05.2017

production пишет:
Массив потом сортировать?
Для последовательного выполнения не надо сортировать. Лучше вместо массива сделать  массив структур, а каждая структура будет состоять хотя бы из двух элементов - номера вывода, который надо включить(выключить) и времени, в течение которого  удерживать вывод во включенном (выключенном) состоянии.

production
Offline
Зарегистрирован: 24.05.2017

Ок, а при таком подходе получится зарегистрировать 2 разных включения одной и той же ноги? Например один раз на 5 секунд, потом на 10.

КашыLot
Offline
Зарегистрирован: 24.05.2017

Вписать один и тот же вывод в  2 разных задания,  те по мере поступления событий пополнять буфер заданий.

production
Offline
Зарегистрирован: 24.05.2017

То есть в целом вместо буфера использовать массив? Но тогда какие-то ячейки будут отработанными, ненужными. А массив-то не бесконечный. Вот я и спрашиваю, его сортировать?

КашыLot
Offline
Зарегистрирован: 24.05.2017

production пишет:
То есть в целом вместо буфера использовать массив? Но тогда какие-то ячейки будут отработанными, ненужными. А массив-то не бесконечный. Вот я и спрашиваю, его сортировать?

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

Используйте "бесконечный" кольцевой буфер http://arduino.ru/forum/programmirovanie/koltsevoi-bufer-fifo

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

production пишет:

То есть в целом вместо буфера использовать массив? Но тогда какие-то ячейки будут отработанными, ненужными. А массив-то не бесконечный. Вот я и спрашиваю, его сортировать?

Когда в ТЗ(тех задании) "каша",  то и в программе "каша".  Определитесь что вам надо узнать: сколько был замкнут(разомкнут) каждый вход или же просто лента времени замыкания и размыкания входов. Если лента , то куда вы ее будете писать. А так "часы"[millis()] у вас есть . так в ленте и пишите "вывод A0 замкнут,время,вывод A1 замкнут, время,вывод A1 разомкнут,время,вывод A1 разомкнут,время  и т д."

 

,"

КашыLot
Offline
Зарегистрирован: 24.05.2017

qwone пишет:
Когда в ТЗ(тех задании) "каша",  то и в программе "каша".
Отсутствие ТЗ лучшая почва для ХЗ

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

production, из Вашего "подробного" описания, так и не понял, что Вам нужно.

Если нужно просто определенные действия выполнять по очереди, то заведите переменную состояния.

В начале работы присваитвайте ей 1.

Пока она равна 1, выполняется первое задание.

По завершении первого задания переменной присваивается значение 2.

Пока переменная равна 2, выполняется второе задание.

По завершении второго задания переменной присваивается значение 3.

и т.д.

 

 

inspiritus
Offline
Зарегистрирован: 17.12.2012

Квест?

production
Offline
Зарегистрирован: 24.05.2017

А хорошая идея, да. У меня была мысть только сделать bool занято/свободно, но ваша, пожалуй, лучше

production
Offline
Зарегистрирован: 24.05.2017

В общем, никто не видел готового решения, как из параллельного разложить в последовательное?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

production пишет:

В общем, никто не видел готового решения, как из параллельного разложить в последовательное?

А вам что интереснее? Найти или не найти. Я скорее склоняюсь к мысли , что второе для вас важнее.

http://arduino.ru/Reference/SwitchCase  и var++