Хочу вывести часы, чтобы они показывали часы до 24 часов, а далее сбрасывались на ноль и заново начинали отсчет

Всем привет!
Я новичок, многого не знаю, не пинайте.

По кусочкам кое как собираю, пока что получается, хоть и с трудом.

Arduino UNO

Такой вопро:
вывожу информацию на дисплей 1602 через I2C.
хочу вывести часы, что бы они показывали часы до 24 часов, а далее сбрасывались на ноль и заново начинали отсчет.
С сутками разобрался, их можно и не сбрасывать, а вот часы до 24 как сделать не знаю.
Вот пример того как я делаю:

!!! Serial.print (millis()/1000/60/60) !!! (временно на сом порт вывожу)

как сделать что бы по достижении 24 часов он начал заново отсчитывать?

делал чере if тоже, со сбросом миллис, но видимо что то не так делаю…

unsigned long timing;

!!! if (millis()-timing<5000) {
Serial.println(millis()/1000);
timing=millis();
delay(1000);
} !!!
время в секундах условное.

Подскажите пожалуйста

Вывод в Serial, но ты можешь выводить куды угодно

/*
 Name:		millisClock.ino
 Created:	25.03.2024 5:47:10
 Author:	DtS
*/
#include <Arduino.h>

constexpr uint8_t	MAX_HOUR	= 24;
constexpr uint8_t	MAX_MINUTE	= 60;
constexpr uint8_t	MAX_SECOND	= 60;

uint8_t Hour   = 0;
uint8_t Minute = 0;
uint8_t Second = 0;

bool TimeChanged = false;

int SerialPutChar(char ch, FILE* f) {
	return Serial.write(ch);
}

void CheckSeconds() {
	static uint32_t lastCheck = 0;

	uint32_t now = millis();

	if (now - lastCheck >= 1000) {
		lastCheck = now;
		TimeChanged = true;
	}
}

void CalcTime() {
	if (++Second < MAX_SECOND) return;
	Second = 0;
	if (++Minute < MAX_MINUTE) return;
	Minute = 0;
	if (++Hour < MAX_HOUR)   return;
	Hour = 0;
}

void DisplayTime() {
	printf("%02d:%02d:%02d\n", Hour, Minute, Second);
}

void setup() {
	Serial.begin(115200);
	stdout = fdevopen(SerialPutChar, NULL);
	puts("Programm started...");

}

void loop() {
	CheckSeconds();
	
	if (TimeChanged) {
		TimeChanged = false;
		CalcTime();
		DisplayTime();
	}
}

image

1 лайк

Дык это на китайской ардуине не сделать. Вон тебе Дет написал, так у него знаешь какие ардуины? ФирмА! Там одних наклеек больше чем микросхем. Вот на таких можно до 24 щетать. А на китайских никогда точно не получается, то до 23, то ваще до 27 считают! Дрэг, одним словом!

1 лайк

Ого!))
Спасибо.
только ради этого скетч должен быть тако большой?
мне в принципе только часы нужны, то есть, первые 2 цифры, без минут и секунд…

да мне в принципе сильная точность не нужна… только первые 2 цифры времени (часы).

Нууу, таковаже, но с перламутровыми пуговицами у меня нет. Наморщи мозг.

2 лайка

Логика самая простая.
Когда счетчик часов становится 24, сбрасываешь его на ноль.

1 лайк

:laughing: :laughing: :laughing:

#include <Arduino.h>

constexpr uint8_t MAX_HOUR  = 24;
constexpr uint8_t MAX_MINUTE  = 60;
constexpr uint8_t MAX_SECOND  = 60;

uint8_t Hour   = 0;
uint8_t Minute = 0;
uint8_t Second = 0;

bool TimeChanged = false;

int SerialPutChar(char ch, FILE* f) {
  return Serial.write(ch);
}

void CheckSeconds() {
  static uint32_t lastCheck = 0;

  uint32_t now = millis();

  if (now - lastCheck >= 1000) {
    lastCheck = now;
    TimeChanged = true;
  }
}

void CalcTime() {
  if (++Second < MAX_SECOND) return;
  Second = 0;
  if (++Minute < MAX_MINUTE) return;
  Minute = 0;
  if (++Hour < MAX_HOUR)   return;
  Hour = 0;
}

void DisplayTime() {
  printf("%02d\n", Hour);
}

void setup() {
  Serial.begin(9600);
  stdout = fdevopen(SerialPutChar, NULL);
  puts("Programm started...");
}

void loop() {
  CheckSeconds();

  if (TimeChanged) {
    TimeChanged = false;
    CalcTime();
    DisplayTime();
  }
}

Почему? А кого пинать? Тех, кто всё знает?

Фраза попахивает дискриминацией по признаку присутствия/отсутствия предмета намарщивания :frowning:

2 лайка

Как безногому сказать “иди”. Злые вы все. А толерантность?

Та лехко)
Serial.print (millis()/1000/60/60%24)

1 лайк

Огромное Вам спасибо!:+1::+1::+1:
это именно то, что и нужно было:grin::+1:

а что, есть такие которые знают всё?

Спасибо Вам еще раз) помогли)
у меня еще один вопрос)
все работает, именно так как я и хотел.
единственное, при просмотре через ком порт, все показывает правильно и сбрасывается на ноль, а вот на LCD дисплее не корректо сбрасывается.
идет отсчет 1,2,3,4…22,23 сброс на ноль и 13,23,33,43,53,63,73,83,93,10,11,12,13… и так далее… то есть, после сброса, сбрасывается первая цифра, а вторая как бы зависает, до тех пор пока туда не поступит информация…
это как то можно решить?)

К примеру можно выводить пробел вместо второй цыфры пока часы за десяток не перевалят или дисплей очистить когда часы на ноль переключились.

1 лайк

Значит, следует записать туда нужную информацию.
Сама-то она без Вашего приказа туда записаться не может.

1 лайк

и как ей приказать?))

а как очищается дисплей? то есть, какой командой?

Вы отвечайте на вопрос “кого пинать?”, а задавайте свой.

а то @WladDrakula к примеру )))

2 лайка