Плавное увеличение и уменьшение значения без delay
- Войдите на сайт для отправки комментариев
Всем доброго времени суток, прошу помощи, так как уже не могу придумать как же сделать, так, что бы работала программа.
Суть проблеммы:
Есть значение, которое нужно увеличить за необходимое время без использования delay потом сделать задержку, снова поднять, затем опустить его на 0 и запустить процесс по новой. Более наглядно, нужно что бы переменная h за 10 секунд постепенно увеличилась до 100, потом задержка 10 секунд, снова подъем до 200, задержка, подъем до 300 и опускание в 0.
Есть определенные наработки:
int time = 5; //время в секундах int number = 99; //количество изменений за время time int number2 = 199; //количество изменений за время time int number3 = 299; //количество изменений за время time int segment; //время между изменениями unsigned long prev_time; unsigned long wait_time; unsigned long wait_time2; unsigned long wait_time3; int h = 0; //переменная которую увеличиваем void setup() { segment = (time*1000)/number; prev_time = millis(); Serial.begin(9600); } void loop() { if (((millis()-prev_time) >=segment)&&h<=number){ //если разница между текущим временем и временем больше заданого интервала(segment) и высота мееньше нужного количества изменений, то: h++; //увеличиваем высоту на 1 prev_time=millis(); //присваеваем переменной текущее время(фактически время окончания выполнения условия) Serial.println(h); //вывод wait_time=millis()+10000; //присвоение времени ожидания теекущего времени + 10 секунд return; } if(((millis()-prev_time) >=segment)&&h<=number2&&wait_time<=millis()) //тоже условие + если переменная wait_time(из прошлого условия) равна или меньше текущего времени > выполняем условия {h++; prev_time=millis(); Serial.println(h); wait_time2=millis()+10000; return; } if(((millis()-prev_time) >=segment)&&h<=number3&&wait_time2<=millis()) {h++; prev_time=millis(); Serial.println(h); wait_time3 = millis()+10000; return; } }
Тут с задержками я поднимаю переменную до 300, но теперь не могу додуматься, как мне её опустить до 0 и запустить цикл снова?
Питал идею с этого обсуждения http://arduino.ru/forum/programmirovanie/uvelichenie-znacheniya-peremennoi
Заранее благодарен за Ваше время!
Во вступлении вы описали этапы рабочего цикла, верно? Наверное было бы неплохо завести переменную, которая бы отражала текущий этап. Затем, на каждом проходе loop(), анализировать ее значение и выполнять действия, относящиеся только к нужному этапу. Как только все действия текущего этапа произведены - присваивайте переменной следующее значение, тем самым переключая этап.
Уменьшать надо также, как увеличивали. Другое дело, что у Вас написано так, что чёрт ногу сломит уже сейчас, а добавляю логику (новые условия) Вы доведёте программу до такого состояния, когда в ней уже никто и никогда не разберётся.
Попробуйте освоить регулярное программирование автоматов. Эизнь сразу станет намного легче.
Для разминки почитайте вот эту тему. Там, в №12 начинается объяснение, что такое автомат, а в №19 уже приведена готовая программа для автомата Мили. А так, по теме разбросаны очень серьёхные поянения о ток как надо и как не надо проектироваь программу. Почитайте, может потом захотите погуглить на эту тему.
О, кстати, jeraf4eg, коллега Вам говорит тоже, что и я
было бы неплохо завести переменную, которая бы отражала текущий этап.
Эта переменная называется "состояние автомата". В общем, читайте тему, что я дал, надеюсь, поможет.
Всем доброго времени суток, прошу помощи, так как уже не могу придумать как же сделать, так, что бы работала программа.
Суть проблеммы:
Есть значение, которое нужно увеличить за необходимое время без использования delay потом сделать задержку, снова поднять, затем опустить его на 0 и запустить процесс по новой. Более наглядно, нужно что бы переменная h за 10 секунд постепенно увеличилась до 100, потом задержка 10 секунд, снова подъем до 200, задержка, подъем до 300 и опускание в 0.
Может так
Спасибо большое, один вопрос, а возможно ли сделать тут так, что бы при достижении 300 значение не "прыгало" на 0 а плавно спустилось (300 299 298...) ?
Спасибо большое, один вопрос, а возможно ли сделать тут так, что бы при достижении 300 значение не "прыгало" на 0 а плавно спустилось (300 299 298...) ?
Канешно можно! Добавляем еще одну переменныю и и делаем еще одну проверку!
Честно говоря, я темный, можно попросить Вас это сделать, или хотя бы коментарии к своему коду написать, а то я как-то не могу понять как, что и к чему? =/
Диржите - в честь нового года, если надо откоментироать то чуть позже!
вот эта конструкция
if
(h == 0 || h == 100 || h == 200 || h == 300)
меняется на
if (!(h % 100)) ...
но проверка потом внизу должна быть другая
if (h>=300) ...
вот эта конструкция
if
(h == 0 || h == 100 || h == 200 || h == 300)
меняется на
if (!(h % 100)) ...
но проверка потом внизу должна быть другая
if (h>=300) ...
Согласен. А еще можно убрать переменную (
bool
f_vk = 0;) Выражаясь словами Евгения, "любое улутшение кода есть предпоследнее" И тогда код будет выглятедь так
Через месяцок без поллитры не разберешься в логике вашего кода...
Намек понял! Начинаю создавать ЗАПАСЫ.