Применение millis для нескольких процессов
- Войдите на сайт для отправки комментариев
Пт, 08/06/2018 - 20:51
Добрый вечер!
Подкажите пожалуйста как с помощью каманды millis управлять несколькими процессами? Есть такой кусок коды:
static bool state1; static unsigned long time; if((millis() - time) > (state1 ? 10000 : 20000)) // первое число отображает время одного положения в мск, второе число отображает длительность второго состояния реле { state1 = !state1; digitalWrite(relay1, state1); time = millis();
Данный кусочек кода управляет включением и отключением реле через определенный интервал времени. Есть необходимость управлять таким же образом еще двумя реле. Подскажите пожалуйста как можно это организовать, никак не получается самому допереть?
Опишите класс для управления процессом и содайте по экземпляру на каждый процесс. Тогда сложно будет такая же, как для одного процесса. А если Вы будете пытаться всё описать в одной простыне - свихнётесь и всё равно что-то будет вылазить.
Опишите класс для управления процессом и содайте по экземпляру на каждый процесс. Тогда сложно будет такая же, как для одного процесса. А если Вы будете пытаться всё описать в одной простыне - свихнётесь и всё равно что-то будет вылазить.
Подскажите пожалуйста, что значит "описать класс"? Я только учусь и это пока для меня сложновато. Может есть пример?
http://arduino.ru/forum/programmirovanie/klassy-arduino-po-qwone-dlya-ch...
Если конечно не свихнетесь читать.
Подскажите пожалуйста, что значит "описать класс"? Я только учусь и это пока для меня сложновато. Может есть пример?
Примеров миллион. Открываюте почти любую библиотеку и смотрите. Они почти вес состоят из описаний классов.
А вообще, прочтите книгу Страуструпа по С++, там всё написано. Найдёте.
А вообще, прочтите книгу Страуструпа по С++, там всё написано. Найдёте.
Хочет разобраться - осилит. Будет не просто читать, а реально запускать примеры оттуда, смотреть как работают, пробовать осмысленно менять, и в каком-нибудь объёме осилит. ООП вообще штука непростая, и всех тонкостей его не знают процентов 90 реально работающих программистов (а "прогеров" - так все 100%). Но на каком-то уровне осилить вполне можно.
Очень хочу осилить и буду потихоньку читать, изучать, пробовать, вам вопросы задавать, но проблемка в том, что на это уйдет время и не мало, поскольку я не могу все свое свободное время тратить на изучение. А решение задачки нужно найти в ближайшие пару дней, потом уеду на вахту и не смогу в течении месяца решить задачку... (((
restiv
Полностью код выложите.
Подкажите пожалуйста как с помощью каманды millis управлять несколькими процессами?
А что мешает завести еще 2 переменные для времени и для state?
Типа такого:
Или я что-то в попросе недопонимаю?
Или я что-то в попросе недопонимаю?
можно и так, хотя это плохой стиль. Всякий раз, когда вам приходится размножать куски кода копированием - это означает, что вы неэффективно спроектировали программу.
Подкажите пожалуйста как с помощью каманды millis управлять несколькими процессами?
Берете библиотеку coos, описываете каждый процесс как самостоятельную задачу, регистрируете задачи и запускаете шедулер. Там в примере показано как двумя задачами мигать светодиодом, а вообще задач можно довольно много наплодить.
После этого у вас все задачи исполняются одновременно. Надо только обязательно в каждой задаче хотя бы раз вызывать задержку COOS_DELAY(x), причем именно в теле самой задачи, а не в функции, которую вызывает задача.
Я так пробовал делать. Но не работает так.
Пожалуйста! Вот весь код.
[/quote]
А что мешает завести еще 2 переменные для времени и для state?
Типа такого:
Или я что-то в попросе недопонимаю?
[/quote]
Я так пробовал. Не работает код.
Я так пробовал. Не работает код.
Вот так работает(убрал все не относящиеся к реле):
Или я что-то всетаки недопонимаю?
Я так пробовал. Не работает код.
Вот так работает(убрал все не относящиеся к реле):
Или я что-то всетаки недопонимаю?
Да, данный код работает, но не совсем корректно. Как и в вашем случае я забыл проинициализировать выход второго реле как OUTPUT. Поэтому код не работал. Но когда я подправил данный косяк код заработал, но как то странно. Время запуска первого и второго реле не совпадали. Я не знаю почему. Первое реле запускается и отрабатывает как положенно, а втрое реле сразу не запускается, а запускается только через какое то время и получается, что два реле работают в разнобой. А мне нужно, чтобы они запускались одновременно, а отключались в разное время.
А почему речь идет о сутках? 1800000 мск - это же всего 15 минут. Или я что то не понимаю?
Можете ли вы сделать две вещи: определить событие, по которому начинается отсчет и произвести действие по истечению временного интервала? Если две этих задачи сумеете решить раздельно, то масштабировать свой скетч сумеете хоть до ста независимых выдержек.
Можете ли вы сделать две вещи: определить событие, по которому начинается отсчет и произвести действие по истечению временного интервала? Если две этих задачи сумеете решить раздельно, то масштабировать свой скетч сумеете хоть до ста независимых выдержек.
Я бы с радостью "определить событие, по которому начинается отсчет", но не знаю как. Знаний пока не достаточно.
Если нужна синхронная работа, то напишите digitalWrite(relay2, state1); после digitalWrite(relay1, state1);
А у меня стойкое убеждение что классы - это автоматически подразумевает "не жалко памяти". Так что лично я лучше уж покопирую лишний раз, но возможно, однажды меня и переубедят. Пока не знаю, избегаю пользоваться классами. Исключение - библиотечные, типа LCD и RF24.
много раз уже проверяли, переход к ООП это + 10-20% к ОЗУ и - 5-10% к производительности. qwone, вам уже десяток людей писали что ваше представление о классах - такое https://www.youtube.com/watch?v=J-_tf-XULUM . Не в упаковках дело, а в более высоком уровне абстрагирования. Разумеется там где он нужен.
Я бы с радостью "определить событие, по которому начинается отсчет", но не знаю как. Знаний пока не достаточно.
Если вы не знаете, с какого момента нужно выдерживать временной интервал, то ваша задача не имеет осмысленного решения (или имеет миллиарды равнозначно бессмысленных). Механизм формирования кода из неоформившихся ощущений пользователя в ардуину пока что не встроен.
Если вы не знаете, с какого момента нужно выдерживать временной интервал, то ваша задача не имеет осмысленного решения (или имеет миллиарды равнозначно бессмысленных). Механизм формирования кода из неоформившихся ощущений пользователя в ардуину пока что не встроен.
В принципе можно и с начала запуска работы МК запускать эти процессы или через минуту после включения МК. Мне не столь важно начало процесса, главное, чтобы они начинались одновременно.
Представьте, что перед вами секундомер. Вам нужно одновременно включить настольную лампу, верхний свет и фонарик. Настольная лампа должна гореть 15сек, верхний - 35сек, фонарик - 43сек. Как в реальной жизни эту задачу бы решали?
А что есть разница, где писать digitalWrite(relay2, state1); после digitalWrite(relay1, state1)??? Неужели если они будут расписанны как в скетче - это может привести к разнице в задержке запусков реле в несколько минут???
Logik, специально для узбеков говорю. Если вы думаете , упаковка в классы и упаковка архивы это одно и тоже.То это две большие разницы. Опять же абстрагироваться можно по разному. И потерей ОЗУ и с потерей производителености и вообще самому потеряться в абстракциях. Так что вы завязыватете с тяжелыми астракциями.
Представьте, что перед вами секундомер. Вам нужно одновременно включить настольную лампу, верхний свет и фонарик. Настольная лампа должна гореть 15сек, верхний - 35сек, фонарик - 43сек. Как в реальной жизни эту задачу бы решали?
включал бы по очереди... Т.е. вы предлагаете привязаться к запуску первого реле и от этого вести отсчет времени работы второго реле?
Представьте, что перед вами секундомер. Вам нужно одновременно включить настольную лампу, верхний свет и фонарик. Настольная лампа должна гореть 15сек, верхний - 35сек, фонарик - 43сек. Как в реальной жизни эту задачу бы решали?
включал бы по очереди... Т.е. вы предлагаете привязаться к запуску первого реле и от этого вести отсчет времени работы второго реле?
Не включал, а выключал бы, наверное? Но идею пока что правильно ловите - имеется одна точка запуска (отсчета) и три интервала. Хорошо точка отсчета, скажем, имеет значение N сек. Как определить, что пора выключать верхний свет?
Не включал, а выключал бы, наверное? Но идею пока что правильно ловите - имеется одна точка запуска (отсчета) и три интервала. Хорошо точку отсчета, скажем, имеет значение N сек. Как определить, что пора выключать верхний свет?
[/quote]
Нет, у меня то проблема не с отключением реле. Отключаются они как часики по тому врмени которое я закладываю. К меня проблема, что я не могу из одновременно включать. Первое реле запуска сразу же с включением МК, а второе включается через какое то ему одному известное время.
Т.е. сейчас вам нужно вообще не то, о чем спрашивалось в первом посте? Так что же вам надо - можете написать русским языком без квестов?
Т.е. сейчас вам нужно вообще не то, о чем спрашивалось в первом посте? Так что же вам надо - можете написать русским языком без квестов?
Мне нужно запускать несколько реле с определенным интервалом во включенном состоянии и с определенным интервалом в выключенном состоянии. Но условие такое, что они включаться должны одновременно, а отключаться в разное, согласно установленному периоду.
Andryn в посте #9 подсказал как это сделать. Я попробовал. Реле стали включаться, но не одновременно, а сначала одно реле, а через какое то время - второе реле.
restiv
Странно, тернарный оператор умеете использовать, а такой простой код не можете написать.
Если у вас нет проблем с отключением после заданного интервала, то что вам мешает все интервалы отсчитывать от одной точки, например нуля по millis(). Вы же поняли, как вычисляется интервал для выключения?
restiv
Странно, тернарный оператор умеете использовать, а такой простой код не можете написать.
К сожалению этот код не весь я писал сам. Большую его часть я позаимствовал у кого то здесь на форуме. И просто корректирую под свои нужды.
restiv
Правильно я понимаю что реле должны включится одновременно, а выключались каждая через определенный интервал? Опишите весь процесс.
restiv
Правильно я понимаю что реле должны включится одновременно, а выключались каждая через определенный интервал? Опишите весь процесс.
Да, вы все поняли правильно. два реле должны запускаться одновременно, через 20 сек одно реле должно отключаться, а через 60 секунд должно отключаться второе реле. Затем ждем 15 или 20 минут (нужно будет подобрать время) снова одновременно включаются 2 реле: одно на 20 сек, второе на 60 сек. Затем ждем 15 минут и снова включаем 2 реле и так по кругу в течении 12 часов. Потом третье реле полностью отключает питание и через 12 часов третье реле снова подключает питание и снова должен запуститья цикл отключения включения на 20 сек и 60 сек через каждые 15-20 минут.
Ну так включайте их в одном месте - соседними строчками в коде.
Исключение - библиотечные, типа LCD и RF24.
А также, Serial, LiquidCristalI2C, ... и ещё 100500 примерно.
Logik, специально для узбеков говорю.
Любо Logic - узбек, либо Вы - нацист.
В моем примере объявление переменных перенесите в общую часть, перед setup.
restiv
А модуль часов будет использоватся?
restiv
А модуль часов будет использоватся?
Да, он у меня стоит. По нему включается и отключается третье реле.
Если вы думаете , упаковка в классы и упаковка архивы это одно и тоже.
Я такое думаю?! Отличные манеры, самому выдумать фигню и приписать её другому. И тем более говорить это специально узбекам. А что мордва и буряты, ничего от нацика так и не услышат?
restiv
Ну вот набросал кодик, проверяй.
Вчера до поздна сидел с этим кодом. Залил эмуляцию в Протеус и долго наблюдал за работой скетча. И до меня дошло, что при такой стурктуре скетча моя задача просто никогда не будет выполняться.
Поскольку постоянно будет происходить сдвиг в запуске реле на величину разницы в отключении первого и второго реле.
И по этой причине возникает вопрос. Как можно изменить код, чтобы реле одновременно включались, но отключались в разное время и через определенный интервал, снова 2 реле одновременно запускались и отключались в разное время и т.д.??? Получается я должен отсчитывать время запуска реле посредсвом команды millis, но вот для отсчета времени их отключения нужно использовать какой то другой таймер времени. Который будет только отсчитывать время с момента включения и до момента когда реле нужно отключить.
restiv
Ну вот набросал кодик, проверяй.
Спасибо за скетч, завтра попробую. Сегодня в отъезде.
Попробуйте еще и так
vosara,поправил ваш скетч