Возьми RTClib и не парься. В ней есть класс RTC_Millis.
Так эта библиотека использует тот же самый millis()
#include "RTClib.h"
/**************************************************************************/
/*!
@brief Set the current date/time of the RTC_Millis clock.
@param dt DateTime object with the desired date and time
*/
/**************************************************************************/
void RTC_Millis::adjust(const DateTime &dt) {
lastMillis = millis();
lastUnix = dt.unixtime();
}
/**************************************************************************/
/*!
@brief Return a DateTime object containing the current date/time.
Note that computing (millis() - lastMillis) is rollover-safe as long
as this method is called at least once every 49.7 days.
@return DateTime object containing current time
*/
/**************************************************************************/
DateTime RTC_Millis::now() {
uint32_t elapsedSeconds = (millis() - lastMillis) / 1000;
lastMillis += elapsedSeconds * 1000;
lastUnix += elapsedSeconds;
return lastUnix;
}
Спасибо!
В общем не знаю что вчера было, сегодня всё работает без проблем. Единственное что, отставание было на 1 минуту 5 сек. Позанимался мазохизмом и подобрал минимальное отставание около 2 сек на 1 минуту (if (in && ((millis() - cycle) > 818))). 818 - быстрее на 2 сек, 819 - медленнее на 2 сек. Всё что выше на 5 сек, ниже не пробовал.
Так, всё таки, есть какая то польза от форума? На котором есть умные люди, направившие на путь истинный?)
судя по результату (отставание миллис на 2 сек в минуту) - этому персонажу вряд ли кто-то сможет помочь
на старом форуме я выкладывал скетч часиков на миллис, там подсмотри, как корректировать
и таки да, это всё из-за этого:
sec++;
cycle = timer;
а должно быть:
sec++;
cycle += 1000;
тут не корректировать надо, а сразу в морг
На миллисе такой ошибки быть не может.
У автора в первом сообщении код с ошибкой, как он ее исправил - никто не знает.
Ну, если у человека:
то, надо ли нам это знать?
Один мудрый еврей говорил:
тут не могу не вмешаться!
В Танахе написано, не стану мучить ивритом, в транслитерации: “беров хохма рав каас…” כעס - “каас” это не печаль, а скорее досада. В современном иврите глагол лекаос - просто злиться. “Аль тихас алай”, это просто детское: “Не злись на меня”. То есть Соломон, а текст книги Экклезиаст приписывают ему, имеет ввиду, что многие знания есть причина все большей досады, больше видишь несовершенства.
зы: читая, ставим ударения на последний слог, как во французском… это не всегда так, но часто.
Я очень благодарен всем кто переживает за моё здоровье, и даёт рекомендации куда мне обратится!
Ещё пламенный привет тем кто решил просто потрещать и покидаться умными словами чтоб поднять собственную самооценку!
Теперь подробнее:
Есть ардуинка к ней подключён экран. Есть несколько окон разной сложности, при переключении между окнами скорость обработки естественно разная.
sec++;
cycle += 1000;
Прежде чем сюда написать, я перепробовал много чего. В данном случае, скорость подсчёта меняется от открытого окна
sec++;
cycle = timer;
здесь переключение окон не влияет на работу.
Побродив по просторам всемирной паутины, могу сделать вывод что корректная работа millis() зависит от сложности самой программы.
Ну если уже решили пофилосовствовать.
Несовершенство понятие относительное. Оно зависит от многого: воспитание, учёба, опыт и т.д.
Если простыми словами писать: многие люди с большим багажом знаний и опыта, при поиске проблемы начинают искать её в корне, хотя она лежит на поверхности.
Я вам больше скажу - корректная работа любой программы зависит от ее сложности корректности ее разработки. Правильно написали - работает корректно, накидали багов - начинаются непонятки в работе
ЗЫ: по своему опыту могу сказать, что millis() работает вполне корректно и на достаточно сложных программах
Люди, обладающие большим опытом и багажом знаний обычно знают, в каком месте может быть проблема уже по ее симптомам ))
Точнее от знаний того, кто этот миллис применяет.
Не обманывайте себя, то что у вас миллис считает неточно - связано не с особенностями миллис и даже не с работой дисплея - а ТОЛЬКО с ляпами и ошибками в вашей программе.
ну еще и в сравнении надо было исправить > на >=
Сейчас отрезок времени, от которого вы начинаете новый отсчет будет всегда +++
1000 на сколько на 1 миллисекунду, на три, эти миллисекунды всегда плавающие,
если нужен равномерно тикающий миллис делать надо как в моём примере, на длительном отрезке,
к примеру минуту он натикает весьма точно
а чего ему не работать )))
Любой человек думать о себе может что угодно. Я оцениваю опыт по ответам.
Перед вами каюсь. На пустом скетче ваш вариант показал точны подсчёт. С millis() у меня показало отставание 10 сек на 1 мин
В общем все большое спасибо за обсуждение. 4 дня мучений, ничего не менял, но часики пошли точно.
Надо сходить в церковь свечку поставить, а то мерещится начинает всякое.