Приостановка таймера millis()

DimaProh

✩✩✩✩✩✩✩
25 Мар 2021
11
0
Добрый вечер, уважаемые гуру. Поделитесь кодом, кто может.
Есть два таймера на миллис, выполняются по очереди. Есть кнопка с фиксацией, которая должна остановить отсчёт одного таймера (когда нажата), и продолжить его выполнение, когда(когда отпущена)
В общем, таймер считает до 10секунд. Когда кнопка нажата, запоминает остаток, и продолжает отсчёт, когда отпущена.
Наверняка, эту проблему могу решить и сам. Но на это потребуется некоторое время, которое хотелось бы провести с пользой
 

bort707

★★★★★★✩
21 Сен 2020
2,864
850
Есть два таймера на миллис, выполняются по очереди. Есть кнопка с фиксацией, которая должна остановить отсчёт одного таймера (когда нажата), и продолжить его выполнение, когда(когда отпущена)
для этого совершенно не нужно "останавливать миллис".
У вас есть интервал - вычтите из него время первого отрезка до остановки таймера - у вас останется время, которое должны протикать миллис после повторного запуска.

А "остановить миллис" нельзя.

Наверняка, эту проблему могу решить и сам. Но на это потребуется некоторое время, которое хотелось бы провести с пользой
а вот это заявление, граничащее с наглостью. Значит пока за вас кто-то будет решать ваши задачи - вы будете "проводить время с пользой"? А у тех, кто вам будет помогать - своих задач нет?
 

DimaProh

✩✩✩✩✩✩✩
25 Мар 2021
11
0
для этого совершенно не нужно "останавливать миллис".
У вас есть интервал - вычтите из него время первого отрезка до остановки таймера - у вас останется время, которое должны протикать миллис после повторного запуска.

А "остановить миллис" нельзя.


а вот это заявление, граничащее с наглостью. Значит пока за вас кто-то будет решать ваши задачи - вы будете "проводить время с пользой"? А у тех, кто вам будет помогать - своих задач нет?
Я же попросил поделиться кодом. Кто-то, наверняка уже давно это решил. Более того, это реализовано в библиотеке ГайверТаймер.
 

bort707

★★★★★★✩
21 Сен 2020
2,864
850
Более того, это реализовано в библиотеке ГайверТаймер.
что мешает использовать код оттуда?
Кто-то, наверняка уже давно это решил.
конечно, тысячи раз :)
Но только вот в чем загвоздка - чтобы понять, как этим пользоваться - вам тоже надо это решить самому, а не списывать у тех, кто "уже решил".
Тем более что дела -то там - пара строчек
 
Изменено:
  • Лойс +1
Реакции: PiratFox

DimaProh

✩✩✩✩✩✩✩
25 Мар 2021
11
0
что мешает использовать код оттуда?
Значение таймера у меня реализовано через потенциометр. И я не могу ему присвоить остаток. Это основная проблема.
Хотя, тут идея появилась. Использовать дополнительную переменную. При поднятом флаге, остаток таймера будет записан в буфер. При опущенном флаге, использоваться значение с потенциометра.
Какая то ерунда получается, если честно.
 

bort707

★★★★★★✩
21 Сен 2020
2,864
850
Вы бы свой код выложили и указали, что не получается. Тогда может кто и поможет.
А писать код за вас совершенно не интересно.
 

DimaProh

✩✩✩✩✩✩✩
25 Мар 2021
11
0
На данный момент, я не могу сообразить, за счёт чего таймер останавливается. То, что создаётся дополнительный буфер, и этот буфер используется для продолжения, понятно. Но что именно заставляет остановиться, никак не пойму
 

bort707

★★★★★★✩
21 Сен 2020
2,864
850
Но что именно заставляет остановиться, никак не пойму
таймер не останавливается.. Он продолжает считать. А вы просто запоминаете время, когда вам надо его "остановить", и потом вычитаете это время из следующего.

Вы же по наручным часам можете заметить два отдельных интервала по часу, правильно? - разве вам для этого надо часы останавливать? :)
 

DimaProh

✩✩✩✩✩✩✩
25 Мар 2021
11
0
Если ((миллис() - таймер) > 5000)
{
Если ((читаем кнопку) == правда) {буфер = миллис() - таймер;
таймер = таймер+буфер;}
Таймер = миллис();
Мой код
}
Не понимаю, это будет работать, или нет
 

DimaProh

✩✩✩✩✩✩✩
25 Мар 2021
11
0
я тоже.
Вы что хотите сделать то?
Вот за этим я сюда и пришёл)
Кнопка сработала. Остаток я записал в буфер. Дальше тьма. Куда пихать этот остаток? Что мешает таймеру завершить условие?

Если ((миллис() - (таймер+буфер)) > 5000)
{
Если ((читаем кнопку) == правда) {буфер = миллис() - таймер;}
Таймер = миллис();
Мой код
}

Не проще ли сделать так:


Если ((миллис() - таймер) > 5000)
{
Если ((читаем кнопку) == правда) {таймер++;}
Таймер = миллис();
Мой код
}
 

bort707

★★★★★★✩
21 Сен 2020
2,864
850
я не поняимаю задачи
Что такое таймер? Что такое буфер?
Что происходит при нажатии кнопки?

Попробуйте сначала изложить идею словами.
Например - "нужно засечь интервал 5 секунд, но если кнопка нажата - время нажатия кнопки не учитывать"...
Как-то так
 

DimaProh

✩✩✩✩✩✩✩
25 Мар 2021
11
0
Я действительно не могу понять как должна работать эта пауза.
Миллис увеличивается на 1мс от старта микроконтроллера, это понятно.
Таймер в начале равен нулю, и когда условие (миллис - таймер) > 5000 будет выполнено, таймер будет равен 5001(как и миллис) до следующего выполнения условия, и увеличиваться, кратно этим 5000, соответственно. Это тоже понятно.
Для того, чтобы не допустить выполнение условия, при нажатой кнопке, достаточно каждую 1мс, увеличивать таймер на 1мс.
Завтра проверю эту конструкцию.

я не поняимаю задачи
Что такое таймер? Что такое буфер?
Что происходит при нажатии кнопки?

Попробуйте сначала изложить идею словами.
Например - "нужно засечь интервал 5 секунд, но если кнопка нажата - время нажатия кнопки не учитывать"...
Как-то так
Есть таймер работы двигателя. (Задаётся потенциометром) есть концевой выключатель на двери.
Нужно, чтобы во время вращения двигателя, открылась дверь, и таймер не сбросился, но приостановился. И продолжил свой ход с места остановки.
 

poty

★★★★★★✩
19 Фев 2020
2,958
886
Опять уходим в бред...
Что Вы называете "таймером"? millis - это не таймер, Ваша переменная timer - не таймер.
В программной терминологии гайверовской библиотеки таймеров: "таймером" называется комбинация двух параметров (начального значения millis (пусть будет start), интервала (пусть будет interval)) и условия (достижение или превышение текущего значения millis значения start+interval). Вы ошибочно полагаете, что Ваш millis будет считать для Вас с 0, поэтому не запоминаете start. Интервал у Вас есть, но определяется также неверно. Условие, по причине отсутствия start и interval, также оказывается неверным.
Не понимаю... Если лень разбираться, почему не использовать готовую библиотеку Гайвера?
 

DimaProh

✩✩✩✩✩✩✩
25 Мар 2021
11
0
Опять уходим в бред...
Что Вы называете "таймером"? millis - это не таймер, Ваша переменная timer - не таймер.
В программной терминологии гайверовской библиотеки таймеров: "таймером" называется комбинация двух параметров (начального значения millis (пусть будет start), интервала (пусть будет interval)) и условия (достижение или превышение текущего значения millis значения start+interval). Вы ошибочно полагаете, что Ваш millis будет считать для Вас с 0, поэтому не запоминаете start. Интервал у Вас есть, но определяется также неверно. Условие, по причине отсутствия start и interval, также оказывается неверным.
Не понимаю... Если лень разбираться, почему не использовать готовую библиотеку Гайвера?
Она не подходит для моей задачи. У меня два интервала идут один за другим. И выполнение первого интервала, является условием для старта второго интервала. И наоборот.
 

poty

★★★★★★✩
19 Фев 2020
2,958
886
Это ничему не противоречит. Вы просто не можете сформулировать для себя свою задачу. Примеров последовательного отсчёта интервалов с помощью библиотеки Гайвера можно найти на этом сайте в достаточном количестве, ну, например, в часах никси версии 1. Условий навешивается внешних сколько угодно.
 
  • Лойс +1
Реакции: bort707

bort707

★★★★★★✩
21 Сен 2020
2,864
850
Она не подходит для моей задачи.
она не подходит не поэтому, а потому что вы задачу так и не сформулировали.
И пока не сформулируете - у вас ничего не выйдет.
А так вообще на миллисе можно отмерить любое количество пересекающихся интервалов - на сколько памяти ардуины хватит
 

DimaProh

✩✩✩✩✩✩✩
25 Мар 2021
11
0
она не подходит не поэтому, а потому что вы задачу так и не сформулировали.
И пока не сформулируете - у вас ничего не выйдет.
А так вообще на миллисе можно отмерить любое количество пересекающихся интервалов - на сколько памяти ардуины хватит
Задачу я уже несколько раз описал. Библиотека возможно и подходит. Но описание и примеры тяжелы для понимания. Придется потратить день, чтобы разобраться. И возможно, сам запишу видео с ее описанием, чтобы другим было легче понять.

В моем понимании
Таймер - это участок времени от момента запуска двигателя, до его установки.
Организовывается через функцию миллис(). В общем, легче самому разобраться, чем просить помощи. Потому что я уже не знаю, как людям объяснить, что мне нужно. Похоже, я говорю на отличном от других языке.
 

bort707

★★★★★★✩
21 Сен 2020
2,864
850
описание и примеры тяжелы для понимания. Придется потратить день, чтобы разобраться
ты считаешь день - это много? - чтобы вникнуть во что-то, приходится и неделями сидеть иногда.
Раз для тебя описание "трудно для понимания" - значит ты не только библиотеку не знаешь - но и еще и в программировании слаб, язык подучить надо и многое другое.
И ты думаешь - тебе кто-то ррраз - и сразу все обьяснил? так не бывает
В общем, легче самому разобраться, чем просить помощи.
Главное - самому всегда лучше. Пока ты сам не поймешь - никто тебе в голову это не вложит.

То что ты сформулировал - это совсем не то

Формулировать надо как-то так
1. В начале запоминаем значение миллис в какую-то переменную, например old_millis
2.Пока дверь закрыта - постоянно проверяем прошедшее время (millis - old_millis) и сравниваем его с заданным интервалом
3. Если открыта дверь - запоминаем прошедшее к данному моменту время и больше на время не смотрим, просто ждем, пока дверь закроется
4. Если дверь закрылась - вычитаем прошедшее до п3 время из интервала и снова переходим к п 2
5. Если время истекло - заканчиваем

Вот я тебе в общих чертах описал алгоритм твоей задачи. Теперь попробуй по нему написать код
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
2,958
886
Есть таймер работы двигателя. (Задаётся потенциометром) есть концевой выключатель на двери.
Нужно, чтобы во время вращения двигателя, открылась дверь, и таймер не сбросился, но приостановился. И продолжил свой ход с места остановки.
Давайте изложим это алгоритмическим языком и Вы поймёте, что это напрямую ложится на методы библиотеки.
В Вашем изложении:
1. Поступает сигнал на открытие двери:
  • запоминаем этот момент (значение millis() в этот момент), пусть он будет t1;
  • определяем некоторый интервал работы двигателя, скажем dt1;
  • включаем двигатель.
2. (вариант a) Дверь начинает открываться и через время dt2 (определяется как значение millis() в момент начала п.2 минус t1) упирается в концевик:
  • двигатель останавливается;
  • определяем оставшийся интервал dt1'= dt1-dt2.
2. (вариант б) Дверь за время dt1 не достигла концевика:
  • двигатель останавливается;
  • dt1' = 0.
3. Что происходит дальше? Как и когда используется dt1'?