Ошибка накапливается. Но это не страшно, можно строку №34 повыше перенести.
Однако, лучше этого не делать, а использовать тот факт, что DS3231 умеет сама выдавать прерывание по смене секунды. Вам надо просто ловить это прерывание и спокойно показывать что Вам нужно. И при этом забыть как о страшном сне и о milllis и о накоплении ошибки.
Так будет концептуально правильно, а сейчас у Вас “через Альпы”.
DS3231 ногу INT/SQW запрограммировать на выдачу 1 секндных импульсов. Подключить к ноге с прерыванием МК в режиме input pullup. В подпрограмме прерывания поднимать флаг секунды. В основной программе вместо проверки миллис проверять флаг. Если поднят опустить. Остальное без изменений.
А вот ни фига. Тогда, даже в идеальном случае, “секунда” котроллера будет равна секунде + время на всю байду с 19-ой по 34-ую строки. И это будет накапливаться, т.е. “байда” будет прибавляться каждую секунду. Со временем накопится столько, что показометр просто пропустит секунду и покажет следующую. И так будет повторяться.
Ну, Вам уже ответили. Только не забудьте пин SQW притянуть к питанию. И в прерывании сначала разрешите другие прерывания, а потом читайте часы (ну или читайте вне прерывания) иначе у Вас I2C подвиснет.
Это по любому самый верный поход. Например, при таком подходе у Вас секунда будет сменяться на экране тогда же, когда она сменяется в часах А при том подходе, что был у Вас (даже если решить все проблемы с накоплением погрешности) никто её не мешает сменяться посерёдке (т.е. сменяется в часах, через полсекунды - на экране). Вы же там никак к смене секунды в часха не привязываетесь.
А есть это всё оформленное где-то? Как бы вопрос принципиальный - есть модуль часов “точно” дающий данные времени, но вот загвоздка, когда его об этом спрашивать? С выводом SQW он сам командует, но прерывания… без них можно?, аналог - вечная тема кнопок
сдается мне, вы совершаете ту же ошибку, как в вопросе, нагонит ли таймер 20 секунд.
Обратите внимание, что я предлагаю увеличивать отметку времени от ПРЕЖНЕЙ ровно на 1 сек. Этот отсчет не будет зависеть от длительности кода между 19 и 34 строками (ну по крайней мере до тех пора, пока длительность этого кода меньше секунды).
Если не трудно, подскажите, как самым простым способом в изначальный код прикрутить счетчик секунд через SQW… Уже задолбался искать, везде разные методы с кучей библиотек, и пока не заработало. Как понимаете, в тему только вхожу