Подсчёт секунд с помощью millis()

Очень даже имеет - луп только выводом и занят, а т.к. вывод в сериал очень и очень долгий, то… ))

Дракула показал тенденцию, вектор или как там по вашему, А ЧАСТНОСТИ В ВИДЕ ВОЛОЧАЩЕГОСЯ ПАРАШЮТА здесь совсем неуместны

“А что я такого сказал?”

Уж не ты будешь решать, что тут уместно, а что нет?

Разумеется, он правда так думает. И не один он – это известный феномен, отмеченный еще полвека назад

Нет, конечно.
Создалось впечатление, что Вы не наивны, а глупы, простите уж старика за прямоту. И Вы сделали немало, чтобы это впечатление возникло и утвердилось.

Ещё как имеет. Он постоянно закрывает прерывания и потому многие тики микрос просто пропускаются.

Здоровья Вам :+1:

И Вам не хворать!

Когда дело доходит до здоровья - уже настораживает…

@MMM, прошу прощения, збрехамши. Что-то переклинило и я с прямым углом SoftSerial перепутал, это он закрывает прерывания в функции write, чтобы тайминги не ломались. Serial не закрывает прерываний.

Да, ладно, … спасибо зарядке!

Это да. Тут вообще, бывают парадоксы. Муж бухает, а у жены голова болит.( И фиг ты чем это объяснишь.

Вчера с женой раком стояли в огороде. Вот это зарядка. Так и хотелось впердолить, но как подумаешь, то снимать, это… А оказалось, что ничего и небыло… Аж расстроился.

Ничего личного, от чистого сердца. А там пусть каждый додумывает по свей испорченности.

  if(timer - cycle >= 1000) {
    sec += 1;
    cycle += 1000;
  }

Примечание: когда millis() используют для задания интервала между некоторыми действиями, может преследоваться одна из двух целей:

  1. Интервал должен быть не менее заданного.
  2. Интервал должен в среднем равняться заданному.

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

/*
 Name:		MillisClock.ino
 Created:	23.06.2026 19:22:13
 Author:	DtS
*/

#include <Arduino.h>

constexpr uint32_t  READ_INTERVAL		= 1000;     // миллисекунд в секунде, можно корректировать для калибровки
constexpr uint8_t   SECONDS_PER_MINUTE	= 60;		// секунд в минуте
constexpr uint8_t	MINUTES_PER_HOUR	= 60;		// минут в часе
constexpr uint8_t	HOURS_PER_DAY		= 24;		// часов в сутках

uint8_t softSec, softMin, softHour = 0;				// секунды, минуты, часы

uint32_t lastMSRead			= 0;
bool	EnableTimePrint		= true;


static int sputchar(char c, FILE* f) {
	return Serial.write(c);
}

void setup() {
	Serial.begin(115200);
	stdout = fdevopen(sputchar, NULL);
	delay(100);
	puts("Millis Clock. Version 0.01");

}

static void Tick(void) {
	if (++softSec < SECONDS_PER_MINUTE) return;
	softSec = 0;
	EnableTimePrint = true;
	if (++softMin < MINUTES_PER_HOUR) return;
	softMin = 0;
	if (++softHour == HOURS_PER_DAY) softHour = 0;
}

void loop() {
	uint32_t now = millis();
	if (now - lastMSRead >= READ_INTERVAL) {
		lastMSRead = now;
		Tick();
	}

	if (EnableTimePrint) {
		EnableTimePrint = false;
		printf("Time changed: %02u:%02u\n\r", softHour, softMin);
	}
  
}

Дет! Я человеку уже все объяснил в #57

Нет. Объяснить то ты объяснил, но ЛЮДЯМ не понятно.
Я требую повторного объяснения!

А я вообще объяснений не увидел, там только код, и протокол, на основе которых каждый сам должен делать выводы. И никаких объяснений.