И снова о millis()

Спасибо! Буду разбираться. Прочтите, пожалуйста, #105.

Если добавить счетчик переключений trigger, то “ноль” ловится без проблем.

Опять! Вы рассказываете как вы планируете делать, а не что Вы планируете делать. Т.е. Вы рассказываете свою идею решения задачи, а не саму задачу.

Пример о котором я говорил такой:

у человека было SSR реле с контролем перехода через ноль. Он хотел давать ему команды внутри полупериодов, не чаще, чем раз в 10мс (полупериод сетевого напряжения). Ну, написал очень хитрую настройку таймера и получил ШИМ с периодом в одну секунду с шагом управления в 10мс (т.е. ШИМ управлялся от 0 до 100). Но проблема была в том, что его ШИМ постоянно куда-то плавал по фазе в сравнении с сетевым напряжением и уплывал до того, что начинался полный рассинхрон, пропускались полупериоды и т.п. Как он всех достал вопросами о том, как подогнать период, чтобы рассинхронизации не было … а она всё равно за час накапливалась. Пока он (на третьей неделе траха наших мозгов) не сказал какая у него задача. Тогда его просто обматерили и сказали – сделай детектор пиков сетевого напряжения и тактируй таймер от него! Таймер будет тикать строго в пики независимо от точности и стабильности частоты сети. Вот и всё - никакой рассинхронизации, всё работает идеально.

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

Задача минимум. Необходимо выдержать заданный период времени. По окончании этого периода зафиксировать факт окончания периода. А по запросу через UART получать время в минутах и секундах до конца периода. Хотя с запросом через UART я справлюсь. А вот как перевести остаток времени в минуты и секунды - не соображу. И хрен с ними, с задержками в датчике.

___Чо?

1 лайк

Чисто интуитивно :slight_smile:
Число секунд остатка=Остаток/1000; Минуты=Число секунд остатка/60; Секунды=Число секунд остатка%60;
Погрешность в пределах секунды.
…Хотя…, если Погрешность=Остаток%1000>500, то Число секунд остатка=Число секунд остатка+1;

Прежде чем что-то решать, это “что-то” нужно внятно сформулировать.
Может, и решать после этого будет нечего.

@Optron
Два момента:

  • если у вас что-то в коде занимает секунду - выдерживать 500мс интервалы будет НЕВОЗМОЖНО.

  • я вам уже давно писал, что библиотека для датчика у вас кривая. Задержка, равная статусу датчика - это полный бред.

Так что единственный вариант для вас - это взять другую библиотеку.

Вы не знаете, как из миллисекунд получить минуты и секунды?

Например, сегодня сорок восьмой день с момента запуска программы. Мне надо отметить недельный период, по истечению которого выдать какой-то сигнал. Беру millis(), вычисляю - каким он (она) должен (должна) быть через неделю и записываю это в переменную stop. Я не знаю как правильно найти разницу между stop и текущим millis(), так как момент stop наступит после переполнения.

Заведите переменную, значение которой увеличивайте каждую секунду.

Прочитай про unixtime. Это время выраженное одним числом и его легко сравнивать с необходимыми интервалами. Для unixtime есть процедуры преобразования в дни часы минуты секунды и обратно.

1 лайк

Заведите переменную, считающую число переполнений или купите модуль часов за 100 р.

2 лайка

Если длительность периода не превышает “времени переполнения” (недельный или месячный – пофиг), то всё делается точно так же, как с периодом в одну секунду - точно также, никакой разницы.

Причем это делается не так, как Вы сказали:

Никогда так не делайте. От слова “совсем никогда”. Никогда не складывайте текущее время с длительностью периода, чтобы получить время окончания. Так нельзя делать!

Пояснения для особых случаев

Для альтернативно-одарённых: “так нельзя делать
Для просто тупых: “ТАК НЕЛЬЗЯ ДЕЛАТЬ НИКОГДА, НЕТ ИСКЛЮЧЕНИЙ

См.

1 лайк
uint32_t diff = millis() - stop;

И пофигу на переполнение

1 лайк

В одном посте упомянуты альтернативная одаренность, простая тупизна, и Вечный Жид.
Похоже, самые спокойные из нас начинают теряться в этом мире, без ежедневного крапивного отвара внутривенно, и, особенно, без регулярного садо-мазо с уклоном в садо.

Может быть так?

uint32_t diff = stop - millis();

Извините за грубость - вы считаете себя умнее меня?

При чем здесь “умнее”?
Я сделал как Вы сказали. Там идет увеличение. А мне нужен остаток.

извинения ни к чему, потому что невозможно по-русски подобрать интонацию к вопросу про интеллект собеседника, чтобы он не был оскорбительным. Попробуйте у близкого человека спросить просто “ты умный?” - развлекуха на вечер гарантирована. Такой вот лингвистический казус.

2 лайка