Часы с LCD экраном

proxodimec666
Offline
Зарегистрирован: 08.11.2014

Здравствуйте. Изучаю программирование Arduino. Пытаюсь сделать часы.

Вроде бы всё работает но есть непонятные моменты.

byte H(long unsigned Time) //Подсчёт часов
{
  
  static byte h;
  h=Time/3600000;
  if (h>23) {while (h>23) h=h-23;}
  return h;
}
byte Min (long unsigned Time) // Подсчёт минут
{
  static byte Min;
  Min=Time/60000;
  if (Min>59) {while(Min>59) Min=Min-59;}
  return Min;
}
byte sec (long unsigned Time) // Подсчёт секунд
{
  static byte sec;
  sec=Time/1000;
  if (sec>59) {while (sec>59) sec=sec-59;}
  return sec;
}

void LcdPrintTime(byte h, byte Min, byte sec) // Вывод времени 
{                                             // на LCD экран
  
  lcd.setCursor(0,1);
  lcd.print("Time ");
  lcd.print(h);
  lcd.print(":");
  lcd.print(Min);
  lcd.print(":");
  lcd.print(sec);
  
}

void CLS(byte S)     // стираю вторую строчку, чтобы когда секунды пойдут на 
{                                  // второй круг, на конце строчки не оставалась 9-ка
if (S==59) {
lcd.setCursor(0,1);
lcd.print("                ");

}
}

void loop()
{
 
 
  LcdPrintTime(H( millis() ),Min( millis() ),sec( millis() ) );
  CLS(sec( millis() ) );

}

Проблема в том, что минуты изменяются не при переходе секунд через 59-0, а когда попало. И функция CLS иногда не срабатывает и 9-ка на конце строки прилепает.

Radjah
Offline
Зарегистрирован: 06.08.2014

if (Min>59) {while(Min>59) Min=Min-59;}

Это что такое и зачем?

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Вот пример из библиотеки rtc ,которая мне понравилась, тут намного проще преобразование. 

DateTime::DateTime (uint32_t t) { // общее количество секунд
    ss = t % 60; // получаем секунды
    t /= 60; //находим общее количество минут
    mm = t % 60; // получаем минуты 
    t /= 60; // находим общее количество часов
    hh = t % 24; // получаем минуты
    uint16_t days = t / 24; // находим количество дней
}

вообще if (Min>59) {while(Min>59) Min=Min-59;} 

должно быть if (Min>59) {Min=Min % 60;} // Остаток от деления на 60

Вот eще пример получения времени из количества секунд - его можно применить даже в ваших функциях

uint32_t datediff = millis()/1000;
int days = datediff / 86400;
int hours = (datediff % 86400) / 3600;
int minutes = ((datediff % 86400) % 3600) / 60;
int seconds = ((datediff % 86400) % 3600) % 60;