Примитивные часы. Два пути

в стандартной библиотеке time все уже давно придумано, так что легко и по первому варианту пойти - тупо секундный счетчик увеличивать.

void getCurrentDateTime(struct tm * outTm) {
	time_t rawtime = (time_t)RTC_GetCounter();
	localtime_r(&rawtime, outTm);
}

void setCurrentDateTime(struct tm * outTm) {
	RTC_SetCounter((unsigned long)mktime(outTm));
}

currentDateTime.tm_mday = 19; // 1-31
	currentDateTime.tm_mon = 9; // 0-11
	currentDateTime.tm_year = 2023 - 1900; // since 1900 year
	currentDateTime.tm_hour = 16; // 0-23
	currentDateTime.tm_min = 50; // 0-59
	currentDateTime.tm_sec = 30; // 0-60
	currentDateTime.tm_wday = 4; // 0-6 since Sunday
	setCurrentDateTime(&currentDateTime);

вечная дилемма что лучше - научиться привязывать чужие библиотеки или пытаться самому писать что нужно :frowning:

ничего не мешает руками самостоятельно посчитать из счетчика дни/месяцы/минуты и т.д.
в Википедии все формулы есть.

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

Это правильная, соответствующая стандарту, библиотека! Откуда?

В дешманских библиотеках (например, в той, что поставляется с Arduino IDE)

int8_t          tm_sec; /**< seconds after the minute - [ 0 to 59 ] */

2-й вариант проще и нагляднее. Точность от вариантов не зависит. Бюджетные часы - на таймере 2 в режиме RTC с кварцем на 32 кгц, уже обсуждали. Но удобнее отдельный RTC.


image

Сама библиотека /исходники/ идет в комплекте STM32 CubeIDE, где я и компилирую проект.
Комментарий //0-60 я писал сам, откуда брал информацию, не помню :thinking:

хм, а без источника информации непонятно, что там должно быть 0-59 ? :slight_smile:

Думал второй, но теперь задумаюсь над первым, особенно для аналоговых часов.

кто знает…что там должно быть
tm - cppreference.com

int tm_sec seconds after the minute – [0, 61] (until C99)[0, 60] (since C99)[note 1]
(public member object)

Там должно быть 0-60.

См. ISO/IEC 9899:2018 («Information technology — Programming languages — C»), страница 297 по файлу (или 285 по документу), в самом низу.

The range [0, 60] for tm_sec allows for a positive leap second .

вон оно как!

А Вы думали, что я шутил везде про високосную секунду?

Не думал, что это делается так

А я думал дежавю словил, ан нет. ) Ссыль на старый форум.

Я уже потренировался, по второму пути пошёл. Будет кому интересно выложу что получилось, после того как ТС потренируется.

Любое количество делений +3К к коду по совокупности (т.е. если хоть одно деление есть, то последующие деления лишнего кода уже не вносят). (Это если действительно 3К, что-то навскидку все равно многовато)

Это от человека зависит: для кого-то “печально”, а для кого-то “смешно”.

Часы - это как блинк для начинающих.)
Ребёнку делал двоичные часы на 7-ми сегментном индикаторе. Думал приобщить “к исскуству”… Куда там - сразу же переключала в обычный (не двоичный) режим. Лень - она такая.)

Да я на год или даже больше программирование забросил, вот и тренируюсь. )

Тренироваться можно, и даже нужно! Мозги не застаиваются в любом случае. Чем это от кроссвордов отличается? Лишь бы нравилось.

Я ещё свой недоделанный проект с гирляндой на адресных светодиодах хочу возродить. Так сказать побыть Франкенштейном ))