Дисплей 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
Что не так в аптайме
?
@Guy . D, 👍0
2 ответа
Лучший ответ:
На 8-битном Arduino int
может содержать только значения в диапазоне от -32768 до +32767. Один день стоит секунд 86400, что далеко за пределами этого диапазона.
Вы должны заменить свой sec2...
переменные с литералами, возможно, #define
d - и не забудьте принудить длину для более длинных значений:
#define SEC2MINUTES 60
#define SEC2HOURS 3600
#define SEC2DAYS 86400UL
Функция millis быстро увеличивается, поэтому она легко превышает максимальное значение int - -32768 до +32767.
Итак, используйте беззнаковые длинные типы данных для millis и других больших вещей.
4 миллиарда и некоторые изменения-это максимальное значение, которое могут хранить беззнаковые длинные типы данных, поэтому не переполняются до 49 дней.
- Как справиться с rollover millis()?
- Использование millis() и micros() внутри процедуры прерывания
- ардуино - миллисекунды ()
- Кнопка с таймером переключения и функцией сброса времени + светодиод обратной связи
- Использовать timer0, не влияя на millis() и micros().
- Торговый автомат Arduino для мониторинга ввода монет в слот во время ожидания ввода пользователя
- Влияет ли `millis()` на длинные ISR?
- nodeMCU — Millis() — Простой счетчик — Как долго горит светодиод?
что такое bennefit, чтобы определить его с помощью "#define"? кто мог бы определить как "долго ожидаемый", чтобы спасти проблему ?, @Guy . D
@Парень.D Если вы помещаете его в переменную и используете эту переменную для вычисления других переменных, с помощью которых вы выполняете свои вычисления, он должен вычислять их каждую отдельную итерацию. Используя #define (или вы можете использовать
const unsigned long
, если хотите), он вычисляет его во время компиляции (которую я сокращаю, просто вычисляя ее сам)., @Majenkoчто может быть причиной получения этого результата: "Время безотказной работы[0d 10:123:33]"? код был исправлен, как вы предложили, @Guy . D