Дисплей upTime с помощью `millis()` - Arduino Uno

Я хочу использовать следующую функцию для отображения времени работы MCU, но через несколько часов я получаю ошибку.

void uptime(char *ret_clk)
{
  byte days = 0;
  byte hours = 0;
  byte minutes = 0;
  byte seconds = 0;

  int sec2minutes = 60;
  int sec2hours = (sec2minutes * 60);
  int sec2days = (sec2hours * 24);

  unsigned long time_delta = millis() / 1000UL;

  days = (int)(time_delta / sec2days);
  hours = (int)((time_delta - days * sec2days) / sec2hours);
  minutes = (int)((time_delta - days * sec2days - hours * sec2hours) / sec2minutes);
  seconds = (int)(time_delta - days * sec2days - hours * sec2hours - minutes * sec2minutes);

  sprintf(ret_clk, "%01dd %02d:%02d:%02d", days, hours, minutes, seconds);
}

после 2:55 часов я получил правильный ответ : 0d 02:55:27

также через 4 часа правильный ответ : 0d 04:06:44

но примерно через 12 часов я получаю ошибку: 1d 02:01:27

и примерно через 20 часов я получаю : 2d 23:74:26

Что не так в аптайме ?

, 👍0


2 ответа


Лучший ответ:

1

На 8-битном Arduino int может содержать только значения в диапазоне от -32768 до +32767. Один день стоит секунд 86400, что далеко за пределами этого диапазона.

Вы должны заменить свой sec2... переменные с литералами, возможно, #defined - и не забудьте принудить длину для более длинных значений:

#define SEC2MINUTES 60
#define SEC2HOURS 3600
#define SEC2DAYS 86400UL
,

что такое bennefit, чтобы определить его с помощью "#define"? кто мог бы определить как "долго ожидаемый", чтобы спасти проблему ?, @Guy . D

@Парень.D Если вы помещаете его в переменную и используете эту переменную для вычисления других переменных, с помощью которых вы выполняете свои вычисления, он должен вычислять их каждую отдельную итерацию. Используя #define (или вы можете использовать const unsigned long, если хотите), он вычисляет его во время компиляции (которую я сокращаю, просто вычисляя ее сам)., @Majenko

что может быть причиной получения этого результата: "Время безотказной работы[0d 10:123:33]"? код был исправлен, как вы предложили, @Guy . D


3

Функция millis быстро увеличивается, поэтому она легко превышает максимальное значение int - -32768 до +32767.

Итак, используйте беззнаковые длинные типы данных для millis и других больших вещей.

4 миллиарда и некоторые изменения-это максимальное значение, которое могут хранить беззнаковые длинные типы данных, поэтому не переполняются до 49 дней.

,